ui improvements: allow inline editing of labels/addresses in address book table,...
[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     mode(mode)
16 {
17     ui->setupUi(this);
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         ui->sendTableView->setFocus();
24         break;
25     }
26 }
27
28 AddressBookDialog::~AddressBookDialog()
29 {
30     delete ui;
31 }
32
33 void AddressBookDialog::setModel(AddressTableModel *model)
34 {
35     this->model = model;
36     // Refresh list from core
37     model->updateList();
38
39     // Receive filter
40     QSortFilterProxyModel *receive_model = new QSortFilterProxyModel(this);
41     receive_model->setSourceModel(model);
42     receive_model->setDynamicSortFilter(true);
43     receive_model->setFilterRole(AddressTableModel::TypeRole);
44     receive_model->setFilterFixedString(AddressTableModel::Receive);
45     ui->receiveTableView->setModel(receive_model);
46     ui->receiveTableView->sortByColumn(0, Qt::AscendingOrder);
47
48     // Send filter
49     QSortFilterProxyModel *send_model = new QSortFilterProxyModel(this);
50     send_model->setSourceModel(model);
51     send_model->setDynamicSortFilter(true);
52     send_model->setFilterRole(AddressTableModel::TypeRole);
53     send_model->setFilterFixedString(AddressTableModel::Send);
54     ui->sendTableView->setModel(send_model);
55     ui->sendTableView->sortByColumn(0, Qt::AscendingOrder);
56
57     // Set column widths
58     ui->receiveTableView->horizontalHeader()->resizeSection(
59             AddressTableModel::Address, 320);
60     ui->receiveTableView->horizontalHeader()->setResizeMode(
61             AddressTableModel::Label, QHeaderView::Stretch);
62     ui->sendTableView->horizontalHeader()->resizeSection(
63             AddressTableModel::Address, 320);
64     ui->sendTableView->horizontalHeader()->setResizeMode(
65             AddressTableModel::Label, QHeaderView::Stretch);
66
67     if(mode == ForSending)
68     {
69         // Auto-select first row when in sending mode
70         ui->sendTableView->selectRow(0);
71     }
72 }
73
74 void AddressBookDialog::setTab(int tab)
75 {
76     ui->tabWidget->setCurrentIndex(tab);
77     on_tabWidget_currentChanged(tab);
78 }
79
80 QTableView *AddressBookDialog::getCurrentTable()
81 {
82     switch(ui->tabWidget->currentIndex())
83     {
84     case SendingTab:
85         return ui->sendTableView;
86     case ReceivingTab:
87         return ui->receiveTableView;
88     default:
89         return 0;
90     }
91 }
92
93 void AddressBookDialog::on_copyToClipboard_clicked()
94 {
95     // Copy currently selected address to clipboard
96     //   (or nothing, if nothing selected)
97     QTableView *table = getCurrentTable();
98     QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address);
99
100     foreach (QModelIndex index, indexes)
101     {
102         QVariant address = index.data();
103         QApplication::clipboard()->setText(address.toString());
104     }
105 }
106
107 void AddressBookDialog::on_editButton_clicked()
108 {
109     QModelIndexList indexes = getCurrentTable()->selectionModel()->selectedRows();
110     if(indexes.isEmpty())
111     {
112         return;
113     }
114     // Map selected index to source address book model
115     QAbstractProxyModel *proxy_model = static_cast<QAbstractProxyModel*>(getCurrentTable()->model());
116     QModelIndex selected = proxy_model->mapToSource(indexes.at(0));
117
118     // Double click also triggers edit button
119     EditAddressDialog dlg(
120             ui->tabWidget->currentIndex() == SendingTab ?
121             EditAddressDialog::EditSendingAddress :
122             EditAddressDialog::EditReceivingAddress);
123     dlg.setModel(model);
124     dlg.loadRow(selected.row());
125     dlg.exec();
126 }
127
128 void AddressBookDialog::on_newAddressButton_clicked()
129 {
130     EditAddressDialog dlg(
131             ui->tabWidget->currentIndex() == SendingTab ?
132             EditAddressDialog::NewSendingAddress :
133             EditAddressDialog::NewReceivingAddress);
134     dlg.setModel(model);
135     dlg.exec();
136 }
137
138 void AddressBookDialog::on_tabWidget_currentChanged(int index)
139 {
140     // Enable/disable buttons based on selected tab
141     switch(index)
142     {
143     case SendingTab:
144         ui->deleteButton->setEnabled(true);
145         break;
146     case ReceivingTab:
147         ui->deleteButton->setEnabled(false);
148         break;
149     }
150 }
151
152 void AddressBookDialog::on_deleteButton_clicked()
153 {
154     QTableView *table = getCurrentTable();
155     QModelIndexList indexes = table->selectionModel()->selectedRows();
156     if(!indexes.isEmpty())
157     {
158         table->model()->removeRow(indexes.at(0).row());
159     }
160 }
161
162 void AddressBookDialog::on_buttonBox_accepted()
163 {
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     if(!returnValue.isEmpty())
173     {
174         accept();
175     }
176     else
177     {
178         reject();
179     }
180 }
181