Add context menu on transaction list: copy label, copy address, edit label, show...
[novacoin.git] / src / qt / addressbookpage.cpp
1 #include "addressbookpage.h"
2 #include "ui_addressbookpage.h"
3
4 #include "addresstablemodel.h"
5 #include "editaddressdialog.h"
6
7 #include <QSortFilterProxyModel>
8 #include <QClipboard>
9 #include <QDebug>
10
11 AddressBookPage::AddressBookPage(Mode mode, Tabs tab, QWidget *parent) :
12     QDialog(parent),
13     ui(new Ui::AddressBookPage),
14     model(0),
15     mode(mode),
16     tab(tab)
17 {
18     ui->setupUi(this);
19     switch(mode)
20     {
21     case ForSending:
22         connect(ui->tableView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(accept()));
23         ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
24         ui->tableView->setFocus();
25         break;
26     case ForEditing:
27         ui->buttonBox->hide();
28         break;
29     }
30     switch(tab)
31     {
32     case SendingTab:
33         ui->labelExplanation->hide();
34         break;
35     case ReceivingTab:
36         break;
37     }
38     ui->tableView->setTabKeyNavigation(false);
39
40     connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
41 }
42
43 AddressBookPage::~AddressBookPage()
44 {
45     delete ui;
46 }
47
48 void AddressBookPage::setModel(AddressTableModel *model)
49 {
50     this->model = model;
51     // Refresh list from core
52     model->updateList();
53
54     switch(tab)
55     {
56     case ReceivingTab: {
57         // Receive filter
58         QSortFilterProxyModel *receive_model = new QSortFilterProxyModel(this);
59         receive_model->setSourceModel(model);
60         receive_model->setDynamicSortFilter(true);
61         receive_model->setFilterRole(AddressTableModel::TypeRole);
62         receive_model->setFilterFixedString(AddressTableModel::Receive);
63         ui->tableView->setModel(receive_model);
64         ui->tableView->sortByColumn(0, Qt::AscendingOrder);
65         } break;
66     case SendingTab: {
67         // Send filter
68         QSortFilterProxyModel *send_model = new QSortFilterProxyModel(this);
69         send_model->setSourceModel(model);
70         send_model->setDynamicSortFilter(true);
71         send_model->setFilterRole(AddressTableModel::TypeRole);
72         send_model->setFilterFixedString(AddressTableModel::Send);
73         ui->tableView->setModel(send_model);
74         ui->tableView->sortByColumn(0, Qt::AscendingOrder);
75         } break;
76     }
77
78     // Set column widths
79     ui->tableView->horizontalHeader()->resizeSection(
80             AddressTableModel::Address, 320);
81     ui->tableView->horizontalHeader()->setResizeMode(
82             AddressTableModel::Label, QHeaderView::Stretch);
83
84     connect(ui->tableView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
85             this, SLOT(selectionChanged()));
86
87     if(mode == ForSending)
88     {
89         // Auto-select first row when in sending mode
90         ui->tableView->selectRow(0);
91     }
92     selectionChanged();
93 }
94
95 QTableView *AddressBookPage::getCurrentTable()
96 {
97     return ui->tableView;
98 }
99
100 void AddressBookPage::on_copyToClipboard_clicked()
101 {
102     // Copy currently selected address to clipboard
103     //   (or nothing, if nothing selected)
104     QTableView *table = getCurrentTable();
105     QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address);
106
107     foreach (QModelIndex index, indexes)
108     {
109         QVariant address = index.data();
110         QApplication::clipboard()->setText(address.toString());
111     }
112 }
113
114 void AddressBookPage::on_newAddressButton_clicked()
115 {
116     EditAddressDialog dlg(
117             tab == SendingTab ?
118             EditAddressDialog::NewSendingAddress :
119             EditAddressDialog::NewReceivingAddress);
120     dlg.setModel(model);
121     dlg.exec();
122 }
123
124 void AddressBookPage::on_deleteButton_clicked()
125 {
126     QTableView *table = getCurrentTable();
127     QModelIndexList indexes = table->selectionModel()->selectedRows();
128     if(!indexes.isEmpty())
129     {
130         table->model()->removeRow(indexes.at(0).row());
131     }
132 }
133
134 void AddressBookPage::selectionChanged()
135 {
136     // Set button states based on selected tab and selection
137     QTableView *table = getCurrentTable();
138
139     if(table->selectionModel()->hasSelection())
140     {
141         switch(tab)
142         {
143         case SendingTab:
144             ui->deleteButton->setEnabled(true);
145             break;
146         case ReceivingTab:
147             ui->deleteButton->setEnabled(false);
148             break;
149         }
150         ui->copyToClipboard->setEnabled(true);
151     }
152     else
153     {
154         ui->deleteButton->setEnabled(false);
155         ui->copyToClipboard->setEnabled(false);
156     }
157 }
158
159 void AddressBookPage::done(int retval)
160 {
161     // When this is a tab/widget and not a model dialog, ignore "done"
162     if(mode == ForEditing)
163         return;
164
165     // Figure out which address was selected, and return it
166     QTableView *table = getCurrentTable();
167     QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address);
168
169     foreach (QModelIndex index, indexes)
170     {
171         QVariant address = table->model()->data(index);
172         returnValue = address.toString();
173     }
174
175     if(returnValue.isEmpty())
176     {
177         retval = Rejected;
178     }
179
180     QDialog::done(retval);
181 }