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 +
receiverequestdialog.h
+
+ + VerticalLabel + QLabel +
verticallabel.h
+
+
+ + + + + +
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