Implement Minimize to tray / Minimize on close
authorWladimir J. van der Laan <laanwj@gmail.com>
Sun, 5 Jun 2011 12:19:57 +0000 (14:19 +0200)
committerWladimir J. van der Laan <laanwj@gmail.com>
Sun, 5 Jun 2011 12:19:57 +0000 (14:19 +0200)
README.rst
gui/include/bitcoingui.h
gui/include/optionsmodel.h
gui/src/bitcoin.cpp
gui/src/bitcoingui.cpp
gui/src/optionsmodel.cpp

index 70d3c41..bb14be6 100644 (file)
@@ -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)
index 955d7b4..8b45dac 100644 (file)
@@ -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);
 };
 
index 4fb6d25..0124e2a 100644 (file)
@@ -3,7 +3,12 @@
 
 #include <QAbstractListModel>
 
-/* 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
index c843cc4..663590d 100644 (file)
@@ -11,6 +11,7 @@
 int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);
+    app.setQuitOnLastWindowClosed(false);
 
     try {
         if(AppInit2(argc, argv))
index 5996496..b2aee6b 100644 (file)
@@ -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: <address>: New... : Paste to clipboard */
+    // Address: <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> */
+    // 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);
+}
index 98fd3b1..37d5cb1 100644 (file)
@@ -123,12 +123,12 @@ qint64 OptionsModel::getTransactionFee()
     return nTransactionFee;
 }
 
-bool getMinimizeToTray()
+bool OptionsModel::getMinimizeToTray()
 {
     return fMinimizeToTray;
 }
 
-bool getMinimizeOnClose()
+bool OptionsModel::getMinimizeOnClose()
 {
     return fMinimizeOnClose;
 }