add export functionality for address book / receiving addresses
[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     dlg.exec();
120 }
121
122 void AddressBookPage::on_deleteButton_clicked()
123 {
124     QTableView *table = getCurrentTable();
125     QModelIndexList indexes = table->selectionModel()->selectedRows();
126     if(!indexes.isEmpty())
127     {
128         table->model()->removeRow(indexes.at(0).row());
129     }
130 }
131
132 void AddressBookPage::selectionChanged()
133 {
134     // Set button states based on selected tab and selection
135     QTableView *table = getCurrentTable();
136
137     if(table->selectionModel()->hasSelection())
138     {
139         switch(tab)
140         {
141         case SendingTab:
142             ui->deleteButton->setEnabled(true);
143             break;
144         case ReceivingTab:
145             ui->deleteButton->setEnabled(false);
146             break;
147         }
148         ui->copyToClipboard->setEnabled(true);
149     }
150     else
151     {
152         ui->deleteButton->setEnabled(false);
153         ui->copyToClipboard->setEnabled(false);
154     }
155 }
156
157 void AddressBookPage::done(int retval)
158 {
159     // When this is a tab/widget and not a model dialog, ignore "done"
160     if(mode == ForEditing)
161         return;
162
163     // Figure out which address was selected, and return it
164     QTableView *table = getCurrentTable();
165     QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address);
166
167     foreach (QModelIndex index, indexes)
168     {
169         QVariant address = table->model()->data(index);
170         returnValue = address.toString();
171     }
172
173     if(returnValue.isEmpty())
174     {
175         retval = Rejected;
176     }
177
178     QDialog::done(retval);
179 }
180
181 void AddressBookPage::exportClicked()
182 {
183     // CSV is currently the only supported format
184     QString filename = QFileDialog::getSaveFileName(
185             this,
186             tr("Export Address Book Data"),
187             QDir::currentPath(),
188             tr("Comma separated file (*.csv)"));
189
190     CSVModelWriter writer(filename);
191
192     // name, column, role
193     writer.setModel(proxyModel);
194     writer.addColumn("Label", AddressTableModel::Label, Qt::EditRole);
195     writer.addColumn("Address", AddressTableModel::Address, Qt::EditRole);
196
197     if(!writer.write())
198     {
199         QMessageBox::critical(this, tr("Error exporting"), tr("Could not write to file %1.").arg(filename),
200                               QMessageBox::Abort, QMessageBox::Abort);
201     }
202 }