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