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