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