diff --git a/src/qt/Makefile.am b/src/qt/Makefile.am
index 52dbbbf6c..2d4de7181 100644
--- a/src/qt/Makefile.am
+++ b/src/qt/Makefile.am
@@ -95,6 +95,7 @@ QT_FORMS_UI = \
forms/openuridialog.ui \
forms/optionsdialog.ui \
forms/overviewpage.ui \
+ forms/paperwalletdialog.ui \
forms/receivecoinsdialog.ui \
forms/receiverequestdialog.ui \
forms/rpcconsole.ui \
@@ -144,6 +145,7 @@ QT_MOC_CPP = \
moc_transactiontablemodel.cpp \
moc_transactionview.cpp \
moc_utilitydialog.cpp \
+ moc_verticallabel.cpp \
moc_walletframe.cpp \
moc_walletmodel.cpp \
moc_walletview.cpp
@@ -209,6 +211,7 @@ BITCOIN_QT_H = \
transactiontablemodel.h \
transactionview.h \
utilitydialog.h \
+ verticallabel.h \
walletframe.h \
walletmodel.h \
walletmodeltransaction.h \
@@ -287,7 +290,8 @@ BITCOIN_QT_CPP = \
rpcconsole.cpp \
splashscreen.cpp \
trafficgraphwidget.cpp \
- utilitydialog.cpp \
+ utilitydialog.cpp
+ verticallabel.cpp \
winshutdownmonitor.cpp
if ENABLE_WALLET
@@ -314,6 +318,7 @@ BITCOIN_QT_CPP += \
transactionrecord.cpp \
transactiontablemodel.cpp \
transactionview.cpp \
+ verticallabel.cpp \
walletframe.cpp \
walletmodel.cpp \
walletmodeltransaction.cpp \
diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp
index 34a1319c8..2f499d9a1 100644
--- a/src/qt/bitcoingui.cpp
+++ b/src/qt/bitcoingui.cpp
@@ -311,6 +311,8 @@ void BitcoinGUI::createActions(bool fIsTestnet)
signMessageAction->setStatusTip(tr("Sign messages with your Dogecoin addresses to prove you own them"));
verifyMessageAction = new QAction(QIcon(":/icons/transaction_0"), tr("&Verify message..."), this);
verifyMessageAction->setStatusTip(tr("Verify messages to ensure they were signed with specified Dogecoin addresses"));
+ paperWalletAction = new QAction(QIcon(":/icons/transaction_0"), tr("&Print paper wallets"), this);
+ paperWalletAction->setStatusTip(tr("Print paper wallets"));
openRPCConsoleAction = new QAction(QIcon(":/icons/debugwindow"), tr("&Debug window"), this);
openRPCConsoleAction->setStatusTip(tr("Open debugging and diagnostic console"));
@@ -343,6 +345,7 @@ void BitcoinGUI::createActions(bool fIsTestnet)
connect(usedSendingAddressesAction, SIGNAL(triggered()), walletFrame, SLOT(usedSendingAddresses()));
connect(usedReceivingAddressesAction, SIGNAL(triggered()), walletFrame, SLOT(usedReceivingAddresses()));
connect(openAction, SIGNAL(triggered()), this, SLOT(openClicked()));
+ connect(paperWalletAction, SIGNAL(triggered()), this, SLOT(paperWalletClicked()));
}
#endif
}
@@ -365,6 +368,7 @@ void BitcoinGUI::createMenuBar()
file->addAction(backupWalletAction);
file->addAction(signMessageAction);
file->addAction(verifyMessageAction);
+ file->addAction(paperWalletAction);
file->addSeparator();
file->addAction(usedSendingAddressesAction);
file->addAction(usedReceivingAddressesAction);
@@ -566,6 +570,16 @@ void BitcoinGUI::aboutClicked()
dlg.exec();
}
+void BitcoinGUI::paperWalletClicked()
+{
+ if(!clientModel)
+ return;
+
+ PaperWalletDialog dlg(this);
+ dlg.setModel(clientModel);
+ dlg.exec();
+}
+
void BitcoinGUI::showHelpMessageClicked()
{
HelpMessageDialog *help = new HelpMessageDialog(this);
@@ -616,6 +630,7 @@ void BitcoinGUI::gotoVerifyMessageTab(QString addr)
{
if (walletFrame) walletFrame->gotoVerifyMessageTab(addr);
}
+
#endif
void BitcoinGUI::setNumConnections(int count)
diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h
index b4675b95a..35b021878 100644
--- a/src/qt/bitcoingui.h
+++ b/src/qt/bitcoingui.h
@@ -83,6 +83,7 @@ private:
QAction *usedReceivingAddressesAction;
QAction *signMessageAction;
QAction *verifyMessageAction;
+ QAction *paperWalletAction;
QAction *aboutAction;
QAction *receiveCoinsAction;
QAction *optionsAction;
@@ -177,6 +178,7 @@ private slots:
void optionsClicked();
/** Show about dialog */
void aboutClicked();
+ void paperWalletClicked();
/** Show help message dialog */
void showHelpMessageClicked();
#ifndef Q_OS_MAC
diff --git a/src/qt/forms/paperwalletdialog.ui b/src/qt/forms/paperwalletdialog.ui
new file mode 100644
index 000000000..c04bf0cc2
--- /dev/null
+++ b/src/qt/forms/paperwalletdialog.ui
@@ -0,0 +1,149 @@
+
+
+ PaperWalletDialog
+
+
+
+ 0
+ 0
+ 716
+ 445
+
+
+
+ Print Your Paper Wallets
+
+
+
+
+ 524
+ 219
+ 149
+ 149
+
+
+
+
+
+
+ true
+
+
+
+
+
+ 47
+ 146
+ 120
+ 120
+
+
+
+
+
+
+ true
+
+
+
+
+
+ 20
+ 20
+ 151
+ 31
+
+
+
+ Very New Address
+
+
+
+ :/icons/add:/icons/add
+
+
+
+
+
+ 20
+ 70
+ 675
+ 362
+
+
+
+
+
+
+ :/images/paper_wallet
+
+
+
+
+
+ 212
+ 80
+ 31
+ 341
+
+
+
+
+ Monospace
+ 12
+ 75
+ false
+ true
+
+
+
+
+
+
+
+
+
+ 500
+ 70
+ 31
+ 361
+
+
+
+
+ Monospace
+ 8
+ 50
+ false
+ false
+
+
+
+
+
+
+ getNewAddress
+ paperTemplate
+ publicKey
+ privateKey
+ publicKeyText
+ privateKeyText
+
+
+
+ QRImageWidget
+ QLabel
+
+
+
+ VerticalLabel
+ QLabel
+
+
+
+
+
+
+
+
+
diff --git a/src/qt/utilitydialog.cpp b/src/qt/utilitydialog.cpp
index 66ae2add7..052557015 100644
--- a/src/qt/utilitydialog.cpp
+++ b/src/qt/utilitydialog.cpp
@@ -5,6 +5,7 @@
#include "utilitydialog.h"
#include "ui_aboutdialog.h"
+#include "ui_paperwalletdialog.h"
#include "ui_helpmessagedialog.h"
#include "bitcoingui.h"
@@ -18,6 +19,17 @@
#include
#include
+#ifdef USE_QRCODE
+#include
+#endif
+
+#include
+#include
+#include
+#include
+#include
+
+
/** "About" dialog box */
AboutDialog::AboutDialog(QWidget *parent) :
QDialog(parent),
@@ -56,6 +68,85 @@ void AboutDialog::on_buttonBox_accepted()
close();
}
+/** "PaperWallet" dialog box */
+PaperWalletDialog::PaperWalletDialog(QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::PaperWalletDialog)
+{
+ ui->setupUi(this);
+
+}
+
+void PaperWalletDialog::setModel(ClientModel *model)
+{
+ RandAddSeed();
+ this->on_getNewAddress_clicked();
+}
+
+PaperWalletDialog::~PaperWalletDialog()
+{
+ delete ui;
+}
+
+void PaperWalletDialog::on_getNewAddress_clicked()
+{
+ CKey newKey;
+ newKey.MakeNewKey(false);
+ CPubKey pub = newKey.GetPubKey();
+ CBitcoinAddress myaddr;
+ myaddr.Set(pub.GetID());
+ string myPubKey;
+ string myPrivKey;
+
+ myPubKey = myaddr.ToString();
+ myPrivKey = CBitcoinSecret(newKey).ToString();
+
+ QRcode *code = QRcode_encodeString(myPubKey.c_str(), 0, QR_ECLEVEL_L, QR_MODE_8, 1);
+ if (!code)
+ {
+ ui->publicKey->setText(tr("Error encoding URI into QR Code."));
+ return;
+ }
+ QImage myImage = QImage(code->width + 8, code->width + 8, QImage::Format_RGB32);
+ myImage.fill(0xffffff);
+ unsigned char *p = code->data;
+ for (int y = 0; y < code->width; y++)
+ {
+ for (int x = 0; x < code->width; x++)
+ {
+ myImage.setPixel(x + 4, y + 4, ((*p & 1) ? 0x0 : 0xffffff));
+ p++;
+ }
+ }
+ QRcode_free(code);
+
+ ui->publicKey->setPixmap(QPixmap::fromImage(myImage).scaled(125, 125));
+ ui->publicKeyText->setText(tr(myPubKey.c_str()));
+
+ QRcode *codePriv = QRcode_encodeString(myPrivKey.c_str(), 0, QR_ECLEVEL_L, QR_MODE_8, 1);
+ if (!codePriv)
+ {
+ ui->privateKey->setText(tr("Error encoding URI into QR Code."));
+ return;
+ }
+ QImage myImagePriv = QImage(codePriv->width + 8, codePriv->width + 8, QImage::Format_RGB32);
+ myImagePriv.fill(0xffffff);
+ unsigned char *p2 = codePriv->data;
+ for (int y2 = 0; y2 < codePriv->width; y2++)
+ {
+ for (int x2 = 0; x2 < codePriv->width; x2++)
+ {
+ myImagePriv.setPixel(x2 + 4, y2 + 4, ((*p2 & 1) ? 0x0 : 0xffffff));
+ p2++;
+ }
+ }
+ QRcode_free(codePriv);
+
+ ui->privateKey->setPixmap(QPixmap::fromImage(myImagePriv).scaled(140, 140));
+ ui->privateKeyText->setText(tr(myPrivKey.c_str()));
+
+}
+
/** "Help message" dialog box */
HelpMessageDialog::HelpMessageDialog(QWidget *parent) :
QDialog(parent),
diff --git a/src/qt/utilitydialog.h b/src/qt/utilitydialog.h
index 874daf6a7..b0085ced5 100644
--- a/src/qt/utilitydialog.h
+++ b/src/qt/utilitydialog.h
@@ -13,6 +13,7 @@ class ClientModel;
namespace Ui {
class AboutDialog;
+ class PaperWalletDialog;
class HelpMessageDialog;
}
@@ -34,6 +35,24 @@ private slots:
void on_buttonBox_accepted();
};
+/** "Paper Wallet" dialog box */
+class PaperWalletDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit PaperWalletDialog(QWidget *parent);
+ ~PaperWalletDialog();
+
+ void setModel(ClientModel *model);
+
+private:
+ Ui::PaperWalletDialog *ui;
+
+private slots:
+ void on_getNewAddress_clicked();
+};
+
/** "Help message" dialog box */
class HelpMessageDialog : public QDialog
{
diff --git a/src/qt/verticallabel.cpp b/src/qt/verticallabel.cpp
new file mode 100644
index 000000000..f106c458b
--- /dev/null
+++ b/src/qt/verticallabel.cpp
@@ -0,0 +1,41 @@
+#include "verticallabel.h"
+
+#include
+
+VerticalLabel::VerticalLabel(QWidget *parent)
+ : QLabel(parent)
+{
+
+}
+
+VerticalLabel::VerticalLabel(const QString &text, QWidget *parent)
+: QLabel(text, parent)
+{
+}
+
+VerticalLabel::~VerticalLabel()
+{
+}
+
+void VerticalLabel::paintEvent(QPaintEvent*)
+{
+ QPainter painter(this);
+ painter.setPen(Qt::black);
+ painter.setBrush(Qt::Dense1Pattern);
+ painter.translate(width()/2,height());
+ painter.rotate(270);
+
+ painter.drawText(0,0, text());
+}
+
+QSize VerticalLabel::minimumSizeHint() const
+{
+ QSize s = QLabel::minimumSizeHint();
+ return QSize(s.height(), s.width());
+}
+
+QSize VerticalLabel::sizeHint() const
+{
+ QSize s = QLabel::sizeHint();
+ return QSize(s.height(), s.width());
+}
diff --git a/src/qt/verticallabel.h b/src/qt/verticallabel.h
new file mode 100644
index 000000000..40eff3d1c
--- /dev/null
+++ b/src/qt/verticallabel.h
@@ -0,0 +1,21 @@
+#ifndef VERTICALLABEL_H
+#define VERTICALLABEL_H
+
+#include
+
+class VerticalLabel : public QLabel
+{
+ Q_OBJECT
+
+public:
+ explicit VerticalLabel(QWidget *parent=0);
+ explicit VerticalLabel(const QString &text, QWidget *parent=0);
+ ~VerticalLabel();
+
+protected:
+ void paintEvent(QPaintEvent*);
+ QSize sizeHint() const ;
+ QSize minimumSizeHint() const;
+};
+
+#endif // VERTICALLABEL_H