* Qt4 bitcoin GUI.
*
* W.J. van der Laan 2011
+ * The Bitcoin Developers 2011
*/
#include "bitcoingui.h"
#include "transactiontablemodel.h"
QMainWindow(parent),
clientModel(0),
walletModel(0),
+ dummyWidget(0),
encryptWalletAction(0),
changePassphraseAction(0),
+ aboutQtAction(0),
trayIcon(0),
notificator(0)
{
// Create the tray icon (or setup the dock icon)
createTrayIcon();
+ // Dummy widget used when restoring window state after minimization
+ dummyWidget = new QWidget();
+
// Create tabs
overviewPage = new OverviewPage();
#ifdef Q_WS_MAC
delete appMenuBar;
#endif
+ delete dummyWidget;
}
void BitcoinGUI::createActions()
sendCoinsAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_2));
tabGroup->addAction(sendCoinsAction);
+ connect(overviewAction, SIGNAL(triggered()), this, SLOT(showNormal()));
connect(overviewAction, SIGNAL(triggered()), this, SLOT(gotoOverviewPage()));
+ connect(historyAction, SIGNAL(triggered()), this, SLOT(showNormal()));
connect(historyAction, SIGNAL(triggered()), this, SLOT(gotoHistoryPage()));
+ connect(addressBookAction, SIGNAL(triggered()), this, SLOT(showNormal()));
connect(addressBookAction, SIGNAL(triggered()), this, SLOT(gotoAddressBookPage()));
+ connect(receiveCoinsAction, SIGNAL(triggered()), this, SLOT(showNormal()));
connect(receiveCoinsAction, SIGNAL(triggered()), this, SLOT(gotoReceiveCoinsPage()));
+ connect(sendCoinsAction, SIGNAL(triggered()), this, SLOT(showNormal()));
connect(sendCoinsAction, SIGNAL(triggered()), this, SLOT(gotoSendCoinsPage()));
quitAction = new QAction(QIcon(":/icons/quit"), tr("E&xit"), this);
quitAction->setMenuRole(QAction::QuitRole);
aboutAction = new QAction(QIcon(":/icons/bitcoin"), tr("&About %1").arg(qApp->applicationName()), this);
aboutAction->setToolTip(tr("Show information about Bitcoin"));
- aboutAction->setMenuRole(QAction::AboutQtRole);
+ aboutAction->setMenuRole(QAction::AboutRole);
+ aboutQtAction = new QAction(tr("About &Qt"), this);
+ aboutQtAction->setToolTip(tr("Show information about Qt"));
+ aboutQtAction->setMenuRole(QAction::AboutQtRole);
optionsAction = new QAction(QIcon(":/icons/options"), tr("&Options..."), this);
optionsAction->setToolTip(tr("Modify configuration options for bitcoin"));
optionsAction->setMenuRole(QAction::PreferencesRole);
connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));
connect(optionsAction, SIGNAL(triggered()), this, SLOT(optionsClicked()));
connect(aboutAction, SIGNAL(triggered()), this, SLOT(aboutClicked()));
+ connect(aboutQtAction, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
connect(openBitcoinAction, SIGNAL(triggered()), this, SLOT(showNormal()));
connect(encryptWalletAction, SIGNAL(triggered(bool)), this, SLOT(encryptWallet(bool)));
connect(changePassphraseAction, SIGNAL(triggered()), this, SLOT(changePassphrase()));
QMenu *help = appMenuBar->addMenu(tr("&Help"));
help->addAction(aboutAction);
+ help->addAction(aboutQtAction);
}
void BitcoinGUI::createToolBars()
void BitcoinGUI::setClientModel(ClientModel *clientModel)
{
this->clientModel = clientModel;
-
- if(clientModel->isTestNet())
+ if(clientModel)
{
- QString title_testnet = windowTitle() + QString(" ") + tr("[testnet]");
- setWindowTitle(title_testnet);
+ if(clientModel->isTestNet())
+ {
+ QString title_testnet = windowTitle() + QString(" ") + tr("[testnet]");
+ setWindowTitle(title_testnet);
#ifndef Q_WS_MAC
- setWindowIcon(QIcon(":icons/bitcoin_testnet"));
+ setWindowIcon(QIcon(":icons/bitcoin_testnet"));
#else
- MacDockIconHandler::instance()->setIcon(QIcon(":icons/bitcoin_testnet"));
+ MacDockIconHandler::instance()->setIcon(QIcon(":icons/bitcoin_testnet"));
#endif
- if(trayIcon)
- {
- trayIcon->setToolTip(title_testnet);
- trayIcon->setIcon(QIcon(":/icons/toolbar_testnet"));
+ if(trayIcon)
+ {
+ trayIcon->setToolTip(title_testnet);
+ trayIcon->setIcon(QIcon(":/icons/toolbar_testnet"));
+ }
}
- }
- // Keep up to date with client
- setNumConnections(clientModel->getNumConnections());
- connect(clientModel, SIGNAL(numConnectionsChanged(int)), this, SLOT(setNumConnections(int)));
+ // Keep up to date with client
+ setNumConnections(clientModel->getNumConnections());
+ connect(clientModel, SIGNAL(numConnectionsChanged(int)), this, SLOT(setNumConnections(int)));
- setNumBlocks(clientModel->getNumBlocks());
- connect(clientModel, SIGNAL(numBlocksChanged(int)), this, SLOT(setNumBlocks(int)));
+ setNumBlocks(clientModel->getNumBlocks());
+ connect(clientModel, SIGNAL(numBlocksChanged(int)), this, SLOT(setNumBlocks(int)));
- // Report errors from network/worker thread
- connect(clientModel, SIGNAL(error(QString,QString)), this, SLOT(error(QString,QString)));
+ // Report errors from network/worker thread
+ connect(clientModel, SIGNAL(error(QString,QString)), this, SLOT(error(QString,QString)));
+ }
}
void BitcoinGUI::setWalletModel(WalletModel *walletModel)
{
this->walletModel = walletModel;
+ if(walletModel)
+ {
+ // Report errors from wallet thread
+ connect(walletModel, SIGNAL(error(QString,QString)), this, SLOT(error(QString,QString)));
- // Report errors from wallet thread
- connect(walletModel, SIGNAL(error(QString,QString)), this, SLOT(error(QString,QString)));
+ // Put transaction list in tabs
+ transactionView->setModel(walletModel);
- // Put transaction list in tabs
- transactionView->setModel(walletModel);
+ overviewPage->setModel(walletModel);
+ addressBookPage->setModel(walletModel->getAddressTableModel());
+ receiveCoinsPage->setModel(walletModel->getAddressTableModel());
+ sendCoinsPage->setModel(walletModel);
- overviewPage->setModel(walletModel);
- addressBookPage->setModel(walletModel->getAddressTableModel());
- receiveCoinsPage->setModel(walletModel->getAddressTableModel());
- sendCoinsPage->setModel(walletModel);
+ setEncryptionStatus(walletModel->getEncryptionStatus());
+ connect(walletModel, SIGNAL(encryptionStatusChanged(int)), this, SLOT(setEncryptionStatus(int)));
- setEncryptionStatus(walletModel->getEncryptionStatus());
- connect(walletModel, SIGNAL(encryptionStatusChanged(int)), this, SLOT(setEncryptionStatus(int)));
+ // Balloon popup for new transaction
+ connect(walletModel->getTransactionTableModel(), SIGNAL(rowsInserted(QModelIndex,int,int)),
+ this, SLOT(incomingTransaction(QModelIndex,int,int)));
- // Balloon popup for new transaction
- connect(walletModel->getTransactionTableModel(), SIGNAL(rowsInserted(QModelIndex,int,int)),
- this, SLOT(incomingTransaction(QModelIndex,int,int)));
-
- // Ask for passphrase if needed
- connect(walletModel, SIGNAL(requireUnlock()), this, SLOT(unlockWallet()));
+ // Ask for passphrase if needed
+ connect(walletModel, SIGNAL(requireUnlock()), this, SLOT(unlockWallet()));
+ }
}
void BitcoinGUI::createTrayIcon()
// Click on system tray icon triggers "open bitcoin"
openBitcoinAction->trigger();
}
-
}
#endif
+void BitcoinGUI::showNormal()
+{
+ // Reparent window to the desktop (in case it was hidden on minimize)
+ if(parent() != NULL)
+ setParent(NULL, Qt::Window);
+ QMainWindow::showNormal();
+}
+
void BitcoinGUI::optionsClicked()
{
+ if(!clientModel || !clientModel->getOptionsModel())
+ return;
OptionsDialog dlg;
dlg.setModel(clientModel->getOptionsModel());
dlg.exec();
void BitcoinGUI::setNumBlocks(int count)
{
- int initTotal = clientModel->getNumBlocksAtStartup();
+ if(!clientModel)
+ return;
int total = clientModel->getNumBlocksOfPeers();
QString tooltip;
if(count < total)
{
- progressBarLabel->setVisible(true);
- progressBar->setVisible(true);
- progressBar->setMaximum(total - initTotal);
- progressBar->setValue(count - initTotal);
+ if (clientModel->getStatusBarWarnings() == "")
+ {
+ progressBarLabel->setVisible(true);
+ progressBarLabel->setText(tr("Synchronizing with network..."));
+ progressBar->setVisible(true);
+ progressBar->setMaximum(total);
+ progressBar->setValue(count);
+ }
+ else
+ {
+ progressBarLabel->setText(clientModel->getStatusBarWarnings());
+ progressBarLabel->setVisible(true);
+ progressBar->setVisible(false);
+ }
tooltip = tr("Downloaded %1 of %2 blocks of transaction history.").arg(count).arg(total);
}
else
{
- progressBarLabel->setVisible(false);
+ if (clientModel->getStatusBarWarnings() == "")
+ progressBarLabel->setVisible(false);
+ else
+ {
+ progressBarLabel->setText(clientModel->getStatusBarWarnings());
+ progressBarLabel->setVisible(true);
+ }
progressBar->setVisible(false);
tooltip = tr("Downloaded %1 blocks of transaction history.").arg(count);
}
progressBar->setToolTip(tooltip);
}
+void BitcoinGUI::refreshStatusBar()
+{
+ /* Might display multiple times in the case of multiple alerts
+ static QString prevStatusBar;
+ QString newStatusBar = clientModel->getStatusBarWarnings();
+ if (prevStatusBar != newStatusBar)
+ {
+ prevStatusBar = newStatusBar;
+ error(tr("Network Alert"), newStatusBar);
+ }*/
+ setNumBlocks(clientModel->getNumBlocks());
+}
+
void BitcoinGUI::error(const QString &title, const QString &message)
{
// Report errors from network/worker thread
void BitcoinGUI::changeEvent(QEvent *e)
{
#ifndef Q_WS_MAC // Ignored on Mac
- if (e->type() == QEvent::WindowStateChange)
+ if(e->type() == QEvent::WindowStateChange)
{
- if (clientModel->getOptionsModel()->getMinimizeToTray())
+ if(clientModel && clientModel->getOptionsModel()->getMinimizeToTray())
{
- if (isMinimized())
+ if(isMinimized())
{
- hide();
- e->ignore();
+ // Hiding the window from taskbar
+ setParent(dummyWidget, Qt::SubWindow);
+ return;
}
else
{
- show();
- e->accept();
+ showNormal();
}
}
}
void BitcoinGUI::closeEvent(QCloseEvent *event)
{
-#ifndef Q_WS_MAC // Ignored on Mac
- if(!clientModel->getOptionsModel()->getMinimizeToTray() &&
- !clientModel->getOptionsModel()->getMinimizeOnClose())
+ if(clientModel)
{
- qApp->quit();
- }
+#ifndef Q_WS_MAC // Ignored on Mac
+ if(!clientModel->getOptionsModel()->getMinimizeToTray() &&
+ !clientModel->getOptionsModel()->getMinimizeOnClose())
+ {
+ qApp->quit();
+ }
#endif
+ }
QMainWindow::closeEvent(event);
}
void BitcoinGUI::incomingTransaction(const QModelIndex & parent, int start, int end)
{
+ if(!walletModel || !clientModel)
+ return;
TransactionTableModel *ttm = walletModel->getTransactionTableModel();
qint64 amount = ttm->index(start, TransactionTableModel::Amount, parent)
.data(Qt::EditRole).toULongLong();
void BitcoinGUI::gotoOverviewPage()
{
- show();
overviewAction->setChecked(true);
centralWidget->setCurrentWidget(overviewPage);
void BitcoinGUI::gotoHistoryPage()
{
- show();
historyAction->setChecked(true);
centralWidget->setCurrentWidget(transactionsPage);
void BitcoinGUI::gotoAddressBookPage()
{
- show();
addressBookAction->setChecked(true);
centralWidget->setCurrentWidget(addressBookPage);
void BitcoinGUI::gotoReceiveCoinsPage()
{
- show();
receiveCoinsAction->setChecked(true);
centralWidget->setCurrentWidget(receiveCoinsPage);
void BitcoinGUI::gotoSendCoinsPage()
{
- show();
sendCoinsAction->setChecked(true);
centralWidget->setCurrentWidget(sendCoinsPage);
void BitcoinGUI::encryptWallet(bool status)
{
+ if(!walletModel)
+ return;
AskPassphraseDialog dlg(status ? AskPassphraseDialog::Encrypt:
AskPassphraseDialog::Decrypt, this);
dlg.setModel(walletModel);
void BitcoinGUI::unlockWallet()
{
+ if(!walletModel)
+ return;
// Unlock wallet when requested by wallet model
if(walletModel->getEncryptionStatus() == WalletModel::Locked)
{