/ src / qt / receiverequestdialog.cpp
receiverequestdialog.cpp
  1  // Copyright (c) 2011-2021 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/receiverequestdialog.h>
  6  #include <qt/forms/ui_receiverequestdialog.h>
  7  
  8  #include <qt/bitcoinunits.h>
  9  #include <qt/guiutil.h>
 10  #include <qt/optionsmodel.h>
 11  #include <qt/qrimagewidget.h>
 12  #include <qt/walletmodel.h>
 13  
 14  #include <QDialog>
 15  #include <QString>
 16  
 17  #if defined(HAVE_CONFIG_H)
 18  #include <config/bitcoin-config.h> /* for USE_QRCODE */
 19  #endif
 20  
 21  ReceiveRequestDialog::ReceiveRequestDialog(QWidget* parent)
 22      : QDialog(parent, GUIUtil::dialog_flags),
 23        ui(new Ui::ReceiveRequestDialog)
 24  {
 25      ui->setupUi(this);
 26      GUIUtil::handleCloseWindowShortcut(this);
 27  }
 28  
 29  ReceiveRequestDialog::~ReceiveRequestDialog()
 30  {
 31      delete ui;
 32  }
 33  
 34  void ReceiveRequestDialog::setModel(WalletModel *_model)
 35  {
 36      this->model = _model;
 37  
 38      if (_model)
 39          connect(_model->getOptionsModel(), &OptionsModel::displayUnitChanged, this, &ReceiveRequestDialog::updateDisplayUnit);
 40  
 41      // update the display unit if necessary
 42      update();
 43  }
 44  
 45  void ReceiveRequestDialog::setInfo(const SendCoinsRecipient &_info)
 46  {
 47      this->info = _info;
 48      setWindowTitle(tr("Request payment to %1").arg(info.label.isEmpty() ? info.address : info.label));
 49      QString uri = GUIUtil::formatBitcoinURI(info);
 50  
 51  #ifdef USE_QRCODE
 52      if (ui->qr_code->setQR(uri, info.address)) {
 53          connect(ui->btnSaveAs, &QPushButton::clicked, ui->qr_code, &QRImageWidget::saveImage);
 54      } else {
 55          ui->btnSaveAs->setEnabled(false);
 56      }
 57  #else
 58      ui->btnSaveAs->hide();
 59      ui->qr_code->hide();
 60  #endif
 61  
 62      ui->uri_content->setText("<a href=\"" + uri + "\">" + GUIUtil::HtmlEscape(uri) + "</a>");
 63      ui->address_content->setText(info.address);
 64  
 65      if (!info.amount) {
 66          ui->amount_tag->hide();
 67          ui->amount_content->hide();
 68      } // Amount is set in updateDisplayUnit() slot.
 69      updateDisplayUnit();
 70  
 71      if (!info.label.isEmpty()) {
 72          ui->label_content->setText(info.label);
 73      } else {
 74          ui->label_tag->hide();
 75          ui->label_content->hide();
 76      }
 77  
 78      if (!info.message.isEmpty()) {
 79          ui->message_content->setText(info.message);
 80      } else {
 81          ui->message_tag->hide();
 82          ui->message_content->hide();
 83      }
 84  
 85      if (!model->getWalletName().isEmpty()) {
 86          ui->wallet_content->setText(model->getWalletName());
 87      } else {
 88          ui->wallet_tag->hide();
 89          ui->wallet_content->hide();
 90      }
 91  
 92      ui->btnVerify->setVisible(model->wallet().hasExternalSigner());
 93  
 94      connect(ui->btnVerify, &QPushButton::clicked, [this] {
 95          model->displayAddress(info.address.toStdString());
 96      });
 97  }
 98  
 99  void ReceiveRequestDialog::updateDisplayUnit()
100  {
101      if (!model) return;
102      ui->amount_content->setText(BitcoinUnits::formatWithUnit(model->getOptionsModel()->getDisplayUnit(), info.amount));
103  }
104  
105  void ReceiveRequestDialog::on_btnCopyURI_clicked()
106  {
107      GUIUtil::setClipboard(GUIUtil::formatBitcoinURI(info));
108  }
109  
110  void ReceiveRequestDialog::on_btnCopyAddress_clicked()
111  {
112      GUIUtil::setClipboard(info.address);
113  }