diff --git a/src/qt/CMakeLists.txt b/src/qt/CMakeLists.txt
--- a/src/qt/CMakeLists.txt
+++ b/src/qt/CMakeLists.txt
@@ -293,6 +293,7 @@
openuridialog.cpp
overviewpage.cpp
paymentserver.cpp
+ qrimagewidget.cpp
receivecoinsdialog.cpp
receiverequestdialog.cpp
recentrequeststablemodel.cpp
diff --git a/src/qt/forms/receiverequestdialog.ui b/src/qt/forms/receiverequestdialog.ui
--- a/src/qt/forms/receiverequestdialog.ui
+++ b/src/qt/forms/receiverequestdialog.ui
@@ -127,7 +127,7 @@
QRImageWidget
QLabel
- qt/receiverequestdialog.h
+
diff --git a/src/qt/guiconstants.h b/src/qt/guiconstants.h
--- a/src/qt/guiconstants.h
+++ b/src/qt/guiconstants.h
@@ -39,12 +39,6 @@
*/
static const int TOOLTIP_WRAP_THRESHOLD = 80;
-/* Maximum allowed URI length */
-static const int MAX_URI_LENGTH = 255;
-
-/* QRCodeDialog -- size of exported QR Code image */
-#define QR_IMAGE_SIZE 350
-
/* Number of frames in spinner animation */
#define SPINNER_FRAMES 36
diff --git a/src/qt/qrimagewidget.h b/src/qt/qrimagewidget.h
new file mode 100644
--- /dev/null
+++ b/src/qt/qrimagewidget.h
@@ -0,0 +1,46 @@
+// Copyright (c) 2011-2018 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#ifndef BITCOIN_QT_QRIMAGEWIDGET_H
+#define BITCOIN_QT_QRIMAGEWIDGET_H
+
+#include
+#include
+
+/* Maximum allowed URI length */
+static const int MAX_URI_LENGTH = 255;
+
+/* Size of exported QR Code image */
+static const int QR_IMAGE_SIZE = 350;
+
+QT_BEGIN_NAMESPACE
+class QMenu;
+QT_END_NAMESPACE
+
+/**
+ * Label widget for QR code. This image can be dragged, dropped, copied and
+ * saved to disk.
+ */
+class QRImageWidget : public QLabel {
+ Q_OBJECT
+
+public:
+ explicit QRImageWidget(QWidget *parent = nullptr);
+ bool hasPixmap() const;
+ bool setQR(const QString &qrData, const QString &text = "");
+ QImage exportImage();
+
+public Q_SLOTS:
+ void saveImage();
+ void copyImage();
+
+protected:
+ virtual void mousePressEvent(QMouseEvent *event);
+ virtual void contextMenuEvent(QContextMenuEvent *event);
+
+private:
+ QMenu *contextMenu;
+};
+
+#endif // BITCOIN_QT_QRIMAGEWIDGET_H
diff --git a/src/qt/receiverequestdialog.cpp b/src/qt/qrimagewidget.cpp
copy from src/qt/receiverequestdialog.cpp
copy to src/qt/qrimagewidget.cpp
--- a/src/qt/receiverequestdialog.cpp
+++ b/src/qt/qrimagewidget.cpp
@@ -1,23 +1,18 @@
-// Copyright (c) 2011-2016 The Bitcoin Core developers
-// Copyright (c) 2017-2019 The Bitcoin developers
+// Copyright (c) 2011-2018 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#include
-#include
+#include
-#include
-#include
#include
-#include
-#include
+#include
#include
#include
#include
#include
#include
-#include
+#include
#if defined(HAVE_CONFIG_H)
#include /* for USE_QRCODE */
@@ -159,89 +154,3 @@
}
contextMenu->exec(event->globalPos());
}
-
-ReceiveRequestDialog::ReceiveRequestDialog(QWidget *parent)
- : QDialog(parent), ui(new Ui::ReceiveRequestDialog), model(nullptr) {
- ui->setupUi(this);
-
-#ifndef USE_QRCODE
- ui->btnSaveAs->setVisible(false);
- ui->lblQRCode->setVisible(false);
-#endif
-
- connect(ui->btnSaveAs, &QPushButton::clicked, ui->lblQRCode,
- &QRImageWidget::saveImage);
-}
-
-ReceiveRequestDialog::~ReceiveRequestDialog() {
- delete ui;
-}
-
-void ReceiveRequestDialog::setModel(WalletModel *_model) {
- this->model = _model;
-
- if (_model) {
- connect(_model->getOptionsModel(), &OptionsModel::displayUnitChanged,
- this, &ReceiveRequestDialog::update);
- }
-
- // update the display unit if necessary
- update();
-}
-
-void ReceiveRequestDialog::setInfo(const SendCoinsRecipient &_info) {
- this->info = _info;
- update();
-}
-
-void ReceiveRequestDialog::update() {
- if (!model) {
- return;
- }
- QString target = info.label;
- if (target.isEmpty()) {
- target = info.address;
- }
- setWindowTitle(tr("Request payment to %1").arg(target));
-
- QString uri = GUIUtil::formatBitcoinURI(info);
- ui->btnSaveAs->setEnabled(false);
- QString html;
- html += "";
- html += "" + tr("Payment information") + "
";
- html += "" + tr("URI") + ": ";
- html += "" + GUIUtil::HtmlEscape(uri) + "
";
- html += "" + tr("Address") +
- ": " + GUIUtil::HtmlEscape(info.address) + "
";
- if (info.amount != Amount::zero()) {
- html += "" + tr("Amount") + ": " +
- BitcoinUnits::formatHtmlWithUnit(
- model->getOptionsModel()->getDisplayUnit(), info.amount) +
- "
";
- }
- if (!info.label.isEmpty()) {
- html += "" + tr("Label") +
- ": " + GUIUtil::HtmlEscape(info.label) + "
";
- }
- if (!info.message.isEmpty()) {
- html += "" + tr("Message") +
- ": " + GUIUtil::HtmlEscape(info.message) + "
";
- }
- if (model->isMultiwallet()) {
- html += "" + tr("Wallet") +
- ": " + GUIUtil::HtmlEscape(model->getWalletName()) + "
";
- }
- ui->outUri->setText(html);
-
- if (ui->lblQRCode->setQR(uri, info.address)) {
- ui->btnSaveAs->setEnabled(true);
- }
-}
-
-void ReceiveRequestDialog::on_btnCopyURI_clicked() {
- GUIUtil::setClipboard(GUIUtil::formatBitcoinURI(info));
-}
-
-void ReceiveRequestDialog::on_btnCopyAddress_clicked() {
- GUIUtil::setClipboard(info.address);
-}
diff --git a/src/qt/receiverequestdialog.h b/src/qt/receiverequestdialog.h
--- a/src/qt/receiverequestdialog.h
+++ b/src/qt/receiverequestdialog.h
@@ -8,9 +8,6 @@
#include
#include
-#include
-#include
-#include
class WalletModel;
@@ -18,35 +15,6 @@
class ReceiveRequestDialog;
}
-QT_BEGIN_NAMESPACE
-class QMenu;
-QT_END_NAMESPACE
-
-/* Label widget for QR code. This image can be dragged, dropped, copied and
- * saved
- * to disk.
- */
-class QRImageWidget : public QLabel {
- Q_OBJECT
-
-public:
- explicit QRImageWidget(QWidget *parent = nullptr);
- bool hasPixmap() const;
- bool setQR(const QString &data, const QString &text = "");
- QImage exportImage();
-
-public Q_SLOTS:
- void saveImage();
- void copyImage();
-
-protected:
- virtual void mousePressEvent(QMouseEvent *event) override;
- virtual void contextMenuEvent(QContextMenuEvent *event) override;
-
-private:
- QMenu *contextMenu;
-};
-
class ReceiveRequestDialog : public QDialog {
Q_OBJECT
diff --git a/src/qt/receiverequestdialog.cpp b/src/qt/receiverequestdialog.cpp
--- a/src/qt/receiverequestdialog.cpp
+++ b/src/qt/receiverequestdialog.cpp
@@ -7,159 +7,18 @@
#include
#include
-#include
#include
#include
+#include
#include
#include
-#include
-#include
-#include
-#include
#include
#if defined(HAVE_CONFIG_H)
#include /* for USE_QRCODE */
#endif
-#ifdef USE_QRCODE
-#include
-#endif
-
-QRImageWidget::QRImageWidget(QWidget *parent)
- : QLabel(parent), contextMenu(nullptr) {
- contextMenu = new QMenu(this);
- QAction *saveImageAction = new QAction(tr("&Save Image..."), this);
- connect(saveImageAction, &QAction::triggered, this,
- &QRImageWidget::saveImage);
- contextMenu->addAction(saveImageAction);
- QAction *copyImageAction = new QAction(tr("&Copy Image"), this);
- connect(copyImageAction, &QAction::triggered, this,
- &QRImageWidget::copyImage);
- contextMenu->addAction(copyImageAction);
-}
-
-bool QRImageWidget::hasPixmap() const {
-#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
- return !pixmap(Qt::ReturnByValue).isNull();
-#else
- return pixmap() != nullptr;
-#endif
-}
-
-bool QRImageWidget::setQR(const QString &qrData, const QString &text) {
-#ifdef USE_QRCODE
- setText("");
- if (qrData.isEmpty()) {
- return false;
- }
-
- // limit length
- if (qrData.length() > MAX_URI_LENGTH) {
- setText(tr("Resulting URI too long, try to reduce the text for label / "
- "message."));
- return false;
- }
-
- QRcode *code = QRcode_encodeString(qrData.toUtf8().constData(), 0,
- QR_ECLEVEL_L, QR_MODE_8, 1);
-
- if (!code) {
- setText(tr("Error encoding URI into QR Code."));
- return false;
- }
-
- QImage qrImage =
- QImage(code->width + 8, code->width + 8, QImage::Format_RGB32);
- qrImage.fill(0xffffff);
- uint8_t *p = code->data;
- for (int y = 0; y < code->width; ++y) {
- for (int x = 0; x < code->width; ++x) {
- qrImage.setPixel(x + 4, y + 4, ((*p & 1) ? 0x0 : 0xffffff));
- ++p;
- }
- }
- QRcode_free(code);
-
- QImage qrAddrImage =
- QImage(QR_IMAGE_SIZE, QR_IMAGE_SIZE + (text.isEmpty() ? 0 : 20),
- QImage::Format_RGB32);
- qrAddrImage.fill(0xffffff);
- QPainter painter(&qrAddrImage);
- painter.drawImage(0, 0, qrImage.scaled(QR_IMAGE_SIZE, QR_IMAGE_SIZE));
-
- if (!text.isEmpty()) {
- QFont font = GUIUtil::fixedPitchFont();
- QRect paddedRect = qrAddrImage.rect();
-
- // calculate ideal font size
- qreal font_size = GUIUtil::calculateIdealFontSize(
- paddedRect.width() - 20, text, font);
- font.setPointSizeF(font_size);
-
- painter.setFont(font);
- paddedRect.setHeight(QR_IMAGE_SIZE + 12);
- painter.drawText(paddedRect, Qt::AlignBottom | Qt::AlignCenter, text);
- }
-
- painter.end();
- setPixmap(QPixmap::fromImage(qrAddrImage));
-
- return true;
-#else
- setText(tr("QR code support not available."));
- return false;
-#endif
-}
-
-QImage QRImageWidget::exportImage() {
-#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
- return pixmap(Qt::ReturnByValue).toImage();
-#else
- return hasPixmap() ? pixmap()->toImage() : QImage();
-#endif
-}
-
-void QRImageWidget::mousePressEvent(QMouseEvent *event) {
- if (event->button() == Qt::LeftButton && hasPixmap()) {
- event->accept();
- QMimeData *mimeData = new QMimeData;
- mimeData->setImageData(exportImage());
-
- QDrag *drag = new QDrag(this);
- drag->setMimeData(mimeData);
- drag->exec();
- } else {
- QLabel::mousePressEvent(event);
- }
-}
-
-void QRImageWidget::saveImage() {
- if (!hasPixmap()) {
- return;
- }
- QString fn = GUIUtil::getSaveFileName(this, tr("Save QR Code"), QString(),
- tr("PNG Image (*.png)"), nullptr);
- if (!fn.isEmpty()) {
- exportImage().save(fn);
- }
-}
-
-void QRImageWidget::copyImage() {
- if (!hasPixmap()) {
- return;
- }
- QApplication::clipboard()->setImage(exportImage());
-}
-
-void QRImageWidget::contextMenuEvent(QContextMenuEvent *event) {
- if (!hasPixmap()) {
- return;
- }
- contextMenu->exec(event->globalPos());
-}
-
ReceiveRequestDialog::ReceiveRequestDialog(QWidget *parent)
: QDialog(parent), ui(new Ui::ReceiveRequestDialog), model(nullptr) {
ui->setupUi(this);