X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Fqt%2Fbitcoingui.cpp;h=a4c9a52e66fb834a130b8c6b787bd232743f4e66;hb=b50899ee42edc8aef21bf8965c293e74fd9e5f80;hp=c6d4b4118e6f2f9385844217fb01fa761349f3f4;hpb=0604b1b226eb02834b82d3873baa67b60e2e7398;p=novacoin.git diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index c6d4b41..a4c9a52 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -26,13 +26,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,19 +53,31 @@ #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; + BitcoinGUI::BitcoinGUI(QWidget *parent): QMainWindow(parent), clientModel(0), walletModel(0), encryptWalletAction(0), + lockWalletAction(0), + unlockWalletAction(0), + unlockWalletMiningAction(0), changePassphraseAction(0), aboutQtAction(0), trayIcon(0), @@ -102,6 +117,12 @@ 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); @@ -113,6 +134,7 @@ BitcoinGUI::BitcoinGUI(QWidget *parent): centralWidget = new QStackedWidget(this); centralWidget->addWidget(overviewPage); centralWidget->addWidget(transactionsPage); + centralWidget->addWidget(mintingPage); centralWidget->addWidget(addressBookPage); centralWidget->addWidget(receiveCoinsPage); centralWidget->addWidget(sendCoinsPage); @@ -124,8 +146,8 @@ 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); @@ -220,10 +242,16 @@ 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); connect(overviewAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); @@ -234,6 +262,8 @@ 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())); @@ -244,7 +274,11 @@ void BitcoinGUI::createActions() aboutAction = new QAction(QIcon(":/icons/bitcoin"), tr("&About NovaCoin"), this); aboutAction->setToolTip(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); +#else + aboutQtAction = new QAction(QIcon(":/qt-project.org/qmessagebox/images/qtlogo-64.png"), tr("About &Qt"), this); +#endif aboutQtAction->setToolTip(tr("Show information about Qt")); aboutQtAction->setMenuRole(QAction::AboutQtRole); optionsAction = new QAction(QIcon(":/icons/options"), tr("&Options..."), this); @@ -265,6 +299,18 @@ void BitcoinGUI::createActions() signMessageAction = new QAction(QIcon(":/icons/edit"), tr("Sign &message..."), this); verifyMessageAction = new QAction(QIcon(":/icons/transaction_0"), tr("&Verify message..."), this); + lockWalletAction = new QAction(QIcon(":/icons/lock_closed"), tr("&Lock wallet"), this); + lockWalletAction->setToolTip(tr("Lock wallet")); + lockWalletAction->setCheckable(true); + + unlockWalletAction = new QAction(QIcon(":/icons/lock_open"), tr("Unlo&ck wallet"), this); + unlockWalletAction->setToolTip(tr("Unlock wallet")); + unlockWalletAction->setCheckable(true); + + unlockWalletMiningAction = new QAction(QIcon(":/icons/mining_active"), tr("Unlo&ck wallet for mining"), this); + unlockWalletMiningAction->setToolTip(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")); openRPCConsoleAction = new QAction(QIcon(":/icons/debugwindow"), tr("&Debug window"), this); @@ -276,6 +322,9 @@ 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())); @@ -307,9 +356,12 @@ void BitcoinGUI::createMenuBar() 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")); @@ -327,11 +379,14 @@ void BitcoinGUI::createToolBars() 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) @@ -386,6 +441,7 @@ void BitcoinGUI::setWalletModel(WalletModel *walletModel) // Put transaction list in tabs transactionView->setModel(walletModel); + mintingView->setModel(walletModel); overviewPage->setModel(walletModel); addressBookPage->setModel(walletModel->getAddressTableModel()); @@ -395,6 +451,7 @@ void BitcoinGUI::setWalletModel(WalletModel *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)), @@ -420,6 +477,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 @@ -434,12 +492,13 @@ void BitcoinGUI::createTrayIcon() 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); -#endif - notificator = new Notificator(qApp->applicationName(), trayIcon); + notificator = new Notificator(qApp->applicationName(), trayIcon, 0); +#endif } #ifndef Q_OS_MAC @@ -597,22 +656,31 @@ void BitcoinGUI::updateMining() labelMiningIcon->setPixmap(QIcon(":/icons/mining_inactive").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE)); if (!clientModel->getNumConnections()) + { 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; + } - uint64 nMinWeight = 0, nMaxWeight = 0, nTotalWeight = 0; - walletModel->getStakeWeight(nMinWeight, nMaxWeight, nTotalWeight); + float nKernelsRate = 0, nCoinDaysRate = 0; + walletModel->getStakeStats(nKernelsRate, nCoinDaysRate); - if (nTotalWeight > 0) + if (nKernelsRate > 0) { labelMiningIcon->setPixmap(QIcon(":/icons/mining_active").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE)); - double dNetworkWeight = clientModel->getPoSKernelPS(); + uint64 nNetworkWeight = clientModel->getPoSKernelPS(); /* double dDifficulty = clientModel->getDifficulty(true); QString msg; @@ -631,7 +699,7 @@ void BitcoinGUI::updateMining() labelMiningIcon->setToolTip(tr("Stake miner is active\nYour current stake weight is %1\nNetwork weight is %2\nAverage block generation time is %3").arg(nTotalWeight).arg(dNetworkWeight).arg(msg)); */ - labelMiningIcon->setToolTip(tr("Stake miner is active\nYour current stake weight is %1\nNetwork weight is %2").arg(nTotalWeight).arg(dNetworkWeight)); + labelMiningIcon->setToolTip(tr("Stake miner is active\nKernel rate is %1 k/s\nCD rate is %2 CD/s\nNetwork weight is %3").arg(nKernelsRate).arg(nCoinDaysRate).arg(nNetworkWeight)); } else labelMiningIcon->setToolTip(tr("No suitable inputs were found")); @@ -799,6 +867,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); @@ -895,6 +974,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: @@ -904,6 +986,17 @@ void BitcoinGUI::setEncryptionStatus(int status) encryptWalletAction->setChecked(true); changePassphraseAction->setEnabled(true); encryptWalletAction->setEnabled(false); // TODO: decrypt currently not supported + + 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(); @@ -912,6 +1005,14 @@ void BitcoinGUI::setEncryptionStatus(int status) encryptWalletAction->setChecked(true); changePassphraseAction->setEnabled(true); encryptWalletAction->setEnabled(false); // TODO: decrypt currently not supported + + lockWalletAction->setChecked(true); + unlockWalletAction->setChecked(false); + unlockWalletMiningAction->setChecked(false); + + lockWalletAction->setEnabled(false); + unlockWalletAction->setEnabled(true); + unlockWalletMiningAction->setEnabled(true); break; } } @@ -928,9 +1029,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)) { @@ -1027,6 +1146,14 @@ 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