X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Fqt%2Fbitcoingui.cpp;h=a191a8df094d4ba72df622918b7f84aba206b577;hb=970439b145539a9f25925d0c73de6adf02c6e81e;hp=2bf2b6c72d89f3b69e58599253ba01716b562f48;hpb=9d2b43e373410eb63ab00d4e5068faeeabd453f9;p=novacoin.git diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index 2bf2b6c..a191a8d 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -9,6 +9,7 @@ #include "addressbookpage.h" #include "sendcoinsdialog.h" #include "signverifymessagedialog.h" +#include "multisigdialog.h" #include "optionsdialog.h" #include "aboutdialog.h" #include "clientmodel.h" @@ -74,6 +75,8 @@ BitcoinGUI::BitcoinGUI(QWidget *parent): QMainWindow(parent), clientModel(0), walletModel(0), + signVerifyMessageDialog(0), + multisigPage(0), encryptWalletAction(0), lockWalletAction(0), unlockWalletAction(0), @@ -82,7 +85,9 @@ BitcoinGUI::BitcoinGUI(QWidget *parent): aboutQtAction(0), trayIcon(0), notificator(0), - rpcConsole(0) + rpcConsole(0), + aboutDialog(0), + optionsDialog(0) { resize(850, 550); setWindowTitle(tr("NovaCoin") + " - " + tr("Wallet")); @@ -129,7 +134,9 @@ BitcoinGUI::BitcoinGUI(QWidget *parent): sendCoinsPage = new SendCoinsDialog(this); - signVerifyMessageDialog = new SignVerifyMessageDialog(this); + signVerifyMessageDialog = new SignVerifyMessageDialog(0); + + multisigPage = new MultisigDialog(0); centralWidget = new QStackedWidget(this); centralWidget->addWidget(overviewPage); @@ -194,9 +201,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())); + 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))); // Clicking on "Sign Message" in the receive coins page sends you to the sign message tab @@ -212,6 +222,12 @@ BitcoinGUI::~BitcoinGUI() #ifdef Q_OS_MAC delete appMenuBar; #endif + + delete rpcConsole; + delete aboutDialog; + delete optionsDialog; + delete multisigPage; + delete signVerifyMessageDialog; } void BitcoinGUI::createActions() @@ -254,6 +270,10 @@ void BitcoinGUI::createActions() 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())); @@ -266,55 +286,59 @@ void BitcoinGUI::createActions() 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); #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->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("Dump keys to a text file")); importWalletAction = new QAction(QIcon(":/icons/import"), tr("&Import Wallet..."), this); 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")); lockWalletAction = new QAction(QIcon(":/icons/lock_closed"), tr("&Lock wallet"), this); - lockWalletAction->setToolTip(tr("Lock wallet")); + lockWalletAction->setStatusTip(tr("Lock wallet")); lockWalletAction->setCheckable(true); unlockWalletAction = new QAction(QIcon(":/icons/lock_open"), tr("Unlo&ck wallet"), this); - unlockWalletAction->setToolTip(tr("Unlock wallet")); + unlockWalletAction->setStatusTip(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->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())); @@ -352,6 +376,7 @@ void BitcoinGUI::createMenuBar() file->addAction(exportAction); file->addAction(signMessageAction); file->addAction(verifyMessageAction); + file->addAction(multisigAction); file->addSeparator(); file->addAction(quitAction); @@ -385,6 +410,8 @@ void BitcoinGUI::createToolBars() QToolBar *toolbar2 = addToolBar(tr("Actions toolbar")); toolbar2->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); toolbar2->addAction(exportAction); + toolbar2->setVisible(false); + } void BitcoinGUI::setClientModel(ClientModel *clientModel) @@ -418,7 +445,10 @@ void BitcoinGUI::setClientModel(ClientModel *clientModel) setNumBlocks(clientModel->getNumBlocks(), clientModel->getNumBlocksOfPeers()); connect(clientModel, SIGNAL(numBlocksChanged(int,int)), this, SLOT(setNumBlocks(int,int))); - connect(clientModel, SIGNAL(numBlocksChanged(int,int)), this, SLOT(updateMining())); + + 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))); @@ -446,6 +476,7 @@ void BitcoinGUI::setWalletModel(WalletModel *walletModel) receiveCoinsPage->setModel(walletModel->getAddressTableModel()); sendCoinsPage->setModel(walletModel); signVerifyMessageDialog->setModel(walletModel); + multisigPage->setModel(walletModel); setEncryptionStatus(walletModel->getEncryptionStatus()); connect(walletModel, SIGNAL(encryptionStatusChanged(int)), this, SLOT(setEncryptionStatus(int))); @@ -483,6 +514,7 @@ void BitcoinGUI::createTrayIcon() trayIconMenu->addAction(toggleHideAction); trayIconMenu->addSeparator(); trayIconMenu->addAction(sendCoinsAction); + trayIconMenu->addAction(multisigAction); trayIconMenu->addAction(receiveCoinsAction); trayIconMenu->addSeparator(); trayIconMenu->addAction(signMessageAction); @@ -493,10 +525,9 @@ void BitcoinGUI::createTrayIcon() #ifndef Q_OS_MAC // This is built-in on Mac trayIconMenu->addSeparator(); - trayIconMenu->addAction(quitAction); - - notificator = new Notificator(qApp->applicationName(), trayIcon, 0); + trayIconMenu->addAction(quitAction); #endif + notificator = new Notificator(QApplication::applicationName(), trayIcon, this); } #ifndef Q_OS_MAC @@ -514,16 +545,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) @@ -671,14 +703,14 @@ void BitcoinGUI::updateMining() 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)); - uint64 nNetworkWeight = clientModel->getPoSKernelPS(); + uint64_t nNetworkWeight = clientModel->getPoSKernelPS(); /* double dDifficulty = clientModel->getDifficulty(true); QString msg; @@ -697,23 +729,12 @@ 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(nNetworkWeight)); + labelMiningIcon->setToolTip(QString("")+tr("Stake miner is active
Kernel rate is %1 k/s
CD rate is %2 CD/s
Network weight is %3").arg(nKernelsRate).arg(nCoinDaysRate).arg(nNetworkWeight)+QString("<\nobr>")); } else labelMiningIcon->setToolTip(tr("No suitable inputs were found")); } -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); - } -} - void BitcoinGUI::message(const QString &title, const QString &message, unsigned int style, const QString &detail) { QString strTitle = tr("NovaCoin") + " - "; @@ -788,13 +809,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); } @@ -923,6 +946,12 @@ void BitcoinGUI::gotoVerifyMessageTab(QString addr) signVerifyMessageDialog->setAddress_VM(addr); } +void BitcoinGUI::gotoMultisigPage() +{ + multisigPage->show(); + multisigPage->setFocus(); +} + void BitcoinGUI::dragEnterEvent(QDragEnterEvent *event) { // Accept only URIs @@ -983,7 +1012,7 @@ 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); @@ -1002,7 +1031,7 @@ 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); @@ -1076,7 +1105,7 @@ void BitcoinGUI::dumpWallet() QString filename = QFileDialog::getSaveFileName(this, tr("Dump Wallet"), saveDir, tr("Wallet dump (*.txt)")); if(!filename.isEmpty()) { if(!walletModel->dumpWallet(filename)) { - error(tr("Dump failed"), + message(tr("Dump failed"), tr("An error happened while trying to save the keys to your location.\n" "Keys were not saved.") ,CClientUIInterface::MSG_ERROR); @@ -1109,7 +1138,7 @@ void BitcoinGUI::importWallet() 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) @@ -1157,18 +1186,29 @@ 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(); @@ -1178,3 +1218,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); + } +}