Do not select first address automatically in the address book
[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 #include "guiutil.h"
8
9 #include <QSortFilterProxyModel>
10 #include <QClipboard>
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     selectionChanged();
94 }
95
96 void AddressBookPage::on_copyToClipboard_clicked()
97 {
98     // Copy currently selected address to clipboard
99     //   (or nothing, if nothing selected)
100     QTableView *table = ui->tableView;
101     if(!table->selectionModel())
102         return;
103     QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address);
104
105     foreach (QModelIndex index, indexes)
106     {
107         QVariant address = index.data();
108         QApplication::clipboard()->setText(address.toString());
109     }
110 }
111
112 void AddressBookPage::on_newAddressButton_clicked()
113 {
114     if(!model)
115         return;
116     EditAddressDialog dlg(
117             tab == SendingTab ?
118             EditAddressDialog::NewSendingAddress :
119             EditAddressDialog::NewReceivingAddress);
120     dlg.setModel(model);
121     if(dlg.exec())
122     {
123         // Select row for newly created address
124         QString address = dlg.getAddress();
125         QModelIndexList lst = proxyModel->match(proxyModel->index(0,
126                           AddressTableModel::Address, QModelIndex()),
127                           Qt::EditRole, address, 1, Qt::MatchExactly);
128         if(!lst.isEmpty())
129         {
130             ui->tableView->setFocus();
131             ui->tableView->selectRow(lst.at(0).row());
132         }
133     }
134 }
135
136 void AddressBookPage::on_deleteButton_clicked()
137 {
138     QTableView *table = ui->tableView;
139     if(!table->selectionModel())
140         return;
141     QModelIndexList indexes = table->selectionModel()->selectedRows();
142     if(!indexes.isEmpty())
143     {
144         table->model()->removeRow(indexes.at(0).row());
145     }
146 }
147
148 void AddressBookPage::selectionChanged()
149 {
150     // Set button states based on selected tab and selection
151     QTableView *table = ui->tableView;
152     if(!table->selectionModel())
153         return;
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     QTableView *table = ui->tableView;
178     if(!table->selectionModel() || !table->model())
179         return;
180     // When this is a tab/widget and not a model dialog, ignore "done"
181     if(mode == ForEditing)
182         return;
183
184     // Figure out which address was selected, and return it
185     QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address);
186
187     foreach (QModelIndex index, indexes)
188     {
189         QVariant address = table->model()->data(index);
190         returnValue = address.toString();
191     }
192
193     if(returnValue.isEmpty())
194     {
195         retval = Rejected;
196     }
197
198     QDialog::done(retval);
199 }
200
201 void AddressBookPage::exportClicked()
202 {
203     // CSV is currently the only supported format
204     QString filename = GUIUtil::getSaveFileName(
205             this,
206             tr("Export Address Book Data"), QString(),
207             tr("Comma separated file (*.csv)"));
208
209     if (filename.isNull()) return;
210
211     CSVModelWriter writer(filename);
212
213     // name, column, role
214     writer.setModel(proxyModel);
215     writer.addColumn("Label", AddressTableModel::Label, Qt::EditRole);
216     writer.addColumn("Address", AddressTableModel::Address, Qt::EditRole);
217
218     if(!writer.write())
219     {
220         QMessageBox::critical(this, tr("Error exporting"), tr("Could not write to file %1.").arg(filename),
221                               QMessageBox::Abort, QMessageBox::Abort);
222     }
223 }