#include "addressbookpage.h"
#include "sendcoinsdialog.h"
#include "signverifymessagedialog.h"
+#include "secondauthdialog.h"
#include "multisigdialog.h"
#include "optionsdialog.h"
#include "aboutdialog.h"
#include <iostream>
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),
trayIcon(0),
notificator(0),
rpcConsole(0),
- aboutDialog(0)
+ aboutDialog(0),
+ optionsDialog(0)
{
resize(850, 550);
setWindowTitle(tr("NovaCoin") + " - " + tr("Wallet"));
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();
sendCoinsPage = new SendCoinsDialog(this);
- signVerifyMessageDialog = new SignVerifyMessageDialog(this);
+ signVerifyMessageDialog = new SignVerifyMessageDialog(0);
+
+ secondAuthDialog = new SecondAuthDialog(0);
- multisigPage = new MultisigDialog(this);
+ multisigPage = new MultisigDialog(0);
centralWidget = new QStackedWidget(this);
centralWidget->addWidget(overviewPage);
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)));
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);
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"));
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()
file->addAction(exportAction);
file->addAction(signMessageAction);
file->addAction(verifyMessageAction);
+ file->addAction(secondAuthAction);
file->addAction(multisigAction);
file->addSeparator();
file->addAction(quitAction);
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);
receiveCoinsPage->setModel(walletModel->getAddressTableModel());
sendCoinsPage->setModel(walletModel);
signVerifyMessageDialog->setModel(walletModel);
+ secondAuthDialog->setModel(walletModel);
multisigPage->setModel(walletModel);
setEncryptionStatus(walletModel->getEncryptionStatus());
trayIconMenu->addSeparator();
trayIconMenu->addAction(signMessageAction);
trayIconMenu->addAction(verifyMessageAction);
+ trayIconMenu->addAction(secondAuthAction);
trayIconMenu->addSeparator();
trayIconMenu->addAction(optionsAction);
trayIconMenu->addAction(openRPCConsoleAction);
{
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()
progressBar->setVisible(false);
}
+ tooltip = tr("Current PoW difficulty is %1.").arg(clientModel->getDifficulty(false)) + QString("<br>") + tooltip;
+ tooltip = tr("Current PoS difficulty is %1.").arg(clientModel->getDifficulty(true)) + QString("<br>") + tooltip;
+
QDateTime lastBlockDate = clientModel->getLastBlockDate();
int secs = lastBlockDate.secsTo(QDateTime::currentDateTime());
QString text;
return;
}
- float nKernelsRate = 0, nCoinDaysRate = 0;
- walletModel->getStakeStats(nKernelsRate, nCoinDaysRate);
-
- if (nKernelsRate > 0)
+ if (nStakeInputsMapSize > 0)
{
labelMiningIcon->setPixmap(QIcon(":/icons/mining_active").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE));
uint64_t nNetworkWeight = 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(QString("<nobr>")+tr("Stake miner is active<br>Kernel rate is %1 k/s<br>CD rate is %2 CD/s<br>Network weight is %3").arg(nKernelsRate).arg(nCoinDaysRate).arg(nNetworkWeight)+QString("<\nobr>"));
+ labelMiningIcon->setToolTip(QString("<nobr>")+tr("Stake miner is active<br>%1 inputs being used for mining<br>Network weight is %3").arg(nStakeInputsMapSize).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") + " - ";
signVerifyMessageDialog->setAddress_VM(addr);
}
+void BitcoinGUI::gotoSecondAuthPage(QString addr)
+{
+ secondAuthDialog->show();
+ secondAuthDialog->raise();
+ secondAuthDialog->activateWindow();
+}
+
void BitcoinGUI::gotoMultisigPage()
{
multisigPage->show();
- multisigPage->setFocus();
+ multisigPage->raise();
+ multisigPage->activateWindow();
}
void BitcoinGUI::dragEnterEvent(QDragEnterEvent *event)
labelEncryptionIcon->setToolTip(tr("Wallet is <b>encrypted</b> and currently <b>unlocked</b>"));
encryptWalletAction->setChecked(true);
changePassphraseAction->setEnabled(true);
- encryptWalletAction->setEnabled(false); // TODO: decrypt currently not supported
+ encryptWalletAction->setEnabled(true);
lockWalletAction->setEnabled(true);
lockWalletAction->setChecked(false);
labelEncryptionIcon->setToolTip(tr("Wallet is <b>encrypted</b> and currently <b>locked</b>"));
encryptWalletAction->setChecked(true);
changePassphraseAction->setEnabled(true);
- encryptWalletAction->setEnabled(false); // TODO: decrypt currently not supported
+ encryptWalletAction->setEnabled(true);
lockWalletAction->setChecked(true);
unlockWalletAction->setChecked(false);
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);
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)
{
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);
+ }
+}