|
6 | 6 | #include <qt/forms/ui_receiverequestdialog.h> |
7 | 7 |
|
8 | 8 | #include <qt/bitcoinunits.h> |
9 | | -#include <qt/guiconstants.h> |
10 | 9 | #include <qt/guiutil.h> |
11 | 10 | #include <qt/optionsmodel.h> |
| 11 | +#include <qt/qrimagewidget.h> |
12 | 12 |
|
13 | 13 | #include <QClipboard> |
14 | | -#include <QDrag> |
15 | | -#include <QMenu> |
16 | | -#include <QMimeData> |
17 | | -#include <QMouseEvent> |
18 | 14 | #include <QPixmap> |
19 | 15 |
|
20 | 16 | #if defined(HAVE_CONFIG_H) |
21 | 17 | #include <config/bitcoin-config.h> /* for USE_QRCODE */ |
22 | 18 | #endif |
23 | 19 |
|
24 | | -#ifdef USE_QRCODE |
25 | | -#include <qrencode.h> |
26 | | -#endif |
27 | | - |
28 | | -QRImageWidget::QRImageWidget(QWidget *parent): |
29 | | - QLabel(parent), contextMenu(nullptr) |
30 | | -{ |
31 | | - contextMenu = new QMenu(this); |
32 | | - QAction *saveImageAction = new QAction(tr("&Save Image..."), this); |
33 | | - connect(saveImageAction, &QAction::triggered, this, &QRImageWidget::saveImage); |
34 | | - contextMenu->addAction(saveImageAction); |
35 | | - QAction *copyImageAction = new QAction(tr("&Copy Image"), this); |
36 | | - connect(copyImageAction, &QAction::triggered, this, &QRImageWidget::copyImage); |
37 | | - contextMenu->addAction(copyImageAction); |
38 | | -} |
39 | | - |
40 | | -bool QRImageWidget::setQR(const QString& data, const QString& text) |
41 | | -{ |
42 | | -#ifdef USE_QRCODE |
43 | | - setText(""); |
44 | | - if (data.isEmpty()) return false; |
45 | | - |
46 | | - // limit length |
47 | | - if (data.length() > MAX_URI_LENGTH) { |
48 | | - setText(tr("Resulting URI too long, try to reduce the text for label / message.")); |
49 | | - return false; |
50 | | - } |
51 | | - |
52 | | - QRcode *code = QRcode_encodeString(data.toUtf8().constData(), 0, QR_ECLEVEL_L, QR_MODE_8, 1); |
53 | | - |
54 | | - if (!code) { |
55 | | - setText(tr("Error encoding URI into QR Code.")); |
56 | | - return false; |
57 | | - } |
58 | | - |
59 | | - QImage qrImage = QImage(code->width + 8, code->width + 8, QImage::Format_RGB32); |
60 | | - qrImage.fill(0xffffff); |
61 | | - unsigned char *p = code->data; |
62 | | - for (int y = 0; y < code->width; ++y) { |
63 | | - for (int x = 0; x < code->width; ++x) { |
64 | | - qrImage.setPixel(x + 4, y + 4, ((*p & 1) ? 0x0 : 0xffffff)); |
65 | | - ++p; |
66 | | - } |
67 | | - } |
68 | | - QRcode_free(code); |
69 | | - |
70 | | - QImage qrAddrImage = QImage(QR_IMAGE_SIZE, QR_IMAGE_SIZE + (text.isEmpty() ? 0 : 20), QImage::Format_RGB32); |
71 | | - qrAddrImage.fill(0xffffff); |
72 | | - QPainter painter(&qrAddrImage); |
73 | | - painter.drawImage(0, 0, qrImage.scaled(QR_IMAGE_SIZE, QR_IMAGE_SIZE)); |
74 | | - |
75 | | - if (!text.isEmpty()) { |
76 | | - QFont font = GUIUtil::fixedPitchFont(); |
77 | | - QRect paddedRect = qrAddrImage.rect(); |
78 | | - |
79 | | - // calculate ideal font size |
80 | | - qreal font_size = GUIUtil::calculateIdealFontSize(paddedRect.width() - 20, text, font); |
81 | | - font.setPointSizeF(font_size); |
82 | | - |
83 | | - painter.setFont(font); |
84 | | - paddedRect.setHeight(QR_IMAGE_SIZE+12); |
85 | | - painter.drawText(paddedRect, Qt::AlignBottom|Qt::AlignCenter, text); |
86 | | - } |
87 | | - |
88 | | - painter.end(); |
89 | | - setPixmap(QPixmap::fromImage(qrAddrImage)); |
90 | | - |
91 | | - return true; |
92 | | -#else |
93 | | - setText(tr("QR code support not available.")); |
94 | | - return false; |
95 | | -#endif |
96 | | -} |
97 | | - |
98 | | -QImage QRImageWidget::exportImage() |
99 | | -{ |
100 | | - if(!pixmap()) |
101 | | - return QImage(); |
102 | | - return pixmap()->toImage(); |
103 | | -} |
104 | | - |
105 | | -void QRImageWidget::mousePressEvent(QMouseEvent *event) |
106 | | -{ |
107 | | - if(event->button() == Qt::LeftButton && pixmap()) |
108 | | - { |
109 | | - event->accept(); |
110 | | - QMimeData *mimeData = new QMimeData; |
111 | | - mimeData->setImageData(exportImage()); |
112 | | - |
113 | | - QDrag *drag = new QDrag(this); |
114 | | - drag->setMimeData(mimeData); |
115 | | - drag->exec(); |
116 | | - } else { |
117 | | - QLabel::mousePressEvent(event); |
118 | | - } |
119 | | -} |
120 | | - |
121 | | -void QRImageWidget::saveImage() |
122 | | -{ |
123 | | - if(!pixmap()) |
124 | | - return; |
125 | | - QString fn = GUIUtil::getSaveFileName(this, tr("Save QR Code"), QString(), tr("PNG Image (*.png)"), nullptr); |
126 | | - if (!fn.isEmpty()) |
127 | | - { |
128 | | - exportImage().save(fn); |
129 | | - } |
130 | | -} |
131 | | - |
132 | | -void QRImageWidget::copyImage() |
133 | | -{ |
134 | | - if(!pixmap()) |
135 | | - return; |
136 | | - QApplication::clipboard()->setImage(exportImage()); |
137 | | -} |
138 | | - |
139 | | -void QRImageWidget::contextMenuEvent(QContextMenuEvent *event) |
140 | | -{ |
141 | | - if(!pixmap()) |
142 | | - return; |
143 | | - contextMenu->exec(event->globalPos()); |
144 | | -} |
145 | | - |
146 | 20 | ReceiveRequestDialog::ReceiveRequestDialog(QWidget *parent) : |
147 | 21 | QDialog(parent), |
148 | 22 | ui(new Ui::ReceiveRequestDialog), |
|
0 commit comments