Address book: select action (edit/select) based on context
[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
50     /* Send filter */
51     QSortFilterProxyModel *send_model = new QSortFilterProxyModel(this);
52     send_model->setSourceModel(model);
53     send_model->setDynamicSortFilter(true);
54     send_model->setFilterRole(AddressTableModel::TypeRole);
55     send_model->setFilterFixedString(AddressTableModel::Send);
56     ui->sendTableView->setModel(send_model);
57
58     /* Set column widths */
59     ui->receiveTableView->horizontalHeader()->resizeSection(
60             AddressTableModel::Address, 320);
61     ui->receiveTableView->horizontalHeader()->setResizeMode(
62             AddressTableModel::Label, QHeaderView::Stretch);
63     ui->sendTableView->horizontalHeader()->resizeSection(
64             AddressTableModel::Address, 320);
65     ui->sendTableView->horizontalHeader()->setResizeMode(
66             AddressTableModel::Label, QHeaderView::Stretch);
67 }
68
69 void AddressBookDialog::setTab(int tab)
70 {
71     ui->tabWidget->setCurrentIndex(tab);
72 }
73
74 QTableView *AddressBookDialog::getCurrentTable()
75 {
76     switch(ui->tabWidget->currentIndex())
77     {
78     case SendingTab:
79         return ui->sendTableView;
80     case ReceivingTab:
81         return ui->receiveTableView;
82     default:
83         return 0;
84     }
85 }
86
87 void AddressBookDialog::on_copyToClipboard_clicked()
88 {
89     /* Copy currently selected address to clipboard
90        (or nothing, if nothing selected)
91      */
92     QTableView *table = getCurrentTable();
93     QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address);
94
95     foreach (QModelIndex index, indexes)
96     {
97         QVariant address = index.data();
98         QApplication::clipboard()->setText(address.toString());
99     }
100 }
101
102 void AddressBookDialog::on_editButton_clicked()
103 {
104     QModelIndexList indexes = getCurrentTable()->selectionModel()->selectedRows();
105     if(indexes.isEmpty())
106     {
107         return;
108     }
109     /* Map selected index to source address book model */
110     QAbstractProxyModel *proxy_model = static_cast<QAbstractProxyModel*>(getCurrentTable()->model());
111     QModelIndex selected = proxy_model->mapToSource(indexes.at(0));
112
113     /* Double click also triggers edit button */
114     EditAddressDialog dlg(
115             ui->tabWidget->currentIndex() == SendingTab ?
116             EditAddressDialog::EditSendingAddress :
117             EditAddressDialog::EditReceivingAddress);
118     dlg.setModel(model);
119     dlg.loadRow(selected.row());
120     if(dlg.exec())
121     {
122         dlg.saveCurrentRow();
123     }
124 }
125
126 void AddressBookDialog::on_newAddressButton_clicked()
127 {
128     EditAddressDialog dlg(
129             ui->tabWidget->currentIndex() == SendingTab ?
130             EditAddressDialog::NewSendingAddress :
131             EditAddressDialog::NewReceivingAddress);
132     dlg.setModel(model);
133     if(dlg.exec())
134     {
135         dlg.saveCurrentRow();
136     }
137 }
138
139 void AddressBookDialog::on_tabWidget_currentChanged(int index)
140 {
141     // Enable/disable buttons based on selected tab
142     switch(index)
143     {
144     case SendingTab:
145         ui->deleteButton->setEnabled(true);
146         break;
147     case ReceivingTab:
148         ui->deleteButton->setEnabled(false);
149         break;
150     }
151 }
152
153 void AddressBookDialog::on_deleteButton_clicked()
154 {
155     QTableView *table = getCurrentTable();
156     QModelIndexList indexes = table->selectionModel()->selectedRows();
157     if(!indexes.isEmpty())
158     {
159         table->model()->removeRow(indexes.at(0).row());
160     }
161 }
162
163 void AddressBookDialog::on_buttonBox_accepted()
164 {
165     QTableView *table = getCurrentTable();
166     QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address);
167
168     foreach (QModelIndex index, indexes)
169     {
170         QVariant address = table->model()->data(index);
171         returnValue = address.toString();
172     }
173     if(!returnValue.isEmpty())
174     {
175         accept();
176     }
177     else
178     {
179         reject();
180     }
181 }
182