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