0a147c9e1047f14b1d5be3cc452c548351699eba
[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 #include "csvmodelwriter.h"
7
8 #include <QSortFilterProxyModel>
9 #include <QClipboard>
10 #include <QFileDialog>
11 #include <QMessageBox>
12
13 AddressBookPage::AddressBookPage(Mode mode, Tabs tab, QWidget *parent) :
14     QDialog(parent),
15     ui(new Ui::AddressBookPage),
16     model(0),
17     mode(mode),
18     tab(tab)
19 {
20     ui->setupUi(this);
21
22 #ifdef Q_WS_MAC // Icons on push buttons are very uncommon on Mac
23     ui->newAddressButton->setIcon(QIcon());
24     ui->copyToClipboard->setIcon(QIcon());
25     ui->deleteButton->setIcon(QIcon());
26 #endif
27
28     switch(mode)
29     {
30     case ForSending:
31         connect(ui->tableView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(accept()));
32         ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
33         ui->tableView->setFocus();
34         break;
35     case ForEditing:
36         ui->buttonBox->hide();
37         break;
38     }
39     switch(tab)
40     {
41     case SendingTab:
42         ui->labelExplanation->hide();
43         break;
44     case ReceivingTab:
45         break;
46     }
47     ui->tableView->setTabKeyNavigation(false);
48
49     connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
50 }
51
52 AddressBookPage::~AddressBookPage()
53 {
54     delete ui;
55 }
56
57 void AddressBookPage::setModel(AddressTableModel *model)
58 {
59     this->model = model;
60     if(!model)
61         return;
62     // Refresh list from core
63     model->updateList();
64
65     proxyModel = new QSortFilterProxyModel(this);
66     proxyModel->setSourceModel(model);
67     proxyModel->setDynamicSortFilter(true);
68     switch(tab)
69     {
70     case ReceivingTab:
71         // Receive filter
72         proxyModel->setFilterRole(AddressTableModel::TypeRole);
73         proxyModel->setFilterFixedString(AddressTableModel::Receive);
74         break;
75     case SendingTab:
76         // Send filter
77         proxyModel->setFilterRole(AddressTableModel::TypeRole);
78         proxyModel->setFilterFixedString(AddressTableModel::Send);
79         break;
80     }
81     ui->tableView->setModel(proxyModel);
82     ui->tableView->sortByColumn(0, Qt::AscendingOrder);
83
84     // Set column widths
85     ui->tableView->horizontalHeader()->resizeSection(
86             AddressTableModel::Address, 320);
87     ui->tableView->horizontalHeader()->setResizeMode(
88             AddressTableModel::Label, QHeaderView::Stretch);
89
90     connect(ui->tableView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
91             this, SLOT(selectionChanged()));
92
93     if(mode == ForSending)
94     {
95         // Auto-select first row when in sending mode
96         ui->tableView->selectRow(0);
97     }
98     selectionChanged();
99 }
100
101 void AddressBookPage::on_copyToClipboard_clicked()
102 {
103     // Copy currently selected address to clipboard
104     //   (or nothing, if nothing selected)
105     QTableView *table = ui->tableView;
106     if(!table->selectionModel())
107         return;
108     QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address);
109
110     foreach (QModelIndex index, indexes)
111     {
112         QVariant address = index.data();
113         QApplication::clipboard()->setText(address.toString());
114     }
115 }
116
117 void AddressBookPage::on_newAddressButton_clicked()
118 {
119     if(!model)
120         return;
121     EditAddressDialog dlg(
122             tab == SendingTab ?
123             EditAddressDialog::NewSendingAddress :
124             EditAddressDialog::NewReceivingAddress);
125     dlg.setModel(model);
126     if(dlg.exec())
127     {
128         // Select row for newly created address
129         QString address = dlg.getAddress();
130         QModelIndexList lst = proxyModel->match(proxyModel->index(0,
131                           AddressTableModel::Address, QModelIndex()),
132                           Qt::EditRole, address, 1, Qt::MatchExactly);
133         if(!lst.isEmpty())
134         {
135             ui->tableView->setFocus();
136             ui->tableView->selectRow(lst.at(0).row());
137         }
138     }
139 }
140
141 void AddressBookPage::on_deleteButton_clicked()
142 {
143     QTableView *table = ui->tableView;
144     if(!table->selectionModel())
145         return;
146     QModelIndexList indexes = table->selectionModel()->selectedRows();
147     if(!indexes.isEmpty())
148     {
149         table->model()->removeRow(indexes.at(0).row());
150     }
151 }
152
153 void AddressBookPage::selectionChanged()
154 {
155     // Set button states based on selected tab and selection
156     QTableView *table = ui->tableView;
157     if(!table->selectionModel())
158         return;
159
160     if(table->selectionModel()->hasSelection())
161     {
162         switch(tab)
163         {
164         case SendingTab:
165             ui->deleteButton->setEnabled(true);
166             break;
167         case ReceivingTab:
168             ui->deleteButton->setEnabled(false);
169             break;
170         }
171         ui->copyToClipboard->setEnabled(true);
172     }
173     else
174     {
175         ui->deleteButton->setEnabled(false);
176         ui->copyToClipboard->setEnabled(false);
177     }
178 }
179
180 void AddressBookPage::done(int retval)
181 {
182     QTableView *table = ui->tableView;
183     if(!table->selectionModel() || !table->model())
184         return;
185     // When this is a tab/widget and not a model dialog, ignore "done"
186     if(mode == ForEditing)
187         return;
188
189     // Figure out which address was selected, and return it
190     QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address);
191
192     foreach (QModelIndex index, indexes)
193     {
194         QVariant address = table->model()->data(index);
195         returnValue = address.toString();
196     }
197
198     if(returnValue.isEmpty())
199     {
200         retval = Rejected;
201     }
202
203     QDialog::done(retval);
204 }
205
206 void AddressBookPage::exportClicked()
207 {
208     // CSV is currently the only supported format
209     QString filename = QFileDialog::getSaveFileName(
210             this,
211             tr("Export Address Book Data"),
212             QDir::currentPath(),
213             tr("Comma separated file (*.csv)"));
214
215     if (filename.isNull()) return;
216
217     CSVModelWriter writer(filename);
218
219     // name, column, role
220     writer.setModel(proxyModel);
221     writer.addColumn("Label", AddressTableModel::Label, Qt::EditRole);
222     writer.addColumn("Address", AddressTableModel::Address, Qt::EditRole);
223
224     if(!writer.write())
225     {
226         QMessageBox::critical(this, tr("Error exporting"), tr("Could not write to file %1.").arg(filename),
227                               QMessageBox::Abort, QMessageBox::Abort);
228     }
229 }