Improved Mac experience; QDoubleSpinBox for BitcoinAmountField
[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     // Refresh list from core
61     model->updateList();
62
63     proxyModel = new QSortFilterProxyModel(this);
64     proxyModel->setSourceModel(model);
65     proxyModel->setDynamicSortFilter(true);
66     switch(tab)
67     {
68     case ReceivingTab:
69         // Receive filter
70         proxyModel->setFilterRole(AddressTableModel::TypeRole);
71         proxyModel->setFilterFixedString(AddressTableModel::Receive);
72         break;
73     case SendingTab:
74         // Send filter
75         proxyModel->setFilterRole(AddressTableModel::TypeRole);
76         proxyModel->setFilterFixedString(AddressTableModel::Send);
77         break;
78     }
79     ui->tableView->setModel(proxyModel);
80     ui->tableView->sortByColumn(0, Qt::AscendingOrder);
81
82     // Set column widths
83     ui->tableView->horizontalHeader()->resizeSection(
84             AddressTableModel::Address, 320);
85     ui->tableView->horizontalHeader()->setResizeMode(
86             AddressTableModel::Label, QHeaderView::Stretch);
87
88     connect(ui->tableView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
89             this, SLOT(selectionChanged()));
90
91     if(mode == ForSending)
92     {
93         // Auto-select first row when in sending mode
94         ui->tableView->selectRow(0);
95     }
96     selectionChanged();
97 }
98
99 QTableView *AddressBookPage::getCurrentTable()
100 {
101     return ui->tableView;
102 }
103
104 void AddressBookPage::on_copyToClipboard_clicked()
105 {
106     // Copy currently selected address to clipboard
107     //   (or nothing, if nothing selected)
108     QTableView *table = getCurrentTable();
109     QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address);
110
111     foreach (QModelIndex index, indexes)
112     {
113         QVariant address = index.data();
114         QApplication::clipboard()->setText(address.toString());
115     }
116 }
117
118 void AddressBookPage::on_newAddressButton_clicked()
119 {
120     EditAddressDialog dlg(
121             tab == SendingTab ?
122             EditAddressDialog::NewSendingAddress :
123             EditAddressDialog::NewReceivingAddress);
124     dlg.setModel(model);
125     if(dlg.exec())
126     {
127         // Select row for newly created address
128         QString address = dlg.getAddress();
129         QModelIndexList lst = proxyModel->match(proxyModel->index(0,
130                           AddressTableModel::Address, QModelIndex()),
131                           Qt::EditRole, address, 1, Qt::MatchExactly);
132         if(!lst.isEmpty())
133         {
134             ui->tableView->setFocus();
135             ui->tableView->selectRow(lst.at(0).row());
136         }
137     }
138 }
139
140 void AddressBookPage::on_deleteButton_clicked()
141 {
142     QTableView *table = getCurrentTable();
143     QModelIndexList indexes = table->selectionModel()->selectedRows();
144     if(!indexes.isEmpty())
145     {
146         table->model()->removeRow(indexes.at(0).row());
147     }
148 }
149
150 void AddressBookPage::selectionChanged()
151 {
152     // Set button states based on selected tab and selection
153     QTableView *table = getCurrentTable();
154
155     if(table->selectionModel()->hasSelection())
156     {
157         switch(tab)
158         {
159         case SendingTab:
160             ui->deleteButton->setEnabled(true);
161             break;
162         case ReceivingTab:
163             ui->deleteButton->setEnabled(false);
164             break;
165         }
166         ui->copyToClipboard->setEnabled(true);
167     }
168     else
169     {
170         ui->deleteButton->setEnabled(false);
171         ui->copyToClipboard->setEnabled(false);
172     }
173 }
174
175 void AddressBookPage::done(int retval)
176 {
177     // When this is a tab/widget and not a model dialog, ignore "done"
178     if(mode == ForEditing)
179         return;
180
181     // Figure out which address was selected, and return it
182     QTableView *table = getCurrentTable();
183     QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address);
184
185     foreach (QModelIndex index, indexes)
186     {
187         QVariant address = table->model()->data(index);
188         returnValue = address.toString();
189     }
190
191     if(returnValue.isEmpty())
192     {
193         retval = Rejected;
194     }
195
196     QDialog::done(retval);
197 }
198
199 void AddressBookPage::exportClicked()
200 {
201     // CSV is currently the only supported format
202     QString filename = QFileDialog::getSaveFileName(
203             this,
204             tr("Export Address Book Data"),
205             QDir::currentPath(),
206             tr("Comma separated file (*.csv)"));
207
208     if (filename.isNull()) return;
209
210     CSVModelWriter writer(filename);
211
212     // name, column, role
213     writer.setModel(proxyModel);
214     writer.addColumn("Label", AddressTableModel::Label, Qt::EditRole);
215     writer.addColumn("Address", AddressTableModel::Address, Qt::EditRole);
216
217     if(!writer.write())
218     {
219         QMessageBox::critical(this, tr("Error exporting"), tr("Could not write to file %1.").arg(filename),
220                               QMessageBox::Abort, QMessageBox::Abort);
221     }
222 }