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