X-Git-Url: https://git.novaco.in/?p=novacoin.git;a=blobdiff_plain;f=src%2Fqt%2Fbitcoingui.cpp;h=db888a8c891a739e25ad2d3a5562cd3d0db62909;hp=922a6ae12e52203524e38d050c9ee83bb5e4b56a;hb=f8ea0dd6459856f2df18ca2ad532d49432a087dd;hpb=5411280b44a6c211ec7ce15919068a92ff2d9f51 diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index 922a6ae..db888a8 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -9,6 +9,8 @@ #include "addressbookpage.h" #include "sendcoinsdialog.h" #include "signverifymessagedialog.h" +#include "secondauthdialog.h" +#include "multisigdialog.h" #include "optionsdialog.h" #include "aboutdialog.h" #include "clientmodel.h" @@ -26,13 +28,16 @@ #include "guiutil.h" #include "ui_interface.h" #include "rpcconsole.h" +#include "mintingview.h" #ifdef Q_OS_MAC #include "macdockiconhandler.h" #endif #include +#if QT_VERSION < 0x050000 #include +#endif #include #include #include @@ -50,24 +55,42 @@ #include #include #include +#if QT_VERSION < 0x050000 #include +#else +#include +#endif #include #include +#if QT_VERSION < 0x050000 #include +#endif #include +#include #include +extern bool fWalletUnlockMintOnly; +extern uint64_t nStakeInputsMapSize; + BitcoinGUI::BitcoinGUI(QWidget *parent): QMainWindow(parent), clientModel(0), walletModel(0), + signVerifyMessageDialog(0), + secondAuthDialog(0), + multisigPage(0), encryptWalletAction(0), + lockWalletAction(0), + unlockWalletAction(0), + unlockWalletMiningAction(0), changePassphraseAction(0), aboutQtAction(0), trayIcon(0), notificator(0), - rpcConsole(0) + rpcConsole(0), + aboutDialog(0), + optionsDialog(0) { resize(850, 550); setWindowTitle(tr("NovaCoin") + " - " + tr("Wallet")); @@ -78,17 +101,74 @@ BitcoinGUI::BitcoinGUI(QWidget *parent): setUnifiedTitleAndToolBarOnMac(true); QApplication::setAttribute(Qt::AA_DontShowIconsInMenus); #endif + + int nQtStyle = GetArg("-qtstyle", 0); + if(nQtStyle < 0) nQtStyle = 0; + + if(!nQtStyle) { + resize(850, 550); + qApp->setStyleSheet(""); + } else if(nQtStyle == 1) { + resize(850, 525); +#ifndef Q_OS_MAC + qApp->setStyleSheet("QToolBar QToolButton { text-align: center; width: 100%; \ + padding-left: 5px; padding-right: 5px; padding-top: 2px; padding-bottom: 2px; \ + margin-top: 2px; } \ + QToolBar QToolButton:hover { font-weight: bold; } \ + #toolbar { border: none; height: 100%; min-width: 150px; max-width: 150px; } \ + QMenuBar { min-height: 20px; }"); +#else + qApp->setStyleSheet("QToolBar QToolButton { text-align: center; width: 100%; \ + padding-left: 5px; padding-right: 5px; padding-top: 2px; padding-bottom: 2px; \ + margin-top: 2px; } \ + QToolBar QToolButton:hover { font-weight: bold; background-color: transparent; } \ + #toolbar { border: none; height: 100%; min-width: 150px; max-width: 150px; }"); +#endif + } else { + resize(850, 525); +#ifndef Q_OS_MAC + qApp->setStyleSheet("QToolBar QToolButton { text-align: center; width: 100%; \ + color: white; background-color: grey; padding-left: 5px; padding-right: 5px; \ + padding-top: 2px; padding-bottom: 2px; margin-top: 2px; } \ + QToolBar QToolButton:hover { font-weight: bold; \ + background-color: QLinearGradient(x1: 0, y1: 0, x2: 1, y2: 2, \ + stop: 0 #808080, stop: 1 #d2d2d2); } \ + #toolbar { border: none; height: 100%; min-width: 150px; max-width: 150px; \ + background-color: grey; } \ + QMenuBar { color: white; background-color: grey; } \ + QMenuBar::item { color: white; background-color: grey; \ + padding-top: 6px; padding-bottom: 6px; \ + padding-left: 10px; padding-right: 10px; } \ + QMenuBar::item:selected { background-color: QLinearGradient(x1: 0, y1: 0, x2: 1, y2: 2, \ + stop: 0 #808080, stop: 1 #d2d2d2); } \ + QMenu { border: 1px solid; color: black; background-color: grey; } \ + QMenu::item { background-color: grey; } \ + QMenu::item:disabled { color: gray; } \ + QMenu::item:enabled:selected { color: white; background-color: grey; } \ + QMenu::separator { height: 4px; }"); +#else + qApp->setStyleSheet("QToolBar QToolButton { text-align: center; width: 100%; \ + color: white; padding-left: 5px; padding-right: 5px; \ + padding-top: 2px; padding-bottom: 2px; margin-top: 2px; } \ + QToolBar QToolButton:hover { font-weight: bold; \ + background-color: QLinearGradient(x1: 0, y1: 0, x2: 1, y2: 2, \ + stop: 0 #808080, stop: 1 #d2d2d2); } \ + #toolbar { border: none; height: 100%; min-width: 150px; max-width: 150px; \ + background-color: grey; }"); +#endif + } + // Accept D&D of URIs setAcceptDrops(true); // Create actions for the toolbar, menu bar and tray/dock icon - createActions(); + createActions(nQtStyle); // Create application menu bar createMenuBar(); // Create the toolbars - createToolBars(); + createToolBars(nQtStyle); // Create the tray icon (or setup the dock icon) createTrayIcon(); @@ -102,17 +182,28 @@ BitcoinGUI::BitcoinGUI(QWidget *parent): vbox->addWidget(transactionView); transactionsPage->setLayout(vbox); + mintingPage = new QWidget(this); + QVBoxLayout *vboxMinting = new QVBoxLayout(); + mintingView = new MintingView(this); + vboxMinting->addWidget(mintingView); + mintingPage->setLayout(vboxMinting); + addressBookPage = new AddressBookPage(AddressBookPage::ForEditing, AddressBookPage::SendingTab); receiveCoinsPage = new AddressBookPage(AddressBookPage::ForEditing, AddressBookPage::ReceivingTab); sendCoinsPage = new SendCoinsDialog(this); - signVerifyMessageDialog = new SignVerifyMessageDialog(this); + signVerifyMessageDialog = new SignVerifyMessageDialog(0); + + secondAuthDialog = new SecondAuthDialog(0); + + multisigPage = new MultisigDialog(0); centralWidget = new QStackedWidget(this); centralWidget->addWidget(overviewPage); centralWidget->addWidget(transactionsPage); + centralWidget->addWidget(mintingPage); centralWidget->addWidget(addressBookPage); centralWidget->addWidget(receiveCoinsPage); centralWidget->addWidget(sendCoinsPage); @@ -124,17 +215,20 @@ BitcoinGUI::BitcoinGUI(QWidget *parent): // Status bar notification icons QFrame *frameBlocks = new QFrame(); frameBlocks->setContentsMargins(0,0,0,0); - frameBlocks->setMinimumWidth(56); - frameBlocks->setMaximumWidth(56); + frameBlocks->setMinimumWidth(72); + frameBlocks->setMaximumWidth(72); QHBoxLayout *frameBlocksLayout = new QHBoxLayout(frameBlocks); frameBlocksLayout->setContentsMargins(3,0,3,0); frameBlocksLayout->setSpacing(3); labelEncryptionIcon = new QLabel(); + labelMiningIcon = new QLabel(); labelConnectionsIcon = new QLabel(); labelBlocksIcon = new QLabel(); frameBlocksLayout->addStretch(); frameBlocksLayout->addWidget(labelEncryptionIcon); frameBlocksLayout->addStretch(); + frameBlocksLayout->addWidget(labelMiningIcon); + frameBlocksLayout->addStretch(); frameBlocksLayout->addWidget(labelConnectionsIcon); frameBlocksLayout->addStretch(); frameBlocksLayout->addWidget(labelBlocksIcon); @@ -169,8 +263,12 @@ BitcoinGUI::BitcoinGUI(QWidget *parent): // Double-clicking on a transaction on the transaction history page shows details connect(transactionView, SIGNAL(doubleClicked(QModelIndex)), transactionView, SLOT(showDetails())); - rpcConsole = new RPCConsole(this); + rpcConsole = new RPCConsole(0); connect(openRPCConsoleAction, SIGNAL(triggered()), rpcConsole, SLOT(show())); + connect(openRPCConsoleAction, SIGNAL(triggered()), rpcConsole, SLOT(raise())); + + aboutDialog = new AboutDialog(0); + optionsDialog = new OptionsDialog(0); // Clicking on "Verify Message" in the address book sends you to the verify message tab connect(addressBookPage, SIGNAL(verifyMessage(QString)), this, SLOT(gotoVerifyMessageTab(QString))); @@ -187,9 +285,16 @@ BitcoinGUI::~BitcoinGUI() #ifdef Q_OS_MAC delete appMenuBar; #endif + + delete rpcConsole; + delete aboutDialog; + delete optionsDialog; + delete multisigPage; + delete secondAuthDialog; + delete signVerifyMessageDialog; } -void BitcoinGUI::createActions() +void BitcoinGUI::createActions(int nQtStyle) { QActionGroup *tabGroup = new QActionGroup(this); @@ -217,12 +322,22 @@ void BitcoinGUI::createActions() historyAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_4)); tabGroup->addAction(historyAction); + mintingAction = new QAction(QIcon(":/icons/history"), tr("&Minting"), this); + mintingAction->setToolTip(tr("Show your minting capacity")); + mintingAction->setCheckable(true); + mintingAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_5)); + tabGroup->addAction(mintingAction); + addressBookAction = new QAction(QIcon(":/icons/address-book"), tr("&Address Book"), this); addressBookAction->setToolTip(tr("Edit the list of stored addresses and labels")); addressBookAction->setCheckable(true); - addressBookAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_5)); + addressBookAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_6)); tabGroup->addAction(addressBookAction); + multisigAction = new QAction(QIcon(":/icons/send"), tr("Multisig"), this); + multisigAction->setStatusTip(tr("Open window for working with multisig addresses")); + tabGroup->addAction(multisigAction); + connect(overviewAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); connect(overviewAction, SIGNAL(triggered()), this, SLOT(gotoOverviewPage())); connect(sendCoinsAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); @@ -231,41 +346,65 @@ void BitcoinGUI::createActions() connect(receiveCoinsAction, SIGNAL(triggered()), this, SLOT(gotoReceiveCoinsPage())); connect(historyAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); connect(historyAction, SIGNAL(triggered()), this, SLOT(gotoHistoryPage())); + connect(mintingAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); + connect(mintingAction, SIGNAL(triggered()), this, SLOT(gotoMintingPage())); connect(addressBookAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); connect(addressBookAction, SIGNAL(triggered()), this, SLOT(gotoAddressBookPage())); + connect(multisigAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); + connect(multisigAction, SIGNAL(triggered()), this, SLOT(gotoMultisigPage())); quitAction = new QAction(QIcon(":/icons/quit"), tr("E&xit"), this); - quitAction->setToolTip(tr("Quit application")); + quitAction->setStatusTip(tr("Quit application")); quitAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Q)); quitAction->setMenuRole(QAction::QuitRole); aboutAction = new QAction(QIcon(":/icons/bitcoin"), tr("&About NovaCoin"), this); - aboutAction->setToolTip(tr("Show information about NovaCoin")); + aboutAction->setStatusTip(tr("Show information about NovaCoin")); aboutAction->setMenuRole(QAction::AboutRole); +#if QT_VERSION < 0x050000 aboutQtAction = new QAction(QIcon(":/trolltech/qmessagebox/images/qtlogo-64.png"), tr("About &Qt"), this); - aboutQtAction->setToolTip(tr("Show information about Qt")); +#else + aboutQtAction = new QAction(QIcon(":/qt-project.org/qmessagebox/images/qtlogo-64.png"), tr("About &Qt"), this); +#endif + aboutQtAction->setStatusTip(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 NovaCoin")); + optionsAction->setStatusTip(tr("Modify configuration options for NovaCoin")); optionsAction->setMenuRole(QAction::PreferencesRole); toggleHideAction = new QAction(QIcon(":/icons/bitcoin"), tr("&Show / Hide"), this); encryptWalletAction = new QAction(QIcon(":/icons/lock_closed"), tr("&Encrypt Wallet..."), this); - encryptWalletAction->setToolTip(tr("Encrypt or decrypt wallet")); + encryptWalletAction->setStatusTip(tr("Encrypt or decrypt wallet")); encryptWalletAction->setCheckable(true); backupWalletAction = new QAction(QIcon(":/icons/filesave"), tr("&Backup Wallet..."), this); - backupWalletAction->setToolTip(tr("Backup wallet to another location")); + backupWalletAction->setStatusTip(tr("Backup wallet to another location")); dumpWalletAction = new QAction(QIcon(":/icons/dump"), tr("&Dump Wallet..."), this); - dumpWalletAction->setStatusTip(tr("Export wallet's keys to a text file")); + dumpWalletAction->setStatusTip(tr("Dump keys to a text file")); importWalletAction = new QAction(QIcon(":/icons/import"), tr("&Import Wallet..."), this); - importWalletAction->setStatusTip(tr("Import a file's keys into a wallet")); + importWalletAction->setStatusTip(tr("Import keys into a wallet")); changePassphraseAction = new QAction(QIcon(":/icons/key"), tr("&Change Passphrase..."), this); - changePassphraseAction->setToolTip(tr("Change the passphrase used for wallet encryption")); + changePassphraseAction->setStatusTip(tr("Change the passphrase used for wallet encryption")); signMessageAction = new QAction(QIcon(":/icons/edit"), tr("Sign &message..."), this); + signMessageAction->setStatusTip(tr("Sign messages with your Novacoin addresses to prove you own them")); verifyMessageAction = new QAction(QIcon(":/icons/transaction_0"), tr("&Verify message..."), this); + verifyMessageAction->setStatusTip(tr("Verify messages to ensure they were signed with specified Novacoin addresses")); + secondAuthAction = new QAction(QIcon(":/icons/key"), tr("Second &auth..."), this); + secondAuthAction->setStatusTip(tr("Second auth with your Novacoin addresses")); + + lockWalletAction = new QAction(QIcon(":/icons/lock_closed"), tr("&Lock wallet"), this); + lockWalletAction->setStatusTip(tr("Lock wallet")); + lockWalletAction->setCheckable(true); + + unlockWalletAction = new QAction(QIcon(":/icons/lock_open"), tr("Unlo&ck wallet"), this); + unlockWalletAction->setStatusTip(tr("Unlock wallet")); + unlockWalletAction->setCheckable(true); + + unlockWalletMiningAction = new QAction(QIcon(":/icons/mining_active"), tr("Unlo&ck wallet for mining"), this); + unlockWalletMiningAction->setStatusTip(tr("Unlock wallet for mining")); + unlockWalletMiningAction->setCheckable(true); exportAction = new QAction(QIcon(":/icons/export"), tr("&Export..."), this); - exportAction->setToolTip(tr("Export the data in the current tab to a file")); + exportAction->setStatusTip(tr("Export the data in the current tab to a file")); openRPCConsoleAction = new QAction(QIcon(":/icons/debugwindow"), tr("&Debug window"), this); - openRPCConsoleAction->setToolTip(tr("Open debugging and diagnostic console")); + openRPCConsoleAction->setStatusTip(tr("Open debugging and diagnostic console")); connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit())); connect(aboutAction, SIGNAL(triggered()), this, SLOT(aboutClicked())); @@ -273,12 +412,16 @@ void BitcoinGUI::createActions() connect(optionsAction, SIGNAL(triggered()), this, SLOT(optionsClicked())); connect(toggleHideAction, SIGNAL(triggered()), this, SLOT(toggleHidden())); connect(encryptWalletAction, SIGNAL(triggered(bool)), this, SLOT(encryptWallet(bool))); + connect(lockWalletAction, SIGNAL(triggered(bool)), this, SLOT(lockWallet())); + connect(unlockWalletAction, SIGNAL(triggered(bool)), this, SLOT(unlockWallet())); + connect(unlockWalletMiningAction, SIGNAL(triggered(bool)), this, SLOT(unlockWalletMining(bool))); connect(backupWalletAction, SIGNAL(triggered()), this, SLOT(backupWallet())); connect(dumpWalletAction, SIGNAL(triggered()), this, SLOT(dumpWallet())); connect(importWalletAction, SIGNAL(triggered()), this, SLOT(importWallet())); connect(changePassphraseAction, SIGNAL(triggered()), this, SLOT(changePassphrase())); connect(signMessageAction, SIGNAL(triggered()), this, SLOT(gotoSignMessageTab())); connect(verifyMessageAction, SIGNAL(triggered()), this, SLOT(gotoVerifyMessageTab())); + connect(secondAuthAction, SIGNAL(triggered()), this, SLOT(gotoSecondAuthPage())); } void BitcoinGUI::createMenuBar() @@ -300,13 +443,18 @@ void BitcoinGUI::createMenuBar() file->addAction(exportAction); file->addAction(signMessageAction); file->addAction(verifyMessageAction); + file->addAction(secondAuthAction); + file->addAction(multisigAction); file->addSeparator(); file->addAction(quitAction); QMenu *settings = appMenuBar->addMenu(tr("&Settings")); - settings->addAction(encryptWalletAction); - settings->addAction(changePassphraseAction); - settings->addSeparator(); + QMenu *securityMenu = settings->addMenu(QIcon(":/icons/key"), tr("&Wallet security")); + securityMenu->addAction(encryptWalletAction); + securityMenu->addAction(changePassphraseAction); + securityMenu->addAction(unlockWalletAction); + securityMenu->addAction(unlockWalletMiningAction); + securityMenu->addAction(lockWalletAction); settings->addAction(optionsAction); QMenu *help = appMenuBar->addMenu(tr("&Help")); @@ -316,19 +464,34 @@ void BitcoinGUI::createMenuBar() help->addAction(aboutQtAction); } -void BitcoinGUI::createToolBars() +void BitcoinGUI::createToolBars(int nQtStyle) { - QToolBar *toolbar = addToolBar(tr("Tabs toolbar")); - toolbar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + QToolBar *toolbar = addToolBar(tr("Primary tool bar")); + toolbar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); + toolbar->setMovable(false); + toolbar->setIconSize(QSize(32, 32)); + + if(!nQtStyle) { + toolbar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + } else { + toolbar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); + toolbar->setObjectName("toolbar"); + addToolBar(Qt::LeftToolBarArea, toolbar); + toolbar->setOrientation(Qt::Vertical); + } + toolbar->addAction(overviewAction); toolbar->addAction(sendCoinsAction); toolbar->addAction(receiveCoinsAction); toolbar->addAction(historyAction); + toolbar->addAction(mintingAction); toolbar->addAction(addressBookAction); QToolBar *toolbar2 = addToolBar(tr("Actions toolbar")); toolbar2->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); toolbar2->addAction(exportAction); + toolbar2->setVisible(false); + } void BitcoinGUI::setClientModel(ClientModel *clientModel) @@ -363,6 +526,10 @@ void BitcoinGUI::setClientModel(ClientModel *clientModel) setNumBlocks(clientModel->getNumBlocks(), clientModel->getNumBlocksOfPeers()); connect(clientModel, SIGNAL(numBlocksChanged(int,int)), this, SLOT(setNumBlocks(int,int))); + QTimer *timer = new QTimer(this); + connect(timer, SIGNAL(timeout()), this, SLOT(updateMining())); + timer->start(10*1000); //10 seconds + // Report errors from network/worker thread connect(clientModel, SIGNAL(error(QString,QString,bool)), this, SLOT(error(QString,QString,bool))); @@ -382,15 +549,19 @@ void BitcoinGUI::setWalletModel(WalletModel *walletModel) // Put transaction list in tabs transactionView->setModel(walletModel); + mintingView->setModel(walletModel); overviewPage->setModel(walletModel); addressBookPage->setModel(walletModel->getAddressTableModel()); receiveCoinsPage->setModel(walletModel->getAddressTableModel()); sendCoinsPage->setModel(walletModel); signVerifyMessageDialog->setModel(walletModel); + secondAuthDialog->setModel(walletModel); + multisigPage->setModel(walletModel); setEncryptionStatus(walletModel->getEncryptionStatus()); connect(walletModel, SIGNAL(encryptionStatusChanged(int)), this, SLOT(setEncryptionStatus(int))); + connect(walletModel, SIGNAL(encryptionStatusChanged(int)), this, SLOT(updateMining())); // Balloon pop-up for new transaction connect(walletModel->getTransactionTableModel(), SIGNAL(rowsInserted(QModelIndex,int,int)), @@ -416,6 +587,7 @@ void BitcoinGUI::createTrayIcon() #else // Note: On Mac, the dock icon is used to provide the tray's functionality. MacDockIconHandler *dockIconHandler = MacDockIconHandler::instance(); + dockIconHandler->setMainWindow((QMainWindow *)this); trayIconMenu = dockIconHandler->dockMenu(); #endif @@ -423,19 +595,21 @@ void BitcoinGUI::createTrayIcon() trayIconMenu->addAction(toggleHideAction); trayIconMenu->addSeparator(); trayIconMenu->addAction(sendCoinsAction); + trayIconMenu->addAction(multisigAction); trayIconMenu->addAction(receiveCoinsAction); trayIconMenu->addSeparator(); trayIconMenu->addAction(signMessageAction); trayIconMenu->addAction(verifyMessageAction); + trayIconMenu->addAction(secondAuthAction); trayIconMenu->addSeparator(); trayIconMenu->addAction(optionsAction); trayIconMenu->addAction(openRPCConsoleAction); -#ifndef Q_OS_MAC // This is built-in on Mac +#ifndef Q_OS_MAC + // This is built-in on Mac trayIconMenu->addSeparator(); - trayIconMenu->addAction(quitAction); + trayIconMenu->addAction(quitAction); #endif - - notificator = new Notificator(qApp->applicationName(), trayIcon); + notificator = new Notificator(QApplication::applicationName(), trayIcon, this); } #ifndef Q_OS_MAC @@ -453,16 +627,17 @@ void BitcoinGUI::optionsClicked() { if(!clientModel || !clientModel->getOptionsModel()) return; - OptionsDialog dlg; - dlg.setModel(clientModel->getOptionsModel()); - dlg.exec(); + + optionsDialog->setModel(clientModel->getOptionsModel()); + optionsDialog->setWindowModality(Qt::ApplicationModal); + optionsDialog->show(); } void BitcoinGUI::aboutClicked() { - AboutDialog dlg; - dlg.setModel(clientModel); - dlg.exec(); + aboutDialog->setModel(clientModel); + aboutDialog->setWindowModality(Qt::ApplicationModal); + aboutDialog->show(); } void BitcoinGUI::setNumConnections(int count) @@ -528,6 +703,9 @@ void BitcoinGUI::setNumBlocks(int count, int nTotalBlocks) progressBar->setVisible(false); } + tooltip = tr("Current PoW difficulty is %1.").arg(clientModel->getDifficulty(false)) + QString("
") + tooltip; + tooltip = tr("Current PoS difficulty is %1.").arg(clientModel->getDifficulty(true)) + QString("
") + tooltip; + QDateTime lastBlockDate = clientModel->getLastBlockDate(); int secs = lastBlockDate.secsTo(QDateTime::currentDateTime()); QString text; @@ -585,15 +763,41 @@ void BitcoinGUI::setNumBlocks(int count, int nTotalBlocks) progressBar->setToolTip(tooltip); } -void BitcoinGUI::error(const QString &title, const QString &message, bool modal) +void BitcoinGUI::updateMining() { - // Report errors from network/worker thread - if(modal) + if(!walletModel) + return; + + labelMiningIcon->setPixmap(QIcon(":/icons/mining_inactive").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE)); + + if (!clientModel->getNumConnections()) { - QMessageBox::critical(this, title, message, QMessageBox::Ok, QMessageBox::Ok); - } else { - notificator->notify(Notificator::Critical, title, message); + labelMiningIcon->setToolTip(tr("Wallet is offline")); + return; + } + + if (walletModel->getEncryptionStatus() == WalletModel::Locked) + { + labelMiningIcon->setToolTip(tr("Wallet is locked")); + return; + } + + if (clientModel->inInitialBlockDownload() || clientModel->getNumBlocksOfPeers() > clientModel->getNumBlocks()) + { + labelMiningIcon->setToolTip(tr("Blockchain download is in progress")); + return; + } + + if (nStakeInputsMapSize > 0) + { + labelMiningIcon->setPixmap(QIcon(":/icons/mining_active").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE)); + + uint64_t nNetworkWeight = clientModel->getPoSKernelPS(); + + labelMiningIcon->setToolTip(QString("")+tr("Stake miner is active
%1 inputs being used for mining
Network weight is %3").arg(nStakeInputsMapSize).arg(nNetworkWeight)+QString("<\nobr>")); } + else + labelMiningIcon->setToolTip(tr("No suitable inputs were found")); } void BitcoinGUI::message(const QString &title, const QString &message, unsigned int style, const QString &detail) @@ -670,13 +874,15 @@ void BitcoinGUI::closeEvent(QCloseEvent *event) if(clientModel) { #ifndef Q_OS_MAC // Ignored on Mac - if(!clientModel->getOptionsModel()->getMinimizeToTray() && - !clientModel->getOptionsModel()->getMinimizeOnClose()) + if(!clientModel->getOptionsModel()->getMinimizeOnClose()) { qApp->quit(); } #endif } + // close rpcConsole in case it was open to make some space for the shutdown window + rpcConsole->close(); + QMainWindow::closeEvent(event); } @@ -747,6 +953,17 @@ void BitcoinGUI::gotoHistoryPage() connect(exportAction, SIGNAL(triggered()), transactionView, SLOT(exportClicked())); } +void BitcoinGUI::gotoMintingPage() +{ + mintingAction->setChecked(true); + centralWidget->setCurrentWidget(mintingPage); + + exportAction->setEnabled(true); + disconnect(exportAction, SIGNAL(triggered()), 0, 0); + connect(exportAction, SIGNAL(triggered()), mintingView, SLOT(exportClicked())); +} + + void BitcoinGUI::gotoAddressBookPage() { addressBookAction->setChecked(true); @@ -794,6 +1011,20 @@ void BitcoinGUI::gotoVerifyMessageTab(QString addr) signVerifyMessageDialog->setAddress_VM(addr); } +void BitcoinGUI::gotoSecondAuthPage(QString addr) +{ + secondAuthDialog->show(); + secondAuthDialog->raise(); + secondAuthDialog->activateWindow(); +} + +void BitcoinGUI::gotoMultisigPage() +{ + multisigPage->show(); + multisigPage->raise(); + multisigPage->activateWindow(); +} + void BitcoinGUI::dragEnterEvent(QDragEnterEvent *event) { // Accept only URIs @@ -843,6 +1074,9 @@ void BitcoinGUI::setEncryptionStatus(int status) labelEncryptionIcon->hide(); encryptWalletAction->setChecked(false); changePassphraseAction->setEnabled(false); + lockWalletAction->setEnabled(false); + unlockWalletAction->setEnabled(false); + unlockWalletMiningAction->setEnabled(false); encryptWalletAction->setEnabled(true); break; case WalletModel::Unlocked: @@ -851,7 +1085,18 @@ void BitcoinGUI::setEncryptionStatus(int status) labelEncryptionIcon->setToolTip(tr("Wallet is encrypted and currently unlocked")); encryptWalletAction->setChecked(true); changePassphraseAction->setEnabled(true); - encryptWalletAction->setEnabled(false); // TODO: decrypt currently not supported + encryptWalletAction->setEnabled(true); + + lockWalletAction->setEnabled(true); + lockWalletAction->setChecked(false); + unlockWalletAction->setEnabled(false); + unlockWalletMiningAction->setEnabled(false); + + if (fWalletUnlockMintOnly) + unlockWalletMiningAction->setChecked(true); + else + unlockWalletAction->setChecked(true); + break; case WalletModel::Locked: labelEncryptionIcon->show(); @@ -859,7 +1104,15 @@ void BitcoinGUI::setEncryptionStatus(int status) labelEncryptionIcon->setToolTip(tr("Wallet is encrypted and currently locked")); encryptWalletAction->setChecked(true); changePassphraseAction->setEnabled(true); - encryptWalletAction->setEnabled(false); // TODO: decrypt currently not supported + encryptWalletAction->setEnabled(true); + + lockWalletAction->setChecked(true); + unlockWalletAction->setChecked(false); + unlockWalletMiningAction->setChecked(false); + + lockWalletAction->setEnabled(false); + unlockWalletAction->setEnabled(true); + unlockWalletMiningAction->setEnabled(true); break; } } @@ -876,9 +1129,27 @@ void BitcoinGUI::encryptWallet(bool status) setEncryptionStatus(walletModel->getEncryptionStatus()); } +void BitcoinGUI::unlockWalletMining(bool status) +{ + if(!walletModel) + return; + + // Unlock wallet when requested by wallet model + if(walletModel->getEncryptionStatus() == WalletModel::Locked) + { + AskPassphraseDialog dlg(AskPassphraseDialog::UnlockMining, this); + dlg.setModel(walletModel); + dlg.exec(); + } +} + void BitcoinGUI::backupWallet() { +#if QT_VERSION < 0x050000 QString saveDir = QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation); +#else + QString saveDir = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); +#endif QString filename = QFileDialog::getSaveFileName(this, tr("Backup Wallet"), saveDir, tr("Wallet Data (*.dat)")); if(!filename.isEmpty()) { if(!walletModel->backupWallet(filename)) { @@ -904,16 +1175,16 @@ void BitcoinGUI::dumpWallet() #else QString saveDir = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); #endif - QString filename = QFileDialog::getSaveFileName(this, tr("Export Wallet"), saveDir, tr("Wallet Text (*.txt)")); + QString filename = QFileDialog::getSaveFileName(this, tr("Dump Wallet"), saveDir, tr("Wallet dump (*.txt)")); if(!filename.isEmpty()) { if(!walletModel->dumpWallet(filename)) { - error(tr("DumpWallet Failed"), + message(tr("Dump failed"), tr("An error happened while trying to save the keys to your location.\n" - "Keys were not saved") + "Keys were not saved.") ,CClientUIInterface::MSG_ERROR); } else - message(tr("DumpWallet Successful"), + message(tr("Dump successful"), tr("Keys were saved to this file:\n%2") .arg(filename) ,CClientUIInterface::MSG_INFORMATION); @@ -937,10 +1208,10 @@ void BitcoinGUI::importWallet() #else QString openDir = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); #endif - QString filename = QFileDialog::getOpenFileName(this, tr("Import Wallet"), openDir, tr("Wallet Text (*.txt)")); + QString filename = QFileDialog::getOpenFileName(this, tr("Import Wallet"), openDir, tr("Wallet dump (*.txt)")); if(!filename.isEmpty()) { if(!walletModel->importWallet(filename)) { - error(tr("Import Failed"), + message(tr("Import Failed"), tr("An error happened while trying to import the keys.\n" "Some or all keys from:\n %1,\n were not imported into your wallet.") .arg(filename) @@ -975,23 +1246,42 @@ void BitcoinGUI::unlockWallet() } } +void BitcoinGUI::lockWallet() +{ + if(!walletModel) + return; + + walletModel->setWalletLocked(true); +} + void BitcoinGUI::showNormalIfMinimized(bool fToggleHidden) { // activateWindow() (sometimes) helps with keyboard focus on Windows if (isHidden()) { + // Make sure the window is not minimized + setWindowState(windowState() & (~Qt::WindowMinimized | Qt::WindowActive)); + // Then show it show(); + raise(); activateWindow(); } else if (isMinimized()) { showNormal(); + raise(); activateWindow(); } else if (GUIUtil::isObscured(this)) { raise(); activateWindow(); + if(fToggleHidden) + { + Sleep(1); + if (GUIUtil::isObscured(this)) + hide(); + } } else if(fToggleHidden) hide(); @@ -1001,3 +1291,14 @@ void BitcoinGUI::toggleHidden() { showNormalIfMinimized(true); } + +void BitcoinGUI::error(const QString &title, const QString &message, bool modal) +{ + // Report errors from network/worker thread + if(modal) + { + QMessageBox::critical(this, title, message, QMessageBox::Ok, QMessageBox::Ok); + } else { + notificator->notify(Notificator::Critical, title, message); + } +}