diff options
Diffstat (limited to 'src/qt')
-rw-r--r-- | src/qt/Makefile.am | 9 | ||||
-rw-r--r-- | src/qt/aboutdialog.cpp | 38 | ||||
-rw-r--r-- | src/qt/aboutdialog.h | 34 | ||||
-rw-r--r-- | src/qt/bitcoin.cpp | 17 | ||||
-rw-r--r-- | src/qt/bitcoingui.cpp | 2 | ||||
-rw-r--r-- | src/qt/forms/aboutdialog.ui | 16 | ||||
-rw-r--r-- | src/qt/forms/helpmessagedialog.ui | 128 | ||||
-rw-r--r-- | src/qt/forms/receivecoinsdialog.ui | 6 | ||||
-rw-r--r-- | src/qt/guiutil.cpp | 41 | ||||
-rw-r--r-- | src/qt/guiutil.h | 20 | ||||
-rw-r--r-- | src/qt/receivecoinsdialog.cpp | 2 | ||||
-rw-r--r-- | src/qt/recentrequeststablemodel.cpp | 78 | ||||
-rw-r--r-- | src/qt/recentrequeststablemodel.h | 45 | ||||
-rw-r--r-- | src/qt/rpcconsole.cpp | 5 | ||||
-rw-r--r-- | src/qt/utilitydialog.cpp | 125 | ||||
-rw-r--r-- | src/qt/utilitydialog.h | 69 | ||||
-rw-r--r-- | src/qt/walletmodel.cpp | 24 | ||||
-rw-r--r-- | src/qt/walletmodel.h | 42 |
18 files changed, 533 insertions, 168 deletions
diff --git a/src/qt/Makefile.am b/src/qt/Makefile.am index 274cebcf3a..cac6039663 100644 --- a/src/qt/Makefile.am +++ b/src/qt/Makefile.am @@ -80,6 +80,7 @@ QT_FORMS_UI = \ forms/askpassphrasedialog.ui \ forms/coincontroldialog.ui \ forms/editaddressdialog.ui \ + forms/helpmessagedialog.ui \ forms/intro.ui \ forms/openuridialog.ui \ forms/optionsdialog.ui \ @@ -93,7 +94,6 @@ QT_FORMS_UI = \ forms/transactiondescdialog.ui QT_MOC_CPP = \ - moc_aboutdialog.cpp \ moc_addressbookpage.cpp \ moc_addresstablemodel.cpp \ moc_askpassphrasedialog.cpp \ @@ -133,6 +133,7 @@ QT_MOC_CPP = \ moc_transactionfilterproxy.cpp \ moc_transactiontablemodel.cpp \ moc_transactionview.cpp \ + moc_utilitydialog.cpp \ moc_walletframe.cpp \ moc_walletmodel.cpp \ moc_walletview.cpp @@ -155,7 +156,6 @@ PROTOBUF_H = paymentrequest.pb.h PROTOBUF_PROTO = paymentrequest.proto BITCOIN_QT_H = \ - aboutdialog.h \ addressbookpage.h \ addresstablemodel.h \ askpassphrasedialog.h \ @@ -198,6 +198,7 @@ BITCOIN_QT_H = \ transactionrecord.h \ transactiontablemodel.h \ transactionview.h \ + utilitydialog.h \ walletframe.h \ walletmodel.h \ walletmodeltransaction.h \ @@ -248,7 +249,6 @@ RES_ICONS = \ res/icons/tx_mined.png BITCOIN_QT_CPP = \ - aboutdialog.cpp \ bitcoin.cpp \ bitcoinaddressvalidator.cpp \ bitcoinamountfield.cpp \ @@ -267,7 +267,8 @@ BITCOIN_QT_CPP = \ rpcconsole.cpp \ signverifymessagedialog.cpp \ splashscreen.cpp \ - trafficgraphwidget.cpp + trafficgraphwidget.cpp \ + utilitydialog.cpp if ENABLE_WALLET BITCOIN_QT_CPP += \ diff --git a/src/qt/aboutdialog.cpp b/src/qt/aboutdialog.cpp deleted file mode 100644 index 6581a19c18..0000000000 --- a/src/qt/aboutdialog.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) 2011-2013 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#include "aboutdialog.h" -#include "ui_aboutdialog.h" - -#include "clientmodel.h" - -#include "clientversion.h" - -AboutDialog::AboutDialog(QWidget *parent) : - QDialog(parent), - ui(new Ui::AboutDialog) -{ - ui->setupUi(this); - - // Set current copyright year - ui->copyrightLabel->setText(tr("Copyright") + QString(" © 2009-%1 ").arg(COPYRIGHT_YEAR) + tr("The Bitcoin Core developers")); -} - -void AboutDialog::setModel(ClientModel *model) -{ - if(model) - { - ui->versionLabel->setText(model->formatFullVersion()); - } -} - -AboutDialog::~AboutDialog() -{ - delete ui; -} - -void AboutDialog::on_buttonBox_accepted() -{ - close(); -} diff --git a/src/qt/aboutdialog.h b/src/qt/aboutdialog.h deleted file mode 100644 index 1b131c4dcc..0000000000 --- a/src/qt/aboutdialog.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) 2011-2013 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#ifndef ABOUTDIALOG_H -#define ABOUTDIALOG_H - -#include <QDialog> - -class ClientModel; - -namespace Ui { - class AboutDialog; -} - -/** "About" dialog box */ -class AboutDialog : public QDialog -{ - Q_OBJECT - -public: - explicit AboutDialog(QWidget *parent); - ~AboutDialog(); - - void setModel(ClientModel *model); - -private: - Ui::AboutDialog *ui; - -private slots: - void on_buttonBox_accepted(); -}; - -#endif // ABOUTDIALOG_H diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp index 3cf7e53c02..848e50deb0 100644 --- a/src/qt/bitcoin.cpp +++ b/src/qt/bitcoin.cpp @@ -14,6 +14,7 @@ #include "intro.h" #include "optionsmodel.h" #include "splashscreen.h" +#include "utilitydialog.h" #ifdef ENABLE_WALLET #include "paymentserver.h" #include "walletmodel.h" @@ -36,8 +37,6 @@ #include <QTimer> #include <QTranslator> #include <QThread> -#include <QVBoxLayout> -#include <QLabel> #if defined(QT_STATICPLUGIN) #include <QtPlugin> @@ -356,17 +355,7 @@ void BitcoinApplication::requestShutdown() clientModel = 0; // Show a simple window indicating shutdown status - QWidget *shutdownWindow = new QWidget(); - QVBoxLayout *layout = new QVBoxLayout(); - layout->addWidget(new QLabel( - tr("Bitcoin Core is shutting down...") + "<br /><br />" + - tr("Do not shut down the computer until this window disappears."))); - shutdownWindow->setLayout(layout); - - // Center shutdown window at where main window was - const QPoint global = window->mapToGlobal(window->rect().center()); - shutdownWindow->move(global.x() - shutdownWindow->width() / 2, global.y() - shutdownWindow->height() / 2); - shutdownWindow->show(); + ShutdownWindow::showShutdownWindow(window); // Request shutdown from core thread emit requestedShutdown(); @@ -503,7 +492,7 @@ int main(int argc, char *argv[]) // but before showing splash screen. if (mapArgs.count("-?") || mapArgs.count("--help")) { - GUIUtil::HelpMessageBox help; + HelpMessageDialog help(NULL); help.showOrPrint(); return 1; } diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index 692fb6dc1d..1008ef2b08 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -4,7 +4,6 @@ #include "bitcoingui.h" -#include "aboutdialog.h" #include "bitcoinunits.h" #include "clientmodel.h" #include "guiconstants.h" @@ -14,6 +13,7 @@ #include "optionsdialog.h" #include "optionsmodel.h" #include "rpcconsole.h" +#include "utilitydialog.h" #ifdef ENABLE_WALLET #include "walletframe.h" #include "walletmodel.h" diff --git a/src/qt/forms/aboutdialog.ui b/src/qt/forms/aboutdialog.ui index 10a5857cab..3ab4675bf3 100644 --- a/src/qt/forms/aboutdialog.ui +++ b/src/qt/forms/aboutdialog.ui @@ -160,12 +160,12 @@ This product includes software developed by the OpenSSL Project for use in the O <slot>accept()</slot> <hints> <hint type="sourcelabel"> - <x>360</x> - <y>308</y> + <x>20</x> + <y>20</y> </hint> <hint type="destinationlabel"> - <x>157</x> - <y>274</y> + <x>20</x> + <y>20</y> </hint> </hints> </connection> @@ -176,12 +176,12 @@ This product includes software developed by the OpenSSL Project for use in the O <slot>reject()</slot> <hints> <hint type="sourcelabel"> - <x>428</x> - <y>308</y> + <x>20</x> + <y>20</y> </hint> <hint type="destinationlabel"> - <x>286</x> - <y>274</y> + <x>20</x> + <y>20</y> </hint> </hints> </connection> diff --git a/src/qt/forms/helpmessagedialog.ui b/src/qt/forms/helpmessagedialog.ui new file mode 100644 index 0000000000..f68fea7e64 --- /dev/null +++ b/src/qt/forms/helpmessagedialog.ui @@ -0,0 +1,128 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>HelpMessageDialog</class> + <widget class="QDialog" name="HelpMessageDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>800</width> + <height>400</height> + </rect> + </property> + <property name="font"> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property name="windowTitle"> + <string>Bitcoin Core - Command-line options</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QLabel" name="graphic"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Ignored"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="pixmap"> + <pixmap resource="../bitcoin.qrc">:/images/about</pixmap> + </property> + </widget> + </item> + <item> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QScrollArea" name="scrollArea"> + <property name="verticalScrollBarPolicy"> + <enum>Qt::ScrollBarAlwaysOn</enum> + </property> + <property name="widgetResizable"> + <bool>true</bool> + </property> + <widget class="QWidget" name="scrollAreaWidgetContents"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>659</width> + <height>348</height> + </rect> + </property> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="QLabel" name="helpMessageLabel"> + <property name="font"> + <font> + <family>Terminal</family> + </font> + </property> + <property name="cursor"> + <cursorShape>IBeamCursor</cursorShape> + </property> + <property name="textFormat"> + <enum>Qt::PlainText</enum> + </property> + <property name="textInteractionFlags"> + <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set> + </property> + </widget> + </item> + </layout> + </widget> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="okButton"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + <resources> + <include location="../bitcoin.qrc"/> + </resources> + <connections> + <connection> + <sender>okButton</sender> + <signal>accepted()</signal> + <receiver>HelpMessageDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>20</x> + <y>20</y> + </hint> + <hint type="destinationlabel"> + <x>20</x> + <y>20</y> + </hint> + </hints> + </connection> + <connection> + <sender>okButton</sender> + <signal>rejected()</signal> + <receiver>HelpMessageDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>20</x> + <y>20</y> + </hint> + <hint type="destinationlabel"> + <x>20</x> + <y>20</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/qt/forms/receivecoinsdialog.ui b/src/qt/forms/receivecoinsdialog.ui index 8242763e77..7bf01224ee 100644 --- a/src/qt/forms/receivecoinsdialog.ui +++ b/src/qt/forms/receivecoinsdialog.ui @@ -207,7 +207,11 @@ </widget> </item> <item> - <widget class="QTableView" name="recentRequestsView"/> + <widget class="QTableView" name="recentRequestsView"> + <property name="sortingEnabled"> + <bool>true</bool> + </property> + </widget> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_2"> diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp index b87498402d..2d8a6afe21 100644 --- a/src/qt/guiutil.cpp +++ b/src/qt/guiutil.cpp @@ -591,47 +591,6 @@ void restoreWindowGeometry(const QString& strSetting, const QSize& defaultSize, parent->move(pos); } -HelpMessageBox::HelpMessageBox(QWidget *parent) : - QMessageBox(parent) -{ - header = tr("Bitcoin Core") + " " + tr("version") + " " + - QString::fromStdString(FormatFullVersion()) + "\n\n" + - tr("Usage:") + "\n" + - " bitcoin-qt [" + tr("command-line options") + "] " + "\n"; - - coreOptions = QString::fromStdString(HelpMessage(HMM_BITCOIN_QT)); - - uiOptions = tr("UI options") + ":\n" + - " -lang=<lang> " + tr("Set language, for example \"de_DE\" (default: system locale)") + "\n" + - " -min " + tr("Start minimized") + "\n" + - " -splash " + tr("Show splash screen on startup (default: 1)") + "\n" + - " -choosedatadir " + tr("Choose data directory on startup (default: 0)") + "\n"; - - setWindowTitle(tr("Bitcoin Core")); - setTextFormat(Qt::PlainText); - // setMinimumWidth is ignored for QMessageBox so put in non-breaking spaces to make it wider. - setText(header + QString(QChar(0x2003)).repeated(50)); - setDetailedText(coreOptions + "\n" + uiOptions); -} - -void HelpMessageBox::printToConsole() -{ - // On other operating systems, the expected action is to print the message to the console. - QString strUsage = header + "\n" + coreOptions + "\n" + uiOptions; - fprintf(stdout, "%s", strUsage.toStdString().c_str()); -} - -void HelpMessageBox::showOrPrint() -{ -#if defined(WIN32) - // On Windows, show a message box, as there is no stderr/stdout in windowed applications - exec(); -#else - // On other operating systems, print help text to console - printToConsole(); -#endif -} - void setClipboard(const QString& str) { QApplication::clipboard()->setText(str, QClipboard::Clipboard); diff --git a/src/qt/guiutil.h b/src/qt/guiutil.h index 14d4ff17c1..c894850a91 100644 --- a/src/qt/guiutil.h +++ b/src/qt/guiutil.h @@ -123,26 +123,6 @@ namespace GUIUtil /** Restore window size and position */ void restoreWindowGeometry(const QString& strSetting, const QSize &defaultSizeIn, QWidget *parent); - /** Help message for Bitcoin-Qt, shown with --help. */ - class HelpMessageBox : public QMessageBox - { - Q_OBJECT - - public: - HelpMessageBox(QWidget *parent = 0); - - /** Show message box or print help message to standard output, based on operating system. */ - void showOrPrint(); - - /** Print help message to console */ - void printToConsole(); - - private: - QString header; - QString coreOptions; - QString uiOptions; - }; - } // namespace GUIUtil #endif // GUIUTIL_H diff --git a/src/qt/receivecoinsdialog.cpp b/src/qt/receivecoinsdialog.cpp index 075a16dabf..38dc88f63b 100644 --- a/src/qt/receivecoinsdialog.cpp +++ b/src/qt/receivecoinsdialog.cpp @@ -55,6 +55,8 @@ void ReceiveCoinsDialog::setModel(WalletModel *model) ui->recentRequestsView->horizontalHeader()->setSectionResizeMode(RecentRequestsTableModel::Message, QHeaderView::Stretch); #endif ui->recentRequestsView->horizontalHeader()->resizeSection(RecentRequestsTableModel::Amount, 100); + + model->getRecentRequestsTableModel()->sort(RecentRequestsTableModel::Date, Qt::DescendingOrder); } } diff --git a/src/qt/recentrequeststablemodel.cpp b/src/qt/recentrequeststablemodel.cpp index 86c29dd02b..74b43f1d24 100644 --- a/src/qt/recentrequeststablemodel.cpp +++ b/src/qt/recentrequeststablemodel.cpp @@ -12,6 +12,13 @@ RecentRequestsTableModel::RecentRequestsTableModel(CWallet *wallet, WalletModel walletModel(parent) { Q_UNUSED(wallet); + nReceiveRequestsMaxId = 0; + + // Load entries from wallet + std::vector<std::string> vReceiveRequests; + parent->loadReceiveRequests(vReceiveRequests); + BOOST_FOREACH(const std::string& request, vReceiveRequests) + addNewRequest(request); /* These columns must match the indices in the ColumnIndex enumeration */ columns << tr("Date") << tr("Label") << tr("Message") << tr("Amount"); @@ -104,6 +111,14 @@ bool RecentRequestsTableModel::removeRows(int row, int count, const QModelIndex if(count > 0 && row >= 0 && (row+count) <= list.size()) { + const RecentRequestEntry *rec; + for (int i = 0; i < count; ++i) + { + rec = &list[row+i]; + if (!walletModel->saveReceiveRequest(rec->recipient.address.toStdString(), rec->id, "")) + return false; + } + beginRemoveRows(parent, row, row + count - 1); list.erase(list.begin() + row, list.begin() + row + count); endRemoveRows(); @@ -118,12 +133,73 @@ Qt::ItemFlags RecentRequestsTableModel::flags(const QModelIndex &index) const return Qt::ItemIsSelectable | Qt::ItemIsEnabled; } +// called when adding a request from the GUI void RecentRequestsTableModel::addNewRequest(const SendCoinsRecipient &recipient) { RecentRequestEntry newEntry; + newEntry.id = ++nReceiveRequestsMaxId; newEntry.date = QDateTime::currentDateTime(); newEntry.recipient = recipient; + + CDataStream ss(SER_DISK, CLIENT_VERSION); + ss << newEntry; + + if (!walletModel->saveReceiveRequest(recipient.address.toStdString(), newEntry.id, ss.str())) + return; + + addNewRequest(newEntry); +} + +// called from ctor when loading from wallet +void RecentRequestsTableModel::addNewRequest(const std::string &recipient) +{ + std::vector<char> data(recipient.begin(), recipient.end()); + CDataStream ss(data, SER_DISK, CLIENT_VERSION); + + RecentRequestEntry entry; + ss >> entry; + + if (entry.id == 0) // should not happen + return; + + if (entry.id > nReceiveRequestsMaxId) + nReceiveRequestsMaxId = entry.id; + + addNewRequest(entry); +} + +// actually add to table in GUI +void RecentRequestsTableModel::addNewRequest(RecentRequestEntry &recipient) +{ beginInsertRows(QModelIndex(), 0, 0); - list.prepend(newEntry); + list.prepend(recipient); endInsertRows(); } + +void RecentRequestsTableModel::sort(int column, Qt::SortOrder order) +{ + qSort(list.begin(), list.end(), RecentRequestEntryLessThan(column, order)); + emit dataChanged(index(0, 0, QModelIndex()), index(list.size() - 1, NUMBER_OF_COLUMNS - 1, QModelIndex())); +} + +bool RecentRequestEntryLessThan::operator()(RecentRequestEntry &left, RecentRequestEntry &right) const +{ + RecentRequestEntry *pLeft = &left; + RecentRequestEntry *pRight = &right; + if (order == Qt::DescendingOrder) + std::swap(pLeft, pRight); + + switch(column) + { + case RecentRequestsTableModel::Date: + return pLeft->date.toTime_t() < pRight->date.toTime_t(); + case RecentRequestsTableModel::Label: + return pLeft->recipient.label < pRight->recipient.label; + case RecentRequestsTableModel::Message: + return pLeft->recipient.message < pRight->recipient.message; + case RecentRequestsTableModel::Amount: + return pLeft->recipient.amount < pRight->recipient.amount; + default: + return pLeft->id < pRight->id; + } +} diff --git a/src/qt/recentrequeststablemodel.h b/src/qt/recentrequeststablemodel.h index 3aab7b0a48..6b20402f78 100644 --- a/src/qt/recentrequeststablemodel.h +++ b/src/qt/recentrequeststablemodel.h @@ -13,10 +13,44 @@ class CWallet; -struct RecentRequestEntry +class RecentRequestEntry { +public: + RecentRequestEntry() : nVersion(RecentRequestEntry::CURRENT_VERSION), id(0) { } + + static const int CURRENT_VERSION=1; + int nVersion; + int64_t id; QDateTime date; SendCoinsRecipient recipient; + + IMPLEMENT_SERIALIZE + ( + RecentRequestEntry* pthis = const_cast<RecentRequestEntry*>(this); + + unsigned int nDate = date.toTime_t(); + + READWRITE(pthis->nVersion); + nVersion = pthis->nVersion; + READWRITE(id); + READWRITE(nDate); + READWRITE(recipient); + + if (fRead) + pthis->date = QDateTime::fromTime_t(nDate); + ) +}; + +class RecentRequestEntryLessThan +{ +public: + RecentRequestEntryLessThan(int nColumn, Qt::SortOrder fOrder): + column(nColumn), order(fOrder) {} + bool operator()(RecentRequestEntry &left, RecentRequestEntry &right ) const; + +private: + int column; + Qt::SortOrder order; }; /** Model for list of recently generated payment requests / bitcoin URIs. @@ -34,7 +68,8 @@ public: Date = 0, Label = 1, Message = 2, - Amount = 3 + Amount = 3, + NUMBER_OF_COLUMNS }; /** @name Methods overridden from QAbstractTableModel @@ -51,11 +86,17 @@ public: const RecentRequestEntry &entry(int row) const { return list[row]; } void addNewRequest(const SendCoinsRecipient &recipient); + void addNewRequest(const std::string &recipient); + void addNewRequest(RecentRequestEntry &recipient); + +public slots: + void sort(int column, Qt::SortOrder order = Qt::AscendingOrder); private: WalletModel *walletModel; QStringList columns; QList<RecentRequestEntry> list; + int64_t nReceiveRequestsMaxId; }; #endif diff --git a/src/qt/rpcconsole.cpp b/src/qt/rpcconsole.cpp index a8470572dd..abb6ceb139 100644 --- a/src/qt/rpcconsole.cpp +++ b/src/qt/rpcconsole.cpp @@ -7,6 +7,7 @@ #include "clientmodel.h" #include "guiutil.h" +#include "utilitydialog.h" #include "rpcserver.h" #include "rpcclient.h" @@ -443,8 +444,8 @@ void RPCConsole::scrollToEnd() void RPCConsole::on_showCLOptionsButton_clicked() { - GUIUtil::HelpMessageBox help; - help.exec(); + HelpMessageDialog *help = new HelpMessageDialog(this); + help->show(); } void RPCConsole::on_sldGraphRange_valueChanged(int value) diff --git a/src/qt/utilitydialog.cpp b/src/qt/utilitydialog.cpp new file mode 100644 index 0000000000..05a01c7445 --- /dev/null +++ b/src/qt/utilitydialog.cpp @@ -0,0 +1,125 @@ +// Copyright (c) 2011-2014 The Bitcoin developers +// Distributed under the MIT/X11 software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "utilitydialog.h" + +#include "ui_aboutdialog.h" +#include "ui_helpmessagedialog.h" + +#include "bitcoingui.h" +#include "clientmodel.h" +#include "guiutil.h" + +#include "clientversion.h" +#include "init.h" +#include "util.h" + +#include <QLabel> +#include <QVBoxLayout> + +/** "About" dialog box */ +AboutDialog::AboutDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::AboutDialog) +{ + ui->setupUi(this); + + // Set current copyright year + ui->copyrightLabel->setText(tr("Copyright") + QString(" © 2009-%1 ").arg(COPYRIGHT_YEAR) + tr("The Bitcoin Core developers")); +} + +void AboutDialog::setModel(ClientModel *model) +{ + if(model) + { + ui->versionLabel->setText(model->formatFullVersion()); + } +} + +AboutDialog::~AboutDialog() +{ + delete ui; +} + +void AboutDialog::on_buttonBox_accepted() +{ + close(); +} + +/** "Help message" dialog box */ +HelpMessageDialog::HelpMessageDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::HelpMessageDialog) +{ + ui->setupUi(this); + GUIUtil::restoreWindowGeometry("nHelpMessageDialogWindow", this->size(), this); + + header = tr("Bitcoin Core") + " " + tr("version") + " " + + QString::fromStdString(FormatFullVersion()) + "\n\n" + + tr("Usage:") + "\n" + + " bitcoin-qt [" + tr("command-line options") + "] " + "\n"; + + coreOptions = QString::fromStdString(HelpMessage(HMM_BITCOIN_QT)); + + uiOptions = tr("UI options") + ":\n" + + " -lang=<lang> " + tr("Set language, for example \"de_DE\" (default: system locale)") + "\n" + + " -min " + tr("Start minimized") + "\n" + + " -splash " + tr("Show splash screen on startup (default: 1)") + "\n" + + " -choosedatadir " + tr("Choose data directory on startup (default: 0)"); + + ui->helpMessageLabel->setFont(GUIUtil::bitcoinAddressFont()); + + // Set help message text + ui->helpMessageLabel->setText(header + "\n" + coreOptions + "\n" + uiOptions); +} + +HelpMessageDialog::~HelpMessageDialog() +{ + GUIUtil::saveWindowGeometry("nHelpMessageDialogWindow", this); + delete ui; +} + +void HelpMessageDialog::printToConsole() +{ + // On other operating systems, the expected action is to print the message to the console. + QString strUsage = header + "\n" + coreOptions + "\n" + uiOptions; + fprintf(stdout, "%s", strUsage.toStdString().c_str()); +} + +void HelpMessageDialog::showOrPrint() +{ +#if defined(WIN32) + // On Windows, show a message box, as there is no stderr/stdout in windowed applications + exec(); +#else + // On other operating systems, print help text to console + printToConsole(); +#endif +} + +void HelpMessageDialog::on_okButton_accepted() +{ + close(); +} + + +/** "Shutdown" window */ +void ShutdownWindow::showShutdownWindow(BitcoinGUI *window) +{ + if (!window) + return; + + // Show a simple window indicating shutdown status + QWidget *shutdownWindow = new QWidget(); + QVBoxLayout *layout = new QVBoxLayout(); + layout->addWidget(new QLabel( + tr("Bitcoin Core is shutting down...") + "<br /><br />" + + tr("Do not shut down the computer until this window disappears."))); + shutdownWindow->setLayout(layout); + + // Center shutdown window at where main window was + const QPoint global = window->mapToGlobal(window->rect().center()); + shutdownWindow->move(global.x() - shutdownWindow->width() / 2, global.y() - shutdownWindow->height() / 2); + shutdownWindow->show(); +} diff --git a/src/qt/utilitydialog.h b/src/qt/utilitydialog.h new file mode 100644 index 0000000000..874daf6a7f --- /dev/null +++ b/src/qt/utilitydialog.h @@ -0,0 +1,69 @@ +// Copyright (c) 2011-2014 The Bitcoin developers +// Distributed under the MIT/X11 software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef UTILITYDIALOG_H +#define UTILITYDIALOG_H + +#include <QDialog> +#include <QObject> + +class BitcoinGUI; +class ClientModel; + +namespace Ui { + class AboutDialog; + class HelpMessageDialog; +} + +/** "About" dialog box */ +class AboutDialog : public QDialog +{ + Q_OBJECT + +public: + explicit AboutDialog(QWidget *parent); + ~AboutDialog(); + + void setModel(ClientModel *model); + +private: + Ui::AboutDialog *ui; + +private slots: + void on_buttonBox_accepted(); +}; + +/** "Help message" dialog box */ +class HelpMessageDialog : public QDialog +{ + Q_OBJECT + +public: + explicit HelpMessageDialog(QWidget *parent); + ~HelpMessageDialog(); + + void printToConsole(); + void showOrPrint(); + +private: + Ui::HelpMessageDialog *ui; + QString header; + QString coreOptions; + QString uiOptions; + +private slots: + void on_okButton_accepted(); +}; + + +/** "Shutdown" window */ +class ShutdownWindow : public QObject +{ + Q_OBJECT + +public: + static void showShutdownWindow(BitcoinGUI *window); +}; + +#endif // UTILITYDIALOG_H diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index 14f29c933b..01f5a304a9 100644 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -554,3 +554,27 @@ void WalletModel::listLockedCoins(std::vector<COutPoint>& vOutpts) LOCK(wallet->cs_wallet); wallet->ListLockedCoins(vOutpts); } + +void WalletModel::loadReceiveRequests(std::vector<std::string>& vReceiveRequests) +{ + LOCK(wallet->cs_wallet); + BOOST_FOREACH(const PAIRTYPE(CTxDestination, CAddressBookData)& item, wallet->mapAddressBook) + BOOST_FOREACH(const PAIRTYPE(std::string, std::string)& item2, item.second.destdata) + if (item2.first.size() > 2 && item2.first.substr(0,2) == "rr") // receive request + vReceiveRequests.push_back(item2.second); +} + +bool WalletModel::saveReceiveRequest(const std::string &sAddress, const int64_t nId, const std::string &sRequest) +{ + CTxDestination dest = CBitcoinAddress(sAddress).Get(); + + std::stringstream ss; + ss << nId; + std::string key = "rr" + ss.str(); // "rr" prefix = "receive request" in destdata + + LOCK(wallet->cs_wallet); + if (sRequest.empty()) + return wallet->EraseDestData(dest, key); + else + return wallet->AddDestData(dest, key, sRequest); +} diff --git a/src/qt/walletmodel.h b/src/qt/walletmodel.h index 1a4d25615a..600bef346b 100644 --- a/src/qt/walletmodel.h +++ b/src/qt/walletmodel.h @@ -36,9 +36,9 @@ QT_END_NAMESPACE class SendCoinsRecipient { public: - explicit SendCoinsRecipient() : amount(0) { } + explicit SendCoinsRecipient() : amount(0), nVersion(SendCoinsRecipient::CURRENT_VERSION) { } explicit SendCoinsRecipient(const QString &addr, const QString &label, quint64 amount, const QString &message): - address(addr), label(label), amount(amount), message(message) {} + address(addr), label(label), amount(amount), message(message), nVersion(SendCoinsRecipient::CURRENT_VERSION) {} // If from an insecure payment request, this is used for storing // the addresses, e.g. address-A<br />address-B<br />address-C. @@ -55,6 +55,41 @@ public: PaymentRequestPlus paymentRequest; // Empty if no authentication or invalid signature/cert/etc. QString authenticatedMerchant; + + static const int CURRENT_VERSION=1; + int nVersion; + + IMPLEMENT_SERIALIZE + ( + SendCoinsRecipient* pthis = const_cast<SendCoinsRecipient*>(this); + + std::string sAddress = pthis->address.toStdString(); + std::string sLabel = pthis->label.toStdString(); + std::string sMessage = pthis->message.toStdString(); + std::string sPaymentRequest; + if (!fRead && pthis->paymentRequest.IsInitialized()) + pthis->paymentRequest.SerializeToString(&sPaymentRequest); + std::string sAuthenticatedMerchant = pthis->authenticatedMerchant.toStdString(); + + READWRITE(pthis->nVersion); + nVersion = pthis->nVersion; + READWRITE(sAddress); + READWRITE(sLabel); + READWRITE(amount); + READWRITE(sMessage); + READWRITE(sPaymentRequest); + READWRITE(sAuthenticatedMerchant); + + if (fRead) + { + pthis->address = QString::fromStdString(sAddress); + pthis->label = QString::fromStdString(sLabel); + pthis->message = QString::fromStdString(sMessage); + if (!sPaymentRequest.empty()) + pthis->paymentRequest.parse(QByteArray::fromRawData(sPaymentRequest.data(), sPaymentRequest.size())); + pthis->authenticatedMerchant = QString::fromStdString(sAuthenticatedMerchant); + } + ) }; /** Interface to Bitcoin wallet from Qt view code. */ @@ -152,6 +187,9 @@ public: void unlockCoin(COutPoint& output); void listLockedCoins(std::vector<COutPoint>& vOutpts); + void loadReceiveRequests(std::vector<std::string>& vReceiveRequests); + bool saveReceiveRequest(const std::string &sAddress, const int64_t nId, const std::string &sRequest); + private: CWallet *wallet; |