28 #define REQUEST_UPGRADE_WALLET 1
37 QPushButton* button = qobject_cast<QPushButton*>(watched);
38 if (!button)
return false;
40 if (event->type() == QEvent::Enter) {
41 button->setIcon(QIcon(
"://ic-information-hover"));
45 if (event->type() == QEvent::Leave){
46 button->setIcon(QIcon(
"://ic-information"));
60 this->setStyleSheet(_mainWindow->styleSheet());
62 ui->containerTop->setContentsMargins(10, 4, 10, 10);
64 ui->containerTop->load(
"://bg-dashboard-banner");
67 ui->containerTop->setProperty(
"cssClass",
"container-top");
70 std::initializer_list<QWidget*> lblTitles = {
ui->labelTitle1,
ui->labelTitle3,
ui->labelTitle4,
ui->labelTrans,
ui->labelShield};
73 font.setWeight(QFont::Light);
74 for (QWidget* w : lblTitles) { w->setFont(font); }
77 ui->widgetTopAmount->setVisible(
false);
78 setCssProperty({
ui->labelAmountTopPiv,
ui->labelAmountTopShieldedPiv},
"amount-small-topbar");
94 ui->pushButtonFAQ->setButtonClassStyle(
"cssClass",
"btn-check-faq");
95 ui->pushButtonFAQ->setButtonText(tr(
"FAQ"));
97 ui->pushButtonHDUpgrade->setButtonClassStyle(
"cssClass",
"btn-check-hd-upgrade");
98 ui->pushButtonHDUpgrade->setButtonText(tr(
"Upgrade to HD Wallet"));
99 ui->pushButtonHDUpgrade->setNoIconText(
"HD");
101 ui->pushButtonConnection->setButtonClassStyle(
"cssClass",
"btn-check-connect-inactive");
102 ui->pushButtonConnection->setButtonText(tr(
"No Connection"));
104 ui->pushButtonTor->setButtonClassStyle(
"cssClass",
"btn-check-tor-inactive");
105 ui->pushButtonTor->setButtonText(tr(
"Tor Disabled"));
106 ui->pushButtonTor->setChecked(
false);
108 ui->pushButtonStack->setButtonClassStyle(
"cssClass",
"btn-check-stack-inactive");
109 ui->pushButtonStack->setButtonText(tr(
"Staking Disabled"));
111 ui->pushButtonColdStaking->setButtonClassStyle(
"cssClass",
"btn-check-cold-staking-inactive");
112 ui->pushButtonColdStaking->setButtonText(tr(
"Cold Staking Disabled"));
114 ui->pushButtonSync->setButtonClassStyle(
"cssClass",
"btn-check-sync");
115 ui->pushButtonSync->setButtonText(tr(
" %54 Synchronizing.."));
117 ui->pushButtonLock->setButtonClassStyle(
"cssClass",
"btn-check-lock");
120 ui->pushButtonTheme->setButtonClassStyle(
"cssClass",
"btn-check-theme-light");
121 ui->pushButtonTheme->setButtonText(tr(
"Light Theme"));
123 ui->pushButtonTheme->setButtonClassStyle(
"cssClass",
"btn-check-theme-dark");
124 ui->pushButtonTheme->setButtonText(tr(
"Dark Theme"));
131 ui->pushButtonBalanceInfo->installEventFilter(watcher);
134 QPixmap pixmap(
"://img-qr-test");
139 Qt::KeepAspectRatio))
142 ui->pushButtonLock->setButtonText(tr(
"Wallet Locked "));
143 ui->pushButtonLock->setButtonClassStyle(
"cssClass",
"btn-check-status-lock");
167 ui->pushButtonTheme->setButtonClassStyle(
"cssClass",
"btn-check-theme-light",
true);
168 ui->pushButtonTheme->setButtonText(tr(
"Light Theme"));
170 ui->pushButtonTheme->setButtonClassStyle(
"cssClass",
"btn-check-theme-dark",
true);
171 ui->pushButtonTheme->setButtonText(tr(
"Dark Theme"));
189 QMetaObject::invokeMethod(this,
"lockDropdownMouseLeave", Qt::QueuedConnection);
195 if (
ui->pushButtonLock->width() <= 40) {
196 ui->pushButtonLock->setExpanded();
199 ui->pushButtonLock->setKeepExpanded(
true);
200 QMetaObject::invokeMethod(
this,
"openLockUnlock", Qt::QueuedConnection);
212 ui->pushButtonLock->y() + 36
248 static bool isExecuting =
false;
261 ui->pushButtonLock->setButtonText(tr(
"Wallet Locked"));
262 ui->pushButtonLock->setButtonClassStyle(
"cssClass",
"btn-check-status-lock",
true);
277 ui->pushButtonLock->setButtonText(tr(
"Wallet Unlocked"));
278 ui->pushButtonLock->setButtonClassStyle(
"cssClass",
"btn-check-status-unlock",
true);
300 ui->pushButtonLock->setButtonText(tr(
"Wallet Unlocked for staking"));
301 ui->pushButtonLock->setButtonClassStyle(
"cssClass",
"btn-check-status-staking",
true);
307 ui->pushButtonLock->setKeepExpanded(
false);
308 ui->pushButtonLock->setSmall();
309 ui->pushButtonLock->update();
319 ui->pushButtonLock->setKeepExpanded(
false);
320 ui->pushButtonLock->setSmall();
321 ui->pushButtonLock->update();
329 if (addressStr.isNull()) {
330 inform(tr(
"Error generating address"));
335 receiveDialog->
updateQr(addressStr);
337 inform(tr(
"Address Copied"));
339 receiveDialog->deleteLater();
355 QPoint pos = this->pos();
356 pos.setX(pos.x() + (
ui->labelTitle1->width()) + 60);
357 pos.setY(pos.y() + 20);
364 if (
ui->bottom_container->isVisible()) {
366 ui->bottom_container->setVisible(
false);
367 ui->widgetTopAmount->setVisible(
true);
368 this->setFixedHeight(75);
374 ui->widgetTopAmount->setVisible(
false);
375 ui->bottom_container->setVisible(
true);
376 this->setFixedHeight(200);
383 ui->pushButtonColdStaking->setChecked(isColdStakingEnabled);
390 if (isColdStakingEnabled) {
391 text =
"Cold Staking Active";
392 className = (show) ?
"btn-check-cold-staking-checked" :
"btn-check-cold-staking-unchecked";
394 className =
"btn-check-cold-staking";
395 text =
"Cold Staking Enabled";
397 className =
"btn-check-cold-staking-inactive";
398 text =
"Cold Staking Disabled";
401 ui->pushButtonColdStaking->setButtonClassStyle(
"cssClass", className,
true);
402 ui->pushButtonColdStaking->setButtonText(text);
436 if (
ui->pushButtonStack->isChecked() != fActive) {
437 ui->pushButtonStack->setButtonText(fActive ? tr(
"Staking active") : tr(
"Staking not active"));
438 ui->pushButtonStack->setChecked(fActive);
439 ui->pushButtonStack->setButtonClassStyle(
"cssClass", (fActive ?
441 "btn-check-stack-inactive"),
true);
458 if (!
ui->pushButtonConnection->isChecked()) {
459 ui->pushButtonConnection->setChecked(
true);
460 ui->pushButtonConnection->setButtonClassStyle(
"cssClass",
"btn-check-connect",
true);
463 if (
ui->pushButtonConnection->isChecked()) {
464 ui->pushButtonConnection->setChecked(
false);
465 ui->pushButtonConnection->setButtonClassStyle(
"cssClass",
"btn-check-connect-inactive",
true);
469 ui->pushButtonConnection->setButtonText(tr(
"%n active connection(s)",
"", count));
475 ui->pushButtonSync->setButtonText(tr(
"Network activity disabled"));
476 ui->pushButtonSync->setButtonClassStyle(
"cssClass",
"btn-check-sync-inactive",
true);
480 ui->pushButtonSync->setButtonClassStyle(
"cssClass",
"btn-check-sync",
true);
490 bool needState =
true;
496 ui->pushButtonSync->setButtonText(tr(
"Synchronized - Block: %1").arg(QString::number(count)));
524 QDateTime currentDate = QDateTime::currentDateTime();
525 int secs = lastBlockDate.secsTo(currentDate);
527 QString timeBehindText;
528 const int HOUR_IN_SECONDS = 60 * 60;
529 const int DAY_IN_SECONDS = 24 * 60 * 60;
530 const int WEEK_IN_SECONDS = 7 * 24 * 60 * 60;
531 const int YEAR_IN_SECONDS = 31556952;
532 if (secs < 2 * DAY_IN_SECONDS) {
533 timeBehindText = tr(
"%n hour(s)",
"", secs / HOUR_IN_SECONDS);
534 }
else if (secs < 2 * WEEK_IN_SECONDS) {
535 timeBehindText = tr(
"%n day(s)",
"", secs / DAY_IN_SECONDS);
536 }
else if (secs < YEAR_IN_SECONDS) {
537 timeBehindText = tr(
"%n week(s)",
"", secs / WEEK_IN_SECONDS);
539 int years = secs / YEAR_IN_SECONDS;
540 int remainder = secs % YEAR_IN_SECONDS;
541 timeBehindText = tr(
"%1 and %2").arg(tr(
"%n year(s)",
"", years)).arg(
542 tr(
"%n week(s)",
"", remainder / WEEK_IN_SECONDS));
544 QString timeBehind(
" behind. Scanning block ");
545 QString str = timeBehindText + timeBehind + QString::number(count);
546 text = str.toStdString();
553 text =
"No block source available..";
556 ui->pushButtonSync->setButtonText(tr(text.data()));
561 QString title = tr(
"Wallet Upgrade");
563 std::unique_ptr<WalletModel::UnlockContext> pctx = std::make_unique<WalletModel::UnlockContext>(
walletModel->
requestUnlock());
564 if (!pctx->isValid()) {
565 warn(tr(
"Upgrade Wallet"), tr(
"Wallet unlock cancelled"));
581 ui->pushButtonHDUpgrade->setVisible(
false);
584 ui->pushButtonHDUpgrade->setButtonText(tr(
"Upgrade to Sapling Wallet"));
585 ui->pushButtonHDUpgrade->setNoIconText(
"SHIELD UPGRADE");
587 "NOTE: after the upgrade, a new\nbackup will be created.\n"));
591 "NOTE: after the upgrade, a new\nbackup will be created.\n"));
614 QTimer::singleShot(4000, func);
623 if (!
ui->pushButtonTor->isChecked()) {
624 ui->pushButtonTor->setChecked(
true);
625 ui->pushButtonTor->setButtonClassStyle(
"cssClass",
"btn-check-tor",
true);
627 ui->pushButtonTor->setButtonText(tr(
"Tor Active"));
628 ui->pushButtonTor->setToolTip(
"Address: " + QString::fromStdString(ip_port));
630 if (
ui->pushButtonTor->isChecked()) {
631 ui->pushButtonTor->setChecked(
false);
632 ui->pushButtonTor->setButtonClassStyle(
"cssClass",
"btn-check-tor-inactive",
true);
633 ui->pushButtonTor->setButtonText(tr(
"Tor Disabled"));
647 case WalletModel::EncryptionStatus::Unencrypted:
648 ui->pushButtonLock->setButtonText(tr(
"Wallet Unencrypted"));
649 ui->pushButtonLock->setButtonClassStyle(
"cssClass",
"btn-check-status-unlock",
true);
651 case WalletModel::EncryptionStatus::Locked:
652 ui->pushButtonLock->setButtonText(tr(
"Wallet Locked"));
653 ui->pushButtonLock->setButtonClassStyle(
"cssClass",
"btn-check-status-lock",
true);
655 case WalletModel::EncryptionStatus::UnlockedForStaking:
656 ui->pushButtonLock->setButtonText(tr(
"Wallet Unlocked for staking"));
657 ui->pushButtonLock->setButtonClassStyle(
"cssClass",
"btn-check-status-staking",
true);
659 case WalletModel::EncryptionStatus::Unlocked:
660 ui->pushButtonLock->setButtonText(tr(
"Wallet Unlocked"));
661 ui->pushButtonLock->setButtonClassStyle(
"cssClass",
"btn-check-status-unlock",
true);
684 ui->labelTitle1->setText(nLockedBalance > 0 ? tr(
"Available (Locked included)") : tr(
"Available"));
693 ui->labelAmountTopPiv->setText(totalTransparent);
694 ui->labelAmountTopShieldedPiv->setText(totalShielded);
696 ui->labelAmountPiv->setText(totalPiv);
704 QWidget::resizeEvent(event);
709 QMetaObject::invokeMethod(
this,
"expandSync", Qt::QueuedConnection);
715 progressBar->setMaximumWidth(
ui->pushButtonSync->maximumWidth());
717 progressBar->setMinimumWidth(
ui->pushButtonSync->width() - 2);
724 ui->pushButtonHDUpgrade->setVisible(
false);
725 if (
ask(
"HD Upgrade Complete", tr(
"The wallet has been successfully upgraded to HD.") +
"\n" +
726 tr(
"It is advised to make a backup.") +
"\n\n" + tr(
"Do you wish to backup now?") +
"\n\n")) {
729 tr(
"Backup Wallet"), QString(),
730 tr(
"Wallet Data (*.dat)"),
nullptr);
731 if (!filename.isEmpty()) {
734 warn(tr(
"Backup creation failed"), tr(
"no file selected"));
737 inform(tr(
"Wallet upgraded successfully, but no backup created.") +
"\n" +
738 tr(
"WARNING: remember to make a copy of your wallet file!"));
741 warn(tr(
"Upgrade Wallet Error"), upgradeError);
748 std::string upgradeError;
750 QMetaObject::invokeMethod(
this,
752 Qt::QueuedConnection,
754 Q_ARG(QString, QString::fromStdString(upgradeError))
int64_t CAmount
Amount in PIV (Can be negative)
QString getAddressToShow(bool shielded=false) const
Return last unused address.
Multifunctional dialog to ask for passphrases.
@ Encrypt
Wallet needs to be fully unlocked.
@ Unlock_Full
Unlock wallet from menu
@ ToggleLock
Encrypt unencrypted wallet.
@ Encrypt
Ask passphrase twice and encrypt.
@ UnlockAnonymize
Ask passphrase and unlock only for anonymization.
@ Unlock
Ask passphrase and unlock.
void updateValues(int64_t nTransparentBalance, int64_t nShieldedBalance, int unit)
int RequestedMasternodeAttempt
std::string GetSyncStatus()
bool getTorInfo(std::string &ip_port) const
void numBlocksChanged(int count)
double getVerificationProgress() const
QDateTime getLastBlockDate() const
void numConnectionsChanged(int count)
int getNumConnections(unsigned int flags=CONNECTIONS_ALL) const
Return number of connections, default is in- and outbound (total)
int getLastBlockProcessedHeight() const
void networkActiveChanged(bool networkActive)
void execute(Runnable *runnable, int type, std::unique_ptr< WalletModel::UnlockContext > pctx=nullptr)
void lockClicked(const StateClicked &state)
void updateStatus(WalletModel::EncryptionStatus status)
bool invertColdStakingScreenStatus()
void displayUnitChanged(int unit)
bool isColdStakingScreenEnabled()
void updateQr(const QString &address)
bool IsBlockchainSynced() const
TopBar(PIVXGUI *_mainWindow, QWidget *parent=nullptr)
void resizeEvent(QResizeEvent *event) override
void walletSynced(bool isSync)
void loadClientModel() override
void updateHDState(const bool upgraded, const QString &upgradeError)
QProgressBar * progressBar
void setNumBlocks(int count)
void onError(QString error, int type) override
void onColdStakingClicked()
void run(int type) override
QTimer * timerStakingIcon
void onShowHideColdStakingChanged(bool show)
void updateBalances(const interfaces::WalletBalances &newBalance)
void loadWalletModel() override
void onBtnBalanceInfoClicked()
void refreshProgressBarSize()
void openPassPhraseDialog(AskPassphraseDialog::Mode mode, AskPassphraseDialog::Context ctx)
BalanceBubble * balanceBubble
void onBtnReceiveClicked()
void connectUpgradeBtnAndDialogTimer(const QString &message)
void setNetworkActive(bool active)
void updateStakingStatus()
void tierTwoSynced(bool isSync)
void setNumConnections(int count)
void setStakingStatusActive(bool fActive)
void lockDropdownMouseLeave()
void lockDropdownClicked(const StateClicked &)
void themeChanged(bool isLight)
void showUpgradeDialog(const QString &message)
LockUnlock * lockUnlockWidget
bool isStakingStatusActive() const
void balanceChanged(const interfaces::WalletBalances &walletBalances)
bool isWalletLocked(bool fFullUnlocked=true) const
CAmount getLockedBalance(bool isTransparent) const
bool isShutdownRequested()
void encryptionStatusChanged(int status)
bool upgradeWallet(std::string &upgradeError)
AddressTableModel * getAddressTableModel()
OptionsModel * getOptionsModel()
bool isColdStaking() const
bool backupWallet(const QString &filename)
bool setWalletLocked(bool locked, const SecureString &passPhrase=SecureString(), bool stakingOnly=false)
EncryptionStatus getEncryptionStatus() const
interfaces::WalletBalances GetWalletBalances()
UnlockContext requestUnlock()
bool lockForStakingOnly(const SecureString &passPhrase=SecureString())
bool isSaplingWalletEnabled() const
CMasternodeSync masternodeSync
QString getSaveFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedSuffixOut)
Get save filename, mimics QFileDialog::getSaveFileName, except that it appends a default suffix when ...
QString formatBalance(CAmount amount, int nDisplayUnit, bool isZpiv)
bool openDialogWithOpaqueBackgroundFullScreen(QDialog *widget, PIVXGUI *gui)
bool openDialogWithOpaqueBackgroundY(QDialog *widget, PIVXGUI *gui, double posX, int posY, bool hideOpaqueBackground)
bool openDialogWithOpaqueBackground(QDialog *widget, PIVXGUI *gui, double posX)
void setCssProperty(std::initializer_list< QWidget * > args, const QString &value)
void updateStyle(QWidget *widget)
void setTheme(bool isLight)
Collection of wallet balances.
CAmount unconfirmed_balance
CAmount unconfirmed_shielded_balance
bool error(const char *fmt, const Args &... args)
TierTwoSyncState g_tiertwo_sync_state
#define MASTERNODE_SYNC_THRESHOLD
#define REQUEST_UPGRADE_WALLET