editaddressdialog.cpp
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 }