Check addresses in address book for validity
[novacoin.git] / src / qt / addressbookdialog.cpp
1 #include "addressbookdialog.h"
2 #include "ui_addressbookdialog.h"
3
4 #include "addresstablemodel.h"
5 #include "editaddressdialog.h"
6
7 #include <QSortFilterProxyModel>
8 #include <QClipboard>
9 #include <QDebug>
10
11 AddressBookDialog::AddressBookDialog(Mode mode, QWidget *parent) :
12     QDialog(parent),
13     ui(new Ui::AddressBookDialog),
14     model(0)
15 {
16     ui->setupUi(this);
17
18     switch(mode)
19     {
20     case ForSending:
21         connect(ui->receiveTableView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(on_buttonBox_accepted()));
22         connect(ui->sendTableView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(on_buttonBox_accepted()));
23         break;
24     case ForEditing:
25         connect(ui->receiveTableView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(on_editButton_clicked()));
26         connect(ui->sendTableView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(on_editButton_clicked()));
27         break;
28     }
29 }
30
31 AddressBookDialog::~AddressBookDialog()
32 {
33     delete ui;
34 }
35
36 void AddressBookDialog::setModel(AddressTableModel *model)
37 {
38     this->model = model;
39     // Refresh list from core
40     model->updateList();
41
42     // Receive filter
43     QSortFilterProxyModel *receive_model = new QSortFilterProxyModel(this);
44     receive_model->setSourceModel(model);
45     receive_model->setDynamicSortFilter(true);
46     receive_model->setFilterRole(AddressTableModel::TypeRole);
47     receive_model->setFilterFixedString(AddressTableModel::Receive);
48     ui->receiveTableView->setModel(receive_model);
49     ui->receiveTableView->sortByColumn(0, Qt::AscendingOrder);
50
51     // Send filter
52     QSortFilterProxyModel *send_model = new QSortFilterProxyModel(this);
53     send_model->setSourceModel(model);
54     send_model->setDynamicSortFilter(true);
55     send_model->setFilterRole(AddressTableModel::TypeRole);
56     send_model->setFilterFixedString(AddressTableModel::Send);
57     ui->sendTableView->setModel(send_model);
58     ui->sendTableView->sortByColumn(0, Qt::AscendingOrder);
59
60     // Set column widths
61     ui->receiveTableView->horizontalHeader()->resizeSection(
62             AddressTableModel::Address, 320);
63     ui->receiveTableView->horizontalHeader()->setResizeMode(
64             AddressTableModel::Label, QHeaderView::Stretch);
65     ui->sendTableView->horizontalHeader()->resizeSection(
66             AddressTableModel::Address, 320);
67     ui->sendTableView->horizontalHeader()->setResizeMode(
68             AddressTableModel::Label, QHeaderView::Stretch);
69 }
70
71 void AddressBookDialog::setTab(int tab)
72 {
73     ui->tabWidget->setCurrentIndex(tab);
74     on_tabWidget_currentChanged(tab);
75 }
76
77 QTableView *AddressBookDialog::getCurrentTable()
78 {
79     switch(ui->tabWidget->currentIndex())
80     {
81     case SendingTab:
82         return ui->sendTableView;
83     case ReceivingTab:
84         return ui->receiveTableView;
85     default:
86         return 0;
87     }
88 }
89
90 void AddressBookDialog::on_copyToClipboard_clicked()
91 {
92     // Copy currently selected address to clipboard
93     //   (or nothing, if nothing selected)
94     QTableView *table = getCurrentTable();
95     QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address);
96
97     foreach (QModelIndex index, indexes)
98     {
99         QVariant address = index.data();
100         QApplication::clipboard()->setText(address.toString());
101     }
102 }
103
104 void AddressBookDialog::on_editButton_clicked()
105 {
106     QModelIndexList indexes = getCurrentTable()->selectionModel()->selectedRows();
107     if(indexes.isEmpty())
108     {
109         return;
110     }
111     // Map selected index to source address book model
112     QAbstractProxyModel *proxy_model = static_cast<QAbstractProxyModel*>(getCurrentTable()->model());
113     QModelIndex selected = proxy_model->mapToSource(indexes.at(0));
114
115     // Double click also triggers edit button
116     EditAddressDialog dlg(
117             ui->tabWidget->currentIndex() == SendingTab ?
118             EditAddressDialog::EditSendingAddress :
119             EditAddressDialog::EditReceivingAddress);
120     dlg.setModel(model);
121     dlg.loadRow(selected.row());
122     dlg.exec();
123 }
124
125 void AddressBookDialog::on_newAddressButton_clicked()
126 {
127     EditAddressDialog dlg(
128             ui->tabWidget->currentIndex() == SendingTab ?
129             EditAddressDialog::NewSendingAddress :
130             EditAddressDialog::NewReceivingAddress);
131     dlg.setModel(model);
132     dlg.exec();
133 }
134
135 void AddressBookDialog::on_tabWidget_currentChanged(int index)
136 {
137     // Enable/disable buttons based on selected tab
138     switch(index)
139     {
140     case SendingTab:
141         ui->deleteButton->setEnabled(true);
142         break;
143     case ReceivingTab:
144         ui->deleteButton->setEnabled(false);
145         break;
146     }
147 }
148
149 void AddressBookDialog::on_deleteButton_clicked()
150 {
151     QTableView *table = getCurrentTable();
152     QModelIndexList indexes = table->selectionModel()->selectedRows();
153     if(!indexes.isEmpty())
154     {
155         table->model()->removeRow(indexes.at(0).row());
156     }
157 }
158
159 void AddressBookDialog::on_buttonBox_accepted()
160 {
161     QTableView *table = getCurrentTable();
162     QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address);
163
164     foreach (QModelIndex index, indexes)
165     {
166         QVariant address = table->model()->data(index);
167         returnValue = address.toString();
168     }
169     if(!returnValue.isEmpty())
170     {
171         accept();
172     }
173     else
174     {
175         reject();
176     }
177 }
178