From 64c8b6994881ba2715cb08f48b406aaf1f28603c Mon Sep 17 00:00:00 2001 From: "Wladimir J. van der Laan" Date: Tue, 5 Jul 2011 22:09:39 +0200 Subject: [PATCH] tab reorg phase 1: split main gui into "overview" and "history" --- bitcoin-qt.pro | 9 +++-- doc/assets-attribution.txt | 8 ++++- src/qt/bitcoin.qrc | 2 ++ src/qt/bitcoingui.cpp | 55 ++++++++++++++++++++--------- src/qt/bitcoingui.h | 12 ++++++- src/qt/forms/overviewpage.ui | 63 ++++++++++++++++++++++++++++++++++ src/qt/overviewpage.cpp | 32 +++++++++++++++++ src/qt/overviewpage.h | 26 ++++++++++++++ src/qt/res/icons/history.png | Bin 0 -> 746 bytes src/qt/res/icons/overview.png | Bin 0 -> 7015 bytes 10 files changed, 186 insertions(+), 21 deletions(-) create mode 100644 src/qt/forms/overviewpage.ui create mode 100644 src/qt/overviewpage.cpp create mode 100644 src/qt/overviewpage.h create mode 100644 src/qt/res/icons/history.png create mode 100644 src/qt/res/icons/overview.png diff --git a/bitcoin-qt.pro b/bitcoin-qt.pro index 40c0ded6c..a8705c369 100644 --- a/bitcoin-qt.pro +++ b/bitcoin-qt.pro @@ -76,7 +76,8 @@ HEADERS += src/qt/bitcoingui.h \ src/qt/transactionfilterproxy.h \ src/qt/transactionview.h \ src/qt/walletmodel.h \ - src/bitcoinrpc.h + src/bitcoinrpc.h \ + src/qt/overviewpage.h SOURCES += src/qt/bitcoin.cpp src/qt/bitcoingui.cpp \ src/qt/transactiontablemodel.cpp \ src/qt/addresstablemodel.cpp \ @@ -112,7 +113,8 @@ SOURCES += src/qt/bitcoin.cpp src/qt/bitcoingui.cpp \ src/qt/transactionfilterproxy.cpp \ src/qt/transactionview.cpp \ src/qt/walletmodel.cpp \ - src/bitcoinrpc.cpp + src/bitcoinrpc.cpp \ + src/qt/overviewpage.cpp RESOURCES += \ src/qt/bitcoin.qrc @@ -122,7 +124,8 @@ FORMS += \ src/qt/forms/addressbookdialog.ui \ src/qt/forms/aboutdialog.ui \ src/qt/forms/editaddressdialog.ui \ - src/qt/forms/transactiondescdialog.ui + src/qt/forms/transactiondescdialog.ui \ + src/qt/forms/overviewpage.ui CODECFORTR = UTF-8 TRANSLATIONS = src/qt/locale/bitcoin_nl.ts diff --git a/doc/assets-attribution.txt b/doc/assets-attribution.txt index f34c2c91b..d4eb84882 100644 --- a/doc/assets-attribution.txt +++ b/doc/assets-attribution.txt @@ -34,7 +34,7 @@ Designer: http://www.everaldo.com Icon Pack: Crystal SVG License: LGPL -Icon: src/qt/res/icons/receive.png +Icon: src/qt/res/icons/receive.png, src/qt/res/icons/history.png Designer: Oxygen team Icon Pack: Oxygen License: Creative Common Attribution-ShareAlike 3.0 License or LGPL @@ -45,3 +45,9 @@ Designer: Bitboy (optimized for 16x16 by Wladimir van der Laan) License: Public Domain Site: http://forum.bitcoin.org/?topic=1756.0 +Icon: src/qt/res/icons/overview.png +Icon Pack: Primo +Designer: Jack Cai +License: Creative Commons Attribution No Derivatives (by-nd) +Site: http://findicons.com/icon/175944/home?id=176221# + diff --git a/src/qt/bitcoin.qrc b/src/qt/bitcoin.qrc index 2dfc7dd98..20ecd9f30 100644 --- a/src/qt/bitcoin.qrc +++ b/src/qt/bitcoin.qrc @@ -26,6 +26,8 @@ res/icons/toolbar_testnet.png res/icons/edit.png res/icons/editdelete.png + res/icons/history.png + res/icons/overview.png res/images/about.png diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index cd9291ac6..bf4aa320f 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -17,6 +17,7 @@ #include "transactiondescdialog.h" #include "addresstablemodel.h" #include "transactionview.h" +#include "overviewpage.h" #include #include @@ -33,6 +34,7 @@ #include #include #include +#include #include @@ -66,32 +68,28 @@ BitcoinGUI::BitcoinGUI(QWidget *parent): // Toolbar QToolBar *toolbar = addToolBar("Main toolbar"); toolbar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + toolbar->addAction(overviewAction); + toolbar->addAction(historyAction); + toolbar->addSeparator(); toolbar->addAction(sendCoins); toolbar->addAction(receiveCoins); toolbar->addAction(addressbook); - // Balance: - QHBoxLayout *hbox_balance = new QHBoxLayout(); - hbox_balance->addWidget(new QLabel(tr("Balance:"))); - hbox_balance->addSpacing(5);/* Add some spacing between the label and the text */ + overviewPage = new OverviewPage(); - labelBalance = new QLabel(); - labelBalance->setFont(QFont("Monospace", -1, QFont::Bold)); - labelBalance->setToolTip(tr("Your current balance")); - labelBalance->setTextInteractionFlags(Qt::TextSelectableByMouse|Qt::TextSelectableByKeyboard); - hbox_balance->addWidget(labelBalance); - hbox_balance->addStretch(1); - QVBoxLayout *vbox = new QVBoxLayout(); - vbox->addLayout(hbox_balance); transactionView = new TransactionView(this); connect(transactionView, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(transactionDetails(const QModelIndex&))); vbox->addWidget(transactionView); - QWidget *centralwidget = new QWidget(this); - centralwidget->setLayout(vbox); - setCentralWidget(centralwidget); + transactionsPage = new QWidget(this); + transactionsPage->setLayout(vbox); + + centralWidget = new QStackedWidget(this); + centralWidget->addWidget(overviewPage); + centralWidget->addWidget(transactionsPage); + setCentralWidget(centralWidget); // Create status bar statusBar(); @@ -125,10 +123,23 @@ BitcoinGUI::BitcoinGUI(QWidget *parent): statusBar()->addPermanentWidget(labelTransactions); createTrayIcon(); + + gotoOverviewTab(); } void BitcoinGUI::createActions() { + QActionGroup *tabGroup = new QActionGroup(this); + overviewAction = new QAction(QIcon(":/icons/overview"), tr("&Overview"), this); + overviewAction->setCheckable(true); + tabGroup->addAction(overviewAction); + historyAction = new QAction(QIcon(":/icons/history"), tr("&History"), this); + historyAction->setCheckable(true); + tabGroup->addAction(historyAction); + + connect(overviewAction, SIGNAL(triggered()), this, SLOT(gotoOverviewTab())); + connect(historyAction, SIGNAL(triggered()), this, SLOT(gotoHistoryTab())); + quit = new QAction(QIcon(":/icons/quit"), tr("&Exit"), this); quit->setToolTip(tr("Quit application")); sendCoins = new QAction(QIcon(":/icons/send"), tr("&Send coins"), this); @@ -267,7 +278,7 @@ void BitcoinGUI::aboutClicked() void BitcoinGUI::setBalance(qint64 balance) { - labelBalance->setText(GUIUtil::formatMoney(balance) + QString(" BTC")); + overviewPage->setBalance(balance); } void BitcoinGUI::setNumConnections(int count) @@ -399,3 +410,15 @@ void BitcoinGUI::incomingTransaction(const QModelIndex & parent, int start, int QSystemTrayIcon::Information); } } + +void BitcoinGUI::gotoOverviewTab() +{ + overviewAction->setChecked(true); + centralWidget->setCurrentWidget(overviewPage); +} + +void BitcoinGUI::gotoHistoryTab() +{ + historyAction->setChecked(true); + centralWidget->setCurrentWidget(transactionsPage); +} diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h index 046186c56..432a9e3b0 100644 --- a/src/qt/bitcoingui.h +++ b/src/qt/bitcoingui.h @@ -8,6 +8,7 @@ class TransactionTableModel; class ClientModel; class WalletModel; class TransactionView; +class OverviewPage; QT_BEGIN_NAMESPACE class QLabel; @@ -16,6 +17,7 @@ class QTableView; class QAbstractItemModel; class QModelIndex; class QProgressBar; +class QStackedWidget; QT_END_NAMESPACE class BitcoinGUI : public QMainWindow @@ -42,7 +44,10 @@ private: ClientModel *clientModel; WalletModel *walletModel; - QLabel *labelBalance; + QStackedWidget *centralWidget; + OverviewPage *overviewPage; + QWidget *transactionsPage; + QLabel *labelConnections; QLabel *labelConnectionsIcon; QLabel *labelBlocks; @@ -50,6 +55,8 @@ private: QLabel *progressBarLabel; QProgressBar *progressBar; + QAction *overviewAction; + QAction *historyAction; QAction *quit; QAction *sendCoins; QAction *addressbook; @@ -86,6 +93,9 @@ private slots: void trayIconActivated(QSystemTrayIcon::ActivationReason reason); void transactionDetails(const QModelIndex& idx); void incomingTransaction(const QModelIndex & parent, int start, int end); + + void gotoOverviewTab(); + void gotoHistoryTab(); }; #endif diff --git a/src/qt/forms/overviewpage.ui b/src/qt/forms/overviewpage.ui new file mode 100644 index 000000000..ef9c07306 --- /dev/null +++ b/src/qt/forms/overviewpage.ui @@ -0,0 +1,63 @@ + + + OverviewPage + + + + 0 + 0 + 552 + 342 + + + + Form + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + QFormLayout::AllNonFixedFieldsGrow + + + + + Balance + + + + + + + 123.456 BTC + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + diff --git a/src/qt/overviewpage.cpp b/src/qt/overviewpage.cpp new file mode 100644 index 000000000..faed29866 --- /dev/null +++ b/src/qt/overviewpage.cpp @@ -0,0 +1,32 @@ +#include "overviewpage.h" +#include "ui_overviewpage.h" + +#include "guiutil.h" + +OverviewPage::OverviewPage(QWidget *parent) : + QWidget(parent), + ui(new Ui::OverviewPage) +{ + ui->setupUi(this); + + // Balance: + ui->labelBalance->setFont(QFont("Monospace", -1, QFont::Bold)); + ui->labelBalance->setToolTip(tr("Your current balance")); + ui->labelBalance->setTextInteractionFlags(Qt::TextSelectableByMouse|Qt::TextSelectableByKeyboard); + + // Overview page should show: + // Balance + // Unconfirmed balance + // Last received transaction(s) + // Last sent transaction(s) +} + +OverviewPage::~OverviewPage() +{ + delete ui; +} + +void OverviewPage::setBalance(qint64 balance) +{ + ui->labelBalance->setText(GUIUtil::formatMoney(balance) + QString(" BTC")); +} diff --git a/src/qt/overviewpage.h b/src/qt/overviewpage.h new file mode 100644 index 000000000..85b927b83 --- /dev/null +++ b/src/qt/overviewpage.h @@ -0,0 +1,26 @@ +#ifndef OVERVIEWPAGE_H +#define OVERVIEWPAGE_H + +#include + +namespace Ui { + class OverviewPage; +} + +class OverviewPage : public QWidget +{ + Q_OBJECT + +public: + explicit OverviewPage(QWidget *parent = 0); + ~OverviewPage(); + +public slots: + void setBalance(qint64 balance); + +private: + Ui::OverviewPage *ui; + +}; + +#endif // OVERVIEWPAGE_H diff --git a/src/qt/res/icons/history.png b/src/qt/res/icons/history.png new file mode 100644 index 0000000000000000000000000000000000000000..60f135178360930a102923bdc1fff925b95bf842 GIT binary patch literal 746 zcmVf#Esx(;>0l_lEBD_ zK8+xVAYKy<5y6##M8pB`<%b4r$tq{ z%rKWq2j<-1=;-@55m~+nsH*NSE?&D43CQz&d12uy^YgWt!n@rbCnrDsjd}t7exEGM z$g-L8J*z}OPL}`W-lNt%OwfO0a#kPPQ6|Sz*>v7mORh>*rlra1fsdB z`ZeLP*Xwb7{G&?1paKpKV2nXkG3I=`P*p@Ex=6U0x!=l;wOXxE>5(l+;clMic|k}h zCKX_e!CG4_AT{B$=PybHrLo>>Mnbkf?E$d5atDCDFJA$;d+R15Qs5Lk;Nt1yN6~zg zA6z_GU5UKWY~1#1M5MqO`ziQWewf$;sfZ9XjUOrnq_5>F4?O9#Be)w|YXNw_vkMGb z0kE_C85p#}Rk2h+cz00rKo}|9g|(LTR?~YxL})b|ktb44rGR1aH+~o*pxDDvB0|u( zen>f$6&QCP=(M+@mc0G&5jfu;oF`h%Mk%MV0>eBIhBKe5!sfJ0#!8*3P2c>Qi07lA8M*si-07*qoM6N<$f`EuiC;$Ke literal 0 HcmV?d00001 diff --git a/src/qt/res/icons/overview.png b/src/qt/res/icons/overview.png new file mode 100644 index 0000000000000000000000000000000000000000..6b94b43a2c05e38edb72d5021ecd40ab4e64ff00 GIT binary patch literal 7015 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 literal 0 HcmV?d00001