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