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