editaddressdialog.cpp raw
1 // Copyright (c) 2011-present The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5 #include <qt/editaddressdialog.h>
6 #include <qt/forms/ui_editaddressdialog.h>
7
8 #include <qt/addresstablemodel.h>
9 #include <qt/guiutil.h>
10
11 #include <wallet/types.h>
12
13 #include <QDataWidgetMapper>
14 #include <QMessageBox>
15
16
17 EditAddressDialog::EditAddressDialog(Mode _mode, QWidget* parent)
18 : QDialog(parent, GUIUtil::dialog_flags),
19 ui(new Ui::EditAddressDialog),
20 mode(_mode)
21 {
22 ui->setupUi(this);
23
24 GUIUtil::setupAddressWidget(ui->addressEdit, this);
25
26 switch(mode)
27 {
28 case NewSendingAddress:
29 setWindowTitle(tr("New sending address"));
30 break;
31 case EditReceivingAddress:
32 setWindowTitle(tr("Edit receiving address"));
33 ui->addressEdit->setEnabled(false);
34 break;
35 case EditSendingAddress:
36 setWindowTitle(tr("Edit sending address"));
37 break;
38 }
39
40 mapper = new QDataWidgetMapper(this);
41 mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);
42
43 GUIUtil::ItemDelegate* delegate = new GUIUtil::ItemDelegate(mapper);
44 connect(delegate, &GUIUtil::ItemDelegate::keyEscapePressed, this, &EditAddressDialog::reject);
45 mapper->setItemDelegate(delegate);
46
47 GUIUtil::handleCloseWindowShortcut(this);
48 }
49
50 EditAddressDialog::~EditAddressDialog()
51 {
52 delete ui;
53 }
54
55 void EditAddressDialog::setModel(AddressTableModel *_model)
56 {
57 this->model = _model;
58 if(!_model)
59 return;
60
61 mapper->setModel(_model);
62 mapper->addMapping(ui->labelEdit, AddressTableModel::Label);
63 mapper->addMapping(ui->addressEdit, AddressTableModel::Address);
64 }
65
66 void EditAddressDialog::loadRow(int row)
67 {
68 mapper->setCurrentIndex(row);
69 }
70
71 bool EditAddressDialog::saveCurrentRow()
72 {
73 if(!model)
74 return false;
75
76 switch(mode)
77 {
78 case NewSendingAddress:
79 address = model->addRow(
80 AddressTableModel::Send,
81 ui->labelEdit->text(),
82 ui->addressEdit->text(),
83 model->GetDefaultAddressType());
84 break;
85 case EditReceivingAddress:
86 case EditSendingAddress:
87 if(mapper->submit())
88 {
89 address = ui->addressEdit->text();
90 }
91 break;
92 }
93 return !address.isEmpty();
94 }
95
96 void EditAddressDialog::accept()
97 {
98 if(!model)
99 return;
100
101 if(!saveCurrentRow())
102 {
103 switch(model->getEditStatus())
104 {
105 case AddressTableModel::OK:
106 // Failed with unknown reason. Just reject.
107 break;
108 case AddressTableModel::NO_CHANGES:
109 // No changes were made during edit operation. Just reject.
110 break;
111 case AddressTableModel::INVALID_ADDRESS:
112 QMessageBox::warning(this, windowTitle(),
113 tr("The entered address \"%1\" is not a valid Bitcoin address.").arg(ui->addressEdit->text()),
114 QMessageBox::Ok, QMessageBox::Ok);
115 break;
116 case AddressTableModel::DUPLICATE_ADDRESS:
117 QMessageBox::warning(this, windowTitle(),
118 getDuplicateAddressWarning(),
119 QMessageBox::Ok, QMessageBox::Ok);
120 break;
121 case AddressTableModel::WALLET_UNLOCK_FAILURE:
122 QMessageBox::critical(this, windowTitle(),
123 tr("Could not unlock wallet."),
124 QMessageBox::Ok, QMessageBox::Ok);
125 break;
126 case AddressTableModel::KEY_GENERATION_FAILURE:
127 QMessageBox::critical(this, windowTitle(),
128 tr("New key generation failed."),
129 QMessageBox::Ok, QMessageBox::Ok);
130 break;
131
132 }
133 return;
134 }
135 QDialog::accept();
136 }
137
138 QString EditAddressDialog::getDuplicateAddressWarning() const
139 {
140 QString dup_address = ui->addressEdit->text();
141 QString existing_label = model->labelForAddress(dup_address);
142 auto existing_purpose = model->purposeForAddress(dup_address);
143
144 if (existing_purpose == wallet::AddressPurpose::RECEIVE &&
145 (mode == NewSendingAddress || mode == EditSendingAddress)) {
146 return tr(
147 "Address \"%1\" already exists as a receiving address with label "
148 "\"%2\" and so cannot be added as a sending address."
149 ).arg(dup_address).arg(existing_label);
150 }
151 return tr(
152 "The entered address \"%1\" is already in the address book with "
153 "label \"%2\"."
154 ).arg(dup_address).arg(existing_label);
155 }
156
157 QString EditAddressDialog::getAddress() const
158 {
159 return address;
160 }
161
162 void EditAddressDialog::setAddress(const QString &_address)
163 {
164 this->address = _address;
165 ui->addressEdit->setText(_address);
166 }
167