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