PRCYCoin  2.0.0.7rc1
P2P Digital Currency
receiverequestdialog.cpp
Go to the documentation of this file.
1 // Copyright (c) 2011-2013 The Bitcoin developers
2 // Distributed under the MIT/X11 software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #include "receiverequestdialog.h"
6 #include "ui_receiverequestdialog.h"
7 
8 #include "bitcoinunits.h"
9 #include "guiconstants.h"
10 #include "guiutil.h"
11 #include "optionsmodel.h"
12 #include "walletmodel.h"
13 
14 #include <QClipboard>
15 #include <QDrag>
16 #include <QMenu>
17 #include <QMimeData>
18 #include <QMouseEvent>
19 #include <QPixmap>
20 
21 // #define USE_QRCODE
22 
23 #if defined(HAVE_CONFIG_H)
24 #include "config/prcycoin-config.h" /* for USE_QRCODE */
25 #endif
26 
27 #ifdef USE_QRCODE
28 #include <qrencode.h>
29 #endif
30 
31 QRImageWidget::QRImageWidget(QWidget* parent) : QLabel(parent), contextMenu(0)
32 {
33  contextMenu = new QMenu(this);
34  contextMenu->setAttribute(Qt::WA_DeleteOnClose);
35  QAction* saveImageAction = new QAction(tr("&Save Image..."), this);
36  connect(saveImageAction, SIGNAL(triggered()), this, SLOT(saveImage()));
37  contextMenu->addAction(saveImageAction);
38  QAction* copyImageAction = new QAction(tr("&Copy Image"), this);
39  connect(copyImageAction, SIGNAL(triggered()), this, SLOT(copyImage()));
40  contextMenu->addAction(copyImageAction);
41 }
42 
44 {
45  if (!pixmap())
46  return QImage();
47  return pixmap()->toImage().scaled(EXPORT_IMAGE_SIZE, EXPORT_IMAGE_SIZE);
48 }
49 
50 void QRImageWidget::mousePressEvent(QMouseEvent* event)
51 {
52  if (event->button() == Qt::LeftButton && pixmap()) {
53  event->accept();
54  QMimeData* mimeData = new QMimeData;
55  mimeData->setImageData(exportImage());
56 
57  QDrag* drag = new QDrag(this);
58  drag->setMimeData(mimeData);
59  drag->exec();
60  } else {
61  QLabel::mousePressEvent(event);
62  }
63 }
64 
66 {
67  if (!pixmap())
68  return;
69  QString fn = GUIUtil::getSaveFileName(this, tr("Save QR Code"), QString(), tr("PNG Image (*.png)"), NULL);
70  if (!fn.isEmpty()) {
71  exportImage().save(fn);
72  }
73 }
74 
76 {
77  if (!pixmap())
78  return;
79  QApplication::clipboard()->setImage(exportImage());
80 }
81 
82 void QRImageWidget::contextMenuEvent(QContextMenuEvent* event)
83 {
84  if (!pixmap())
85  return;
86  contextMenu->exec(event->globalPos());
87 }
88 
89 ReceiveRequestDialog::ReceiveRequestDialog(QWidget* parent) : QDialog(parent, Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint),
90  ui(new Ui::ReceiveRequestDialog),
91  model(0)
92 {
93  ui->setupUi(this);
94 
95 #ifndef USE_QRCODE
96  ui->btnSaveAs->setVisible(false);
97  ui->lblQRCode->setVisible(false);
98 #endif
99 
100  connect(ui->btnSaveAs, SIGNAL(clicked()), ui->lblQRCode, SLOT(saveImage()));
101 }
102 
104 {
105  delete ui;
106 }
107 
109 {
110  this->model = model;
111 
112  if (model)
113  connect(model, SIGNAL(displayUnitChanged(int)), this, SLOT(update()));
114 
115  // update the display unit if necessary
116  update();
117 }
118 
120 {
121  this->info = info;
122  update();
123 }
124 
126 {
127  if (!model)
128  return;
129  QString target = info.label;
130  if (target.isEmpty())
131  target = info.address;
132  setWindowTitle(tr("Request payment to %1").arg(target));
133 
134  QString uri = GUIUtil::formatBitcoinURI(info);
135  ui->btnSaveAs->setEnabled(false);
136  QString html;
137  html += "<html><font face='verdana, arial, helvetica, sans-serif'>";
138  html += "<b>" + tr("Payment information") + "</b><br>";
139  html += "<b>" + tr("URI") + "</b>: ";
140  html += "<a style=\"color:#5B4C7C;\" href=\"" + uri + "\">" + GUIUtil::HtmlEscape(uri) + "</a><br>";
141  html += "<b>" + tr("Address") + "</b>: " + GUIUtil::HtmlEscape(info.address) + "<br>";
142  if (info.amount)
143  html += "<b>" + tr("Amount") + "</b>: " + BitcoinUnits::formatWithUnit(model->getDisplayUnit(), info.amount) + "<br>";
144  if (!info.label.isEmpty())
145  html += "<b>" + tr("Label") + "</b>: " + GUIUtil::HtmlEscape(info.label) + "<br>";
146  if (!info.message.isEmpty())
147  html += "<b>" + tr("Message") + "</b>: " + GUIUtil::HtmlEscape(info.message) + "<br>";
148  ui->outUri->setText(html);
149 
150 #ifdef USE_QRCODE
151  ui->lblQRCode->setText("");
152  if (!uri.isEmpty()) {
153  // limit URI length
154  if (uri.length() > MAX_URI_LENGTH) {
155  ui->lblQRCode->setText(tr("Resulting URI too long, try to reduce the text for label / message."));
156  } else {
157  QRcode* code = QRcode_encodeString(info.address.toUtf8().constData(), 0, QR_ECLEVEL_L, QR_MODE_8, 1); // don't use uri, better mobile scanning
158  if (!code) {
159  ui->lblQRCode->setText(tr("Error encoding URI into QR Code."));
160  return;
161  }
162  QImage myImage = QImage(code->width + 8, code->width + 8, QImage::Format_RGB32);
163  myImage.fill(0xffffff);
164  unsigned char* p = code->data;
165  for (int y = 0; y < code->width; y++) {
166  for (int x = 0; x < code->width; x++) {
167  myImage.setPixel(x + 4, y + 4, ((*p & 1) ? 0x0 : 0xffffff));
168  p++;
169  }
170  }
171  QRcode_free(code);
172 
173  ui->lblQRCode->setPixmap(QPixmap::fromImage(myImage).scaled(300, 300));
174  ui->btnSaveAs->setEnabled(true);
175  }
176  }
177 #endif
178 }
179 
181 {
183 }
184 
186 {
188 }
SendCoinsRecipient::amount
CAmount amount
Definition: walletmodel.h:61
QRImageWidget::QRImageWidget
QRImageWidget(QWidget *parent=0)
Definition: receiverequestdialog.cpp:31
ReceiveRequestDialog::ui
Ui::ReceiveRequestDialog * ui
Definition: receiverequestdialog.h:66
EXPORT_IMAGE_SIZE
#define EXPORT_IMAGE_SIZE
Definition: guiconstants.h:52
BitcoinUnits::formatWithUnit
static QString formatWithUnit(int unit, const CAmount &amount, bool plussign=false, SeparatorStyle separators=separatorStandard)
Format as string (with unit)
Definition: bitcoinunits.cpp:190
ReceiveRequestDialog::info
SendCoinsRecipient info
Definition: receiverequestdialog.h:68
QRImageWidget::exportImage
QImage exportImage()
Definition: receiverequestdialog.cpp:43
walletmodel.h
SendCoinsRecipient::label
QString label
Definition: walletmodel.h:58
ReceiveRequestDialog::model
OptionsModel * model
Definition: receiverequestdialog.h:67
GUIUtil::formatBitcoinURI
QString formatBitcoinURI(const SendCoinsRecipient &info)
Definition: guiutil.cpp:167
ReceiveRequestDialog::update
void update()
Definition: receiverequestdialog.cpp:125
ReceiveRequestDialog::on_btnCopyAddress_clicked
void on_btnCopyAddress_clicked()
Definition: receiverequestdialog.cpp:185
GUIUtil::setClipboard
void setClipboard(const QString &str)
Definition: guiutil.cpp:785
OptionsModel::getDisplayUnit
int getDisplayUnit()
Definition: optionsmodel.h:60
ReceiveRequestDialog::setInfo
void setInfo(const SendCoinsRecipient &info)
Definition: receiverequestdialog.cpp:119
SendCoinsRecipient
Definition: walletmodel.h:46
OptionsModel
Interface from Qt to configuration data structure for Bitcoin client.
Definition: optionsmodel.h:18
ReceiveRequestDialog::ReceiveRequestDialog
ReceiveRequestDialog(QWidget *parent=0)
Definition: receiverequestdialog.cpp:89
prcycoin-config.h
guiutil.h
QRImageWidget::contextMenu
QMenu * contextMenu
Definition: receiverequestdialog.h:45
QRImageWidget::contextMenuEvent
virtual void contextMenuEvent(QContextMenuEvent *event)
Definition: receiverequestdialog.cpp:82
ReceiveRequestDialog
Definition: receiverequestdialog.h:48
GUIUtil::getSaveFileName
QString getSaveFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedSuffixOut)
Get save filename, mimics QFileDialog::getSaveFileName, except that it appends a default suffix when ...
Definition: guiutil.cpp:239
Ui
Definition: 2faconfirmdialog.h:7
guiconstants.h
QRImageWidget::copyImage
void copyImage()
Definition: receiverequestdialog.cpp:75
GUIUtil::HtmlEscape
QString HtmlEscape(const QString &str, bool fMultiLine)
Definition: guiutil.cpp:200
ReceiveRequestDialog::setModel
void setModel(OptionsModel *model)
Definition: receiverequestdialog.cpp:108
ReceiveRequestDialog::on_btnCopyURI_clicked
void on_btnCopyURI_clicked()
Definition: receiverequestdialog.cpp:180
SendCoinsRecipient::address
QString address
Definition: walletmodel.h:57
QRImageWidget::mousePressEvent
virtual void mousePressEvent(QMouseEvent *event)
Definition: receiverequestdialog.cpp:50
bitcoinunits.h
ReceiveRequestDialog::~ReceiveRequestDialog
~ReceiveRequestDialog()
Definition: receiverequestdialog.cpp:103
optionsmodel.h
receiverequestdialog.h
QRImageWidget::saveImage
void saveImage()
Definition: receiverequestdialog.cpp:65
SendCoinsRecipient::message
QString message
Definition: walletmodel.h:63