editaddressdialog.cpp raw
1 // Copyright (c) 2011-2021 The Limenka 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 ui->addressEdit->setEnabled(false);
38 break;
39 }
40
41 mapper = new QDataWidgetMapper(this);
42 mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);
43
44 GUIUtil::ItemDelegate* delegate = new GUIUtil::ItemDelegate(mapper);
45 connect(delegate, &GUIUtil::ItemDelegate::keyEscapePressed, this, &EditAddressDialog::reject);
46 mapper->setItemDelegate(delegate);
47
48 GUIUtil::handleCloseWindowShortcut(this);
49 }
50
51 EditAddressDialog::~EditAddressDialog()
52 {
53 delete ui;
54 }
55
56 void EditAddressDialog::setModel(AddressTableModel *_model)
57 {
58 this->model = _model;
59 if(!_model)
60 return;
61
62 mapper->setModel(_model);
63 mapper->addMapping(ui->labelEdit, AddressTableModel::Label);
64 mapper->addMapping(ui->addressEdit, AddressTableModel::Address);
65 }
66
67 void EditAddressDialog::loadRow(int row)
68 {
69 mapper->setCurrentIndex(row);
70 }
71
72 bool EditAddressDialog::saveCurrentRow()
73 {
74 if(!model)
75 return false;
76
77 switch(mode)
78 {
79 case NewSendingAddress:
80 address = model->addRow(
81 AddressTableModel::Send,
82 ui->labelEdit->text(),
83 ui->addressEdit->text(),
84 model->GetDefaultAddressType());
85 break;
86 case EditReceivingAddress:
87 case EditSendingAddress:
88 if(mapper->submit())
89 {
90 address = ui->addressEdit->text();
91 }
92 break;
93 }
94 return !address.isEmpty();
95 }
96
97 void EditAddressDialog::accept()
98 {
99 if(!model)
100 return;
101
102 if(!saveCurrentRow())
103 {
104 switch(model->getEditStatus())
105 {
106 case AddressTableModel::OK:
107 // Failed with unknown reason. Just reject.
108 break;
109 case AddressTableModel::NO_CHANGES:
110 // No changes were made during edit operation. Just reject.
111 break;
112 case AddressTableModel::INVALID_ADDRESS:
113 QMessageBox::warning(this, windowTitle(),
114 tr("The entered address \"%1\" is not a valid Limenka address.").arg(ui->addressEdit->text()),
115 QMessageBox::Ok, QMessageBox::Ok);
116 break;
117 case AddressTableModel::DUPLICATE_ADDRESS:
118 QMessageBox::warning(this, windowTitle(),
119 getDuplicateAddressWarning(),
120 QMessageBox::Ok, QMessageBox::Ok);
121 break;
122 case AddressTableModel::WALLET_UNLOCK_FAILURE:
123 QMessageBox::critical(this, windowTitle(),
124 tr("Could not unlock wallet."),
125 QMessageBox::Ok, QMessageBox::Ok);
126 break;
127 case AddressTableModel::KEY_GENERATION_FAILURE:
128 QMessageBox::critical(this, windowTitle(),
129 tr("New key generation failed."),
130 QMessageBox::Ok, QMessageBox::Ok);
131 break;
132
133 }
134 return;
135 }
136 QDialog::accept();
137 }
138
139 QString EditAddressDialog::getDuplicateAddressWarning() const
140 {
141 QString dup_address = ui->addressEdit->text();
142 QString existing_label = model->labelForAddress(dup_address);
143 auto existing_purpose = model->purposeForAddress(dup_address);
144
145 if (existing_purpose == wallet::AddressPurpose::RECEIVE &&
146 (mode == NewSendingAddress || mode == EditSendingAddress)) {
147 return tr(
148 "Address \"%1\" already exists as a receiving address with label "
149 "\"%2\" and so cannot be added as a sending address."
150 ).arg(dup_address).arg(existing_label);
151 }
152 return tr(
153 "The entered address \"%1\" is already in the address book with "
154 "label \"%2\"."
155 ).arg(dup_address).arg(existing_label);
156 }
157
158 QString EditAddressDialog::getAddress() const
159 {
160 return address;
161 }
162
163 void EditAddressDialog::setAddress(const QString &_address)
164 {
165 this->address = _address;
166 ui->addressEdit->setText(_address);
167 }
168