#include "askpassphrasedialog.h"
#include "notificator.h"
#include "guiutil.h"
+#include "ui_interface.h"
#include "rpcconsole.h"
#ifdef Q_OS_MAC
// 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);
encryptWalletAction->setCheckable(true);
backupWalletAction = new QAction(QIcon(":/icons/filesave"), tr("&Backup Wallet..."), this);
backupWalletAction->setToolTip(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"));
signMessageAction = new QAction(QIcon(":/icons/edit"), tr("Sign &message..."), this);
connect(toggleHideAction, SIGNAL(triggered()), this, SLOT(toggleHidden()));
connect(encryptWalletAction, SIGNAL(triggered(bool)), this, SLOT(encryptWallet(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()));
// Configure the menus
QMenu *file = appMenuBar->addMenu(tr("&File"));
file->addAction(backupWalletAction);
+ file->addSeparator();
+ file->addAction(dumpWalletAction);
+ file->addAction(importWalletAction);
file->addAction(exportAction);
file->addAction(signMessageAction);
file->addAction(verifyMessageAction);
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()));
// Report errors from network/worker thread
connect(clientModel, SIGNAL(error(QString,QString,bool)), this, SLOT(error(QString,QString,bool)));
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)),
progressBar->setToolTip(tooltip);
}
+void BitcoinGUI::updateMining()
+{
+ if(!walletModel)
+ return;
+
+ 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);
+
+ if (nTotalWeight > 0)
+ {
+ labelMiningIcon->setPixmap(QIcon(":/icons/mining_active").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE));
+
+ double dNetworkWeight = clientModel->getPoSKernelPS();
+/*
+ double dDifficulty = clientModel->getDifficulty(true);
+ QString msg;
+
+ int nApproxTime = 4294967297 * dDifficulty / nTotalWeight;
+
+ if (nApproxTime < 60)
+ msg = tr("%n second(s)", "", nApproxTime);
+ else if (nApproxTime < 60*60)
+ msg = tr("%n minute(s)", "", nApproxTime / 60);
+ else if (nApproxTime < 24*60*60)
+ msg = tr("%n hour(s)", "", nApproxTime / 3600);
+ else
+ msg = tr("%n day(s)", "", nApproxTime / 86400);
+
+ 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));
+ }
+ 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
}
}
+void BitcoinGUI::message(const QString &title, const QString &message, unsigned int style, const QString &detail)
+{
+ QString strTitle = tr("NovaCoin") + " - ";
+ // Default to information icon
+ int nMBoxIcon = QMessageBox::Information;
+ int nNotifyIcon = Notificator::Information;
+
+
+ // Check for usage of predefined title
+ switch (style) {
+ case CClientUIInterface::MSG_ERROR:
+ strTitle += tr("Error");
+ break;
+ case CClientUIInterface::MSG_WARNING:
+ strTitle += tr("Warning");
+ break;
+ case CClientUIInterface::MSG_INFORMATION:
+ strTitle += tr("Information");
+ break;
+ default:
+ strTitle += title; // Use supplied title
+ }
+
+ // Check for error/warning icon
+ if (style & CClientUIInterface::ICON_ERROR) {
+ nMBoxIcon = QMessageBox::Critical;
+ nNotifyIcon = Notificator::Critical;
+ }
+ else if (style & CClientUIInterface::ICON_WARNING) {
+ nMBoxIcon = QMessageBox::Warning;
+ nNotifyIcon = Notificator::Warning;
+ }
+
+ // Display message
+ if (style & CClientUIInterface::MODAL) {
+ // Check for buttons, use OK as default, if none was supplied
+ QMessageBox::StandardButton buttons;
+ buttons = QMessageBox::Ok;
+
+ QMessageBox mBox((QMessageBox::Icon)nMBoxIcon, strTitle, message, buttons);
+
+ if(!detail.isEmpty()) { mBox.setDetailedText(detail); }
+
+ mBox.exec();
+ }
+ else
+ notificator->notify((Notificator::Class)nNotifyIcon, strTitle, message);
+}
+
+
void BitcoinGUI::changeEvent(QEvent *e)
{
QMainWindow::changeEvent(e);
}
}
+void BitcoinGUI::dumpWallet()
+{
+ if(!walletModel)
+ return;
+
+ WalletModel::UnlockContext ctx(walletModel->requestUnlock());
+ if(!ctx.isValid())
+ {
+ // Unlock wallet failed or was cancelled
+ return;
+ }
+
+#if QT_VERSION < 0x050000
+ QString saveDir = QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation);
+#else
+ QString saveDir = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
+#endif
+ QString filename = QFileDialog::getSaveFileName(this, tr("Dump Wallet"), saveDir, tr("Wallet dump (*.txt)"));
+ if(!filename.isEmpty()) {
+ if(!walletModel->dumpWallet(filename)) {
+ error(tr("Dump failed"),
+ tr("An error happened while trying to save the keys to your location.\n"
+ "Keys were not saved.")
+ ,CClientUIInterface::MSG_ERROR);
+ }
+ else
+ message(tr("Dump successful"),
+ tr("Keys were saved to this file:\n%2")
+ .arg(filename)
+ ,CClientUIInterface::MSG_INFORMATION);
+ }
+}
+
+void BitcoinGUI::importWallet()
+{
+ if(!walletModel)
+ return;
+
+ WalletModel::UnlockContext ctx(walletModel->requestUnlock());
+ if(!ctx.isValid())
+ {
+ // Unlock wallet failed or was cancelled
+ return;
+ }
+
+#if QT_VERSION < 0x050000
+ QString openDir = QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation);
+#else
+ QString openDir = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
+#endif
+ QString filename = QFileDialog::getOpenFileName(this, tr("Import Wallet"), openDir, tr("Wallet dump (*.txt)"));
+ if(!filename.isEmpty()) {
+ if(!walletModel->importWallet(filename)) {
+ error(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)
+ ,CClientUIInterface::MSG_ERROR);
+ }
+ else
+ message(tr("Import Successful"),
+ tr("All keys from:\n %1,\n were imported into your wallet.")
+ .arg(filename)
+ ,CClientUIInterface::MSG_INFORMATION);
+ }
+}
+
+
void BitcoinGUI::changePassphrase()
{
AskPassphraseDialog dlg(AskPassphraseDialog::ChangePass, this);