update QRCodeDialog
- remove unused #include <QDebug> and lblBTC label - update Bitcoin input field to a BitcoinAmountField to allow Bitcoin unit selection - use BitcoinUnits::format for the resulting amount parameter in the generated URI (always use BTC as per BIP21) - move MAX_URI_LENGTH and EXPORT_IMAGE_SIZE to guiconstants.h - add OptionsModel in AddressBookPage and use it in on_showQRCode_clicked() to pass it to QRCodeDialog - add OptionsModel in QRCodeDialog to enable display unit updates - add updateDisplayUnit() slot to be able to imediately update currently set bitcoin unit - make all labels in the UI-file plain text - resize dialog to match for an updated layout (fields are now stacked and new field) - remove unused parameters from private slots - only enable save button, when QR Code was generated - show message when entered amound is invalid - add read-only QPlainTextEdit field to output generated URI
This commit is contained in:
@@ -1,28 +1,34 @@
|
||||
#include "qrcodedialog.h"
|
||||
#include "ui_qrcodedialog.h"
|
||||
|
||||
#include "bitcoinunits.h"
|
||||
#include "guiconstants.h"
|
||||
#include "guiutil.h"
|
||||
#include "optionsmodel.h"
|
||||
|
||||
#include <QPixmap>
|
||||
#include <QUrl>
|
||||
#include <QDebug>
|
||||
|
||||
#include <qrencode.h>
|
||||
|
||||
#define EXPORT_IMAGE_SIZE 256
|
||||
|
||||
QRCodeDialog::QRCodeDialog(const QString &addr, const QString &label, bool enableReq, QWidget *parent) :
|
||||
QDialog(parent), ui(new Ui::QRCodeDialog), address(addr)
|
||||
QDialog(parent),
|
||||
ui(new Ui::QRCodeDialog),
|
||||
model(0),
|
||||
address(addr)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
setWindowTitle(QString("%1").arg(address));
|
||||
|
||||
ui->chkReqPayment->setVisible(enableReq);
|
||||
ui->lnReqAmount->setVisible(enableReq);
|
||||
ui->lblAmount->setVisible(enableReq);
|
||||
ui->lblBTC->setVisible(enableReq);
|
||||
ui->lnReqAmount->setVisible(enableReq);
|
||||
|
||||
ui->lnLabel->setText(label);
|
||||
|
||||
ui->btnSaveAs->setEnabled(false);
|
||||
|
||||
genCode();
|
||||
}
|
||||
|
||||
@@ -31,6 +37,17 @@ QRCodeDialog::~QRCodeDialog()
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void QRCodeDialog::setModel(OptionsModel *model)
|
||||
{
|
||||
this->model = model;
|
||||
|
||||
if (model)
|
||||
connect(model, SIGNAL(displayUnitChanged(int)), this, SLOT(updateDisplayUnit()));
|
||||
|
||||
// update the display unit, to not use the default ("BTC")
|
||||
updateDisplayUnit();
|
||||
}
|
||||
|
||||
void QRCodeDialog::genCode()
|
||||
{
|
||||
QString uri = getURI();
|
||||
@@ -57,26 +74,34 @@ void QRCodeDialog::genCode()
|
||||
}
|
||||
}
|
||||
QRcode_free(code);
|
||||
|
||||
ui->lblQRCode->setPixmap(QPixmap::fromImage(myImage).scaled(300, 300));
|
||||
|
||||
ui->outUri->setPlainText(uri);
|
||||
}
|
||||
else
|
||||
ui->lblQRCode->setText(tr("Resulting URI too long, try to reduce the text for label / message."));
|
||||
}
|
||||
|
||||
QString QRCodeDialog::getURI()
|
||||
{
|
||||
QString ret = QString("bitcoin:%1").arg(address);
|
||||
|
||||
int paramCount = 0;
|
||||
if (ui->chkReqPayment->isChecked() && !ui->lnReqAmount->text().isEmpty())
|
||||
|
||||
ui->outUri->clear();
|
||||
|
||||
if (ui->chkReqPayment->isChecked())
|
||||
{
|
||||
bool ok = false;
|
||||
ui->lnReqAmount->text().toDouble(&ok);
|
||||
if (ok)
|
||||
if (ui->lnReqAmount->validate())
|
||||
{
|
||||
ret += QString("?amount=%1").arg(ui->lnReqAmount->text());
|
||||
// even if we allow a non BTC unit input in lnReqAmount, we generate the URI with BTC as unit (as defined in BIP21)
|
||||
ret += QString("?amount=%1").arg(BitcoinUnits::format(BitcoinUnits::BTC, ui->lnReqAmount->value()));
|
||||
paramCount++;
|
||||
}
|
||||
else
|
||||
{
|
||||
ui->btnSaveAs->setEnabled(false);
|
||||
ui->lblQRCode->setText(tr("The entered amount is invalid, please check."));
|
||||
return QString("");
|
||||
}
|
||||
}
|
||||
|
||||
if (!ui->lnLabel->text().isEmpty())
|
||||
@@ -93,24 +118,29 @@ QString QRCodeDialog::getURI()
|
||||
paramCount++;
|
||||
}
|
||||
|
||||
// limit URI length to 255 chars, to prevent a DoS against the QR-Code dialog
|
||||
if (ret.length() < 256)
|
||||
return ret;
|
||||
else
|
||||
// limit URI length to prevent a DoS against the QR-Code dialog
|
||||
if (ret.length() > MAX_URI_LENGTH)
|
||||
{
|
||||
ui->btnSaveAs->setEnabled(false);
|
||||
ui->lblQRCode->setText(tr("Resulting URI too long, try to reduce the text for label / message."));
|
||||
return QString("");
|
||||
}
|
||||
|
||||
ui->btnSaveAs->setEnabled(true);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void QRCodeDialog::on_lnReqAmount_textChanged(const QString &arg1)
|
||||
void QRCodeDialog::on_lnReqAmount_textChanged()
|
||||
{
|
||||
genCode();
|
||||
}
|
||||
|
||||
void QRCodeDialog::on_lnLabel_textChanged(const QString &arg1)
|
||||
void QRCodeDialog::on_lnLabel_textChanged()
|
||||
{
|
||||
genCode();
|
||||
}
|
||||
|
||||
void QRCodeDialog::on_lnMessage_textChanged(const QString &arg1)
|
||||
void QRCodeDialog::on_lnMessage_textChanged()
|
||||
{
|
||||
genCode();
|
||||
}
|
||||
@@ -122,7 +152,20 @@ void QRCodeDialog::on_btnSaveAs_clicked()
|
||||
myImage.scaled(EXPORT_IMAGE_SIZE, EXPORT_IMAGE_SIZE).save(fn);
|
||||
}
|
||||
|
||||
void QRCodeDialog::on_chkReqPayment_toggled(bool)
|
||||
void QRCodeDialog::on_chkReqPayment_toggled(bool fChecked)
|
||||
{
|
||||
if (!fChecked)
|
||||
// if chkReqPayment is not active, don't display lnReqAmount as invalid
|
||||
ui->lnReqAmount->setValid(true);
|
||||
|
||||
genCode();
|
||||
}
|
||||
|
||||
void QRCodeDialog::updateDisplayUnit()
|
||||
{
|
||||
if (model)
|
||||
{
|
||||
// Update lnReqAmount with the current unit
|
||||
ui->lnReqAmount->setDisplayUnit(model->getDisplayUnit());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user