From 352083cb2303002233fcb6dd740ff74d4e0f0240 Mon Sep 17 00:00:00 2001 From: "Wladimir J. van der Laan" Date: Sun, 5 Jun 2011 14:19:57 +0200 Subject: [PATCH] Implement Minimize to tray / Minimize on close --- README.rst | 2 - gui/include/bitcoingui.h | 11 ++++-- gui/include/optionsmodel.h | 7 +++- gui/src/bitcoin.cpp | 1 + gui/src/bitcoingui.cpp | 78 +++++++++++++++++++++++++++++--------- gui/src/optionsmodel.cpp | 4 +- 6 files changed, 77 insertions(+), 26 deletions(-) diff --git a/README.rst b/README.rst index 70d3c4186..bb14be60e 100644 --- a/README.rst +++ b/README.rst @@ -26,8 +26,6 @@ This has been implemented: This has to be done: -- Minimize to tray / Minimize on close - - Start at system start - Internationalization (convert WX language files) diff --git a/gui/include/bitcoingui.h b/gui/include/bitcoingui.h index 955d7b478..8b45dace0 100644 --- a/gui/include/bitcoingui.h +++ b/gui/include/bitcoingui.h @@ -27,6 +27,11 @@ public: Sent = 2, Received = 3 } TabIndex; + +protected: + void changeEvent(QEvent *e); + void closeEvent(QCloseEvent *event); + private: TransactionTableModel *transaction_model; ClientModel *model; @@ -41,9 +46,9 @@ private: QAction *sendcoins; QAction *addressbook; QAction *about; - QAction *receiving_addresses; + QAction *receivingAddresses; QAction *options; - QAction *openBitCoin; + QAction *openBitcoin; QSystemTrayIcon *trayIcon; @@ -64,9 +69,9 @@ private slots: void optionsClicked(); void receivingAddressesClicked(); void aboutClicked(); - void newAddressClicked(); void copyClipboardClicked(); + void trayIconActivated(QSystemTrayIcon::ActivationReason reason); void error(const QString &title, const QString &message); }; diff --git a/gui/include/optionsmodel.h b/gui/include/optionsmodel.h index 4fb6d2514..0124e2ab4 100644 --- a/gui/include/optionsmodel.h +++ b/gui/include/optionsmodel.h @@ -3,7 +3,12 @@ #include -/* Interface from QT to configuration data structure for bitcoin client */ +/* Interface from QT to configuration data structure for bitcoin client. + To QT, the options are presented as a list with the different options + laid out vertically. + This can be changed to a tree once the settings become sufficiently + complex. + */ class OptionsModel : public QAbstractListModel { Q_OBJECT diff --git a/gui/src/bitcoin.cpp b/gui/src/bitcoin.cpp index c843cc406..663590d01 100644 --- a/gui/src/bitcoin.cpp +++ b/gui/src/bitcoin.cpp @@ -11,6 +11,7 @@ int main(int argc, char *argv[]) { QApplication app(argc, argv); + app.setQuitOnLastWindowClosed(false); try { if(AppInit2(argc, argv)) diff --git a/gui/src/bitcoingui.cpp b/gui/src/bitcoingui.cpp index 599649603..b2aee6b31 100644 --- a/gui/src/bitcoingui.cpp +++ b/gui/src/bitcoingui.cpp @@ -12,6 +12,7 @@ #include "clientmodel.h" #include "guiutil.h" #include "editaddressdialog.h" +#include "optionsmodel.h" #include "main.h" @@ -48,26 +49,26 @@ BitcoinGUI::BitcoinGUI(QWidget *parent): createActions(); - /* Menus */ + // Menus QMenu *file = menuBar()->addMenu("&File"); file->addAction(sendcoins); file->addSeparator(); file->addAction(quit); QMenu *settings = menuBar()->addMenu("&Settings"); - settings->addAction(receiving_addresses); + settings->addAction(receivingAddresses); settings->addAction(options); QMenu *help = menuBar()->addMenu("&Help"); help->addAction(about); - /* Toolbar */ + // Toolbar QToolBar *toolbar = addToolBar("Main toolbar"); toolbar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); toolbar->addAction(sendcoins); toolbar->addAction(addressbook); - /* Address:
: New... : Paste to clipboard */ + // Address:
: New... : Paste to clipboard QHBoxLayout *hbox_address = new QHBoxLayout(); hbox_address->addWidget(new QLabel(tr("Your Bitcoin Address:"))); address = new QLineEdit(); @@ -80,7 +81,7 @@ BitcoinGUI::BitcoinGUI(QWidget *parent): hbox_address->addWidget(button_new); hbox_address->addWidget(button_clipboard); - /* Balance: */ + // 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 */ @@ -93,16 +94,15 @@ BitcoinGUI::BitcoinGUI(QWidget *parent): QVBoxLayout *vbox = new QVBoxLayout(); vbox->addLayout(hbox_address); vbox->addLayout(hbox_balance); - - transaction_model = new TransactionTableModel(this); + transaction_model = new TransactionTableModel(this); vbox->addWidget(createTabs()); QWidget *centralwidget = new QWidget(this); centralwidget->setLayout(vbox); setCentralWidget(centralwidget); - /* Create status bar */ + // Create status bar statusBar(); labelConnections = new QLabel(); @@ -121,7 +121,7 @@ BitcoinGUI::BitcoinGUI(QWidget *parent): statusBar()->addPermanentWidget(labelBlocks); statusBar()->addPermanentWidget(labelTransactions); - /* Action bindings */ + // Action bindings connect(button_new, SIGNAL(clicked()), this, SLOT(newAddressClicked())); connect(button_clipboard, SIGNAL(clicked()), this, SLOT(copyClipboardClicked())); @@ -134,22 +134,24 @@ void BitcoinGUI::createActions() sendcoins = new QAction(QIcon(":/icons/send"), tr("&Send coins"), this); addressbook = new QAction(QIcon(":/icons/address-book"), tr("&Address Book"), this); about = new QAction(QIcon(":/icons/bitcoin"), tr("&About"), this); - receiving_addresses = new QAction(QIcon(":/icons/receiving-addresses"), tr("Your &Receiving Addresses..."), this); + receivingAddresses = new QAction(QIcon(":/icons/receiving-addresses"), tr("Your &Receiving Addresses..."), this); options = new QAction(QIcon(":/icons/options"), tr("&Options..."), this); - openBitCoin = new QAction(QIcon(":/icons/bitcoin"), "Open Bitcoin", this); + openBitcoin = new QAction(QIcon(":/icons/bitcoin"), "Open &Bitcoin", this); connect(quit, SIGNAL(triggered()), qApp, SLOT(quit())); connect(sendcoins, SIGNAL(triggered()), this, SLOT(sendcoinsClicked())); connect(addressbook, SIGNAL(triggered()), this, SLOT(addressbookClicked())); - connect(receiving_addresses, SIGNAL(triggered()), this, SLOT(receivingAddressesClicked())); + connect(receivingAddresses, SIGNAL(triggered()), this, SLOT(receivingAddressesClicked())); connect(options, SIGNAL(triggered()), this, SLOT(optionsClicked())); connect(about, SIGNAL(triggered()), this, SLOT(aboutClicked())); + connect(openBitcoin, SIGNAL(triggered()), this, SLOT(show())); } void BitcoinGUI::setModel(ClientModel *model) { this->model = model; + // Keep up to date with client setBalance(model->getBalance()); connect(model, SIGNAL(balanceChanged(qint64)), this, SLOT(setBalance(qint64))); @@ -165,14 +167,14 @@ void BitcoinGUI::setModel(ClientModel *model) setAddress(model->getAddress()); connect(model, SIGNAL(addressChanged(QString)), this, SLOT(setAddress(QString))); - /* Report errors from network/worker thread */ - connect(model, SIGNAL(error(QString,QString)), this, SLOT(error(QString,QString))); + // Report errors from network/worker thread + connect(model, SIGNAL(error(QString,QString)), this, SLOT(error(QString,QString))); } void BitcoinGUI::createTrayIcon() { QMenu *trayIconMenu = new QMenu(this); - trayIconMenu->addAction(openBitCoin); + trayIconMenu->addAction(openBitcoin); trayIconMenu->addAction(sendcoins); trayIconMenu->addAction(options); trayIconMenu->addSeparator(); @@ -181,9 +183,20 @@ void BitcoinGUI::createTrayIcon() trayIcon = new QSystemTrayIcon(this); trayIcon->setContextMenu(trayIconMenu); trayIcon->setIcon(QIcon(":/icons/toolbar")); + connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), + this, SLOT(trayIconActivated(QSystemTrayIcon::ActivationReason))); trayIcon->show(); } +void BitcoinGUI::trayIconActivated(QSystemTrayIcon::ActivationReason reason) +{ + if(reason == QSystemTrayIcon::DoubleClick) + { + // Doubleclick on system tray icon triggers "open bitcoin" + openBitcoin->trigger(); + } +} + QWidget *BitcoinGUI::createTabs() { QStringList tab_filters, tab_labels; @@ -235,6 +248,7 @@ void BitcoinGUI::sendcoinsClicked() SendCoinsDialog dlg; dlg.setModel(model); dlg.exec(); + qDebug() << "After close"; } void BitcoinGUI::addressbookClicked() @@ -273,7 +287,7 @@ void BitcoinGUI::newAddressClicked() if(dlg.exec()) { QString newAddress = dlg.saveCurrentRow(); - /* Set returned address as new default address */ + // Set returned address as new default addres if(!newAddress.isEmpty()) { model->setAddress(newAddress); @@ -283,7 +297,7 @@ void BitcoinGUI::newAddressClicked() void BitcoinGUI::copyClipboardClicked() { - /* Copy text in address to clipboard */ + // Copy text in address to clipboard QApplication::clipboard()->setText(address->text()); } @@ -314,8 +328,36 @@ void BitcoinGUI::setNumTransactions(int count) void BitcoinGUI::error(const QString &title, const QString &message) { - /* Report errors from network/worker thread */ + // Report errors from network/worker thread QMessageBox::critical(this, title, message, QMessageBox::Ok, QMessageBox::Ok); } + +void BitcoinGUI::changeEvent(QEvent *e) +{ + if (e->type() == QEvent::WindowStateChange) + { + if(model->getOptionsModel()->getMinimizeToTray()) + { + if (isMinimized()) + { + hide(); + e->ignore(); + } else { + e->accept(); + } + } + } + QMainWindow::changeEvent(e); +} + +void BitcoinGUI::closeEvent(QCloseEvent *event) +{ + if(!model->getOptionsModel()->getMinimizeToTray() && + !model->getOptionsModel()->getMinimizeOnClose()) + { + qApp->quit(); + } + QMainWindow::closeEvent(event); +} diff --git a/gui/src/optionsmodel.cpp b/gui/src/optionsmodel.cpp index 98fd3b110..37d5cb158 100644 --- a/gui/src/optionsmodel.cpp +++ b/gui/src/optionsmodel.cpp @@ -123,12 +123,12 @@ qint64 OptionsModel::getTransactionFee() return nTransactionFee; } -bool getMinimizeToTray() +bool OptionsModel::getMinimizeToTray() { return fMinimizeToTray; } -bool getMinimizeOnClose() +bool OptionsModel::getMinimizeOnClose() { return fMinimizeOnClose; }