26 #include <QAbstractItemDelegate> 31 #define ICON_OFFSET 16 32 #define DECORATION_SIZE 54 34 #define NUM_ITEMS_ADV 7 47 inline void paint(QPainter *painter,
const QStyleOptionViewItem &option,
48 const QModelIndex &index )
const 53 QRect mainRect = option.rect;
58 int halfheight = (mainRect.height() - 2*ypad)/2;
59 QRect amountRect(mainRect.left() + xspace, mainRect.top()+ypad, mainRect.width() - xspace -
ICON_OFFSET, halfheight);
60 QRect addressRect(mainRect.left() + xspace, mainRect.top()+ypad+halfheight, mainRect.width() - xspace, halfheight);
62 icon.paint(painter, decorationRect);
65 QString address = index.data(Qt::DisplayRole).toString();
68 QVariant value = index.data(Qt::ForegroundRole);
69 QColor foreground = option.palette.color(QPalette::Text);
70 if(value.canConvert<QBrush>())
72 QBrush brush = qvariant_cast<QBrush>(value);
73 foreground = brush.color();
76 painter->setPen(foreground);
78 painter->drawText(addressRect, Qt::AlignLeft|Qt::AlignVCenter, address, &boundingRect);
83 QRect watchonlyRect(boundingRect.right() + 5, mainRect.top()+ypad+halfheight, 16, halfheight);
84 iconWatchonly.paint(painter, watchonlyRect);
97 foreground = option.palette.color(QPalette::Text);
99 painter->setPen(foreground);
103 amountText = QString(
"[") + amountText + QString(
"]");
105 painter->drawText(amountRect, Qt::AlignRight|Qt::AlignVCenter, amountText);
107 painter->setPen(option.palette.color(QPalette::Text));
113 inline QSize
sizeHint(
const QStyleOptionViewItem &option,
const QModelIndex &index)
const 122 #include "overviewpage.moc" 130 currentUnconfirmedBalance(-1),
131 currentImmatureBalance(-1),
132 currentWatchOnlyBalance(-1),
133 currentWatchUnconfBalance(-1),
134 currentWatchImmatureBalance(-1),
179 timer =
new QTimer(
this);
223 bool showImmature = immatureBalance != 0;
224 bool showWatchOnlyImmature = watchImmatureBalance != 0;
233 static int cachedTxLocks = 0;
268 connect(model, SIGNAL(alertsChanged(QString)),
this, SLOT(
updateAlerts(QString)));
283 connect(model, SIGNAL(balanceChanged(
CAmount,
CAmount,
CAmount,
CAmount,
CAmount,
CAmount,
CAmount)),
this, SLOT(
setBalance(
CAmount,
CAmount,
CAmount,
CAmount,
CAmount,
CAmount,
CAmount)));
336 QString strAmountAndRounds;
360 if(nMaxToAnonymize == 0)
return;
364 .arg(strPrivateSendAmount));
369 ui->
labelAmountRounds->setToolTip(tr(
"Not enough compatible inputs to anonymize <span style='color:red;'>%1</span>,<br>" 370 "will anonymize <span style='color:red;'>%2</span> instead")
371 .arg(strPrivateSendAmount)
372 .arg(strMaxToAnonymize));
374 strAmountAndRounds =
"<span style='color:red;'>" +
382 CAmount nDenominatedConfirmedBalance;
383 CAmount nDenominatedUnconfirmedBalance;
384 CAmount nNormalizedAnonymizedBalance;
385 float nAverageAnonymizedRounds;
396 float anonNormPart = 0;
398 float anonFullPart = 0;
400 CAmount denominatedBalance = nDenominatedConfirmedBalance + nDenominatedUnconfirmedBalance;
401 denomPart = (float)denominatedBalance / nMaxToAnonymize;
402 denomPart = denomPart > 1 ? 1 : denomPart;
405 anonNormPart = (float)nNormalizedAnonymizedBalance / nMaxToAnonymize;
406 anonNormPart = anonNormPart > 1 ? 1 : anonNormPart;
410 anonFullPart = anonFullPart > 1 ? 1 : anonFullPart;
414 float denomWeight = 1;
416 float anonFullWeight = 2;
417 float fullWeight = denomWeight + anonNormWeight + anonFullWeight;
419 float denomPartCalc = ceilf((denomPart * denomWeight / fullWeight) * 100) / 100;
420 float anonNormPartCalc = ceilf((anonNormPart * anonNormWeight / fullWeight) * 100) / 100;
421 float anonFullPartCalc = ceilf((anonFullPart * anonFullWeight / fullWeight) * 100) / 100;
422 float progress = denomPartCalc + anonNormPartCalc + anonFullPartCalc;
423 if(progress >= 100) progress = 100;
427 QString strToolPip = (
"<b>" + tr(
"Overall progress") +
": %1%</b><br/>" +
428 tr(
"Denominated") +
": %2%<br/>" +
429 tr(
"Mixed") +
": %3%<br/>" +
430 tr(
"Anonymized") +
": %4%<br/>" +
432 .arg(progress).arg(denomPart).arg(anonNormPart).arg(anonFullPart)
433 .arg(nAverageAnonymizedRounds);
459 static int64_t nLastDSProgressBlockTime = 0;
468 strKeysLeftText =
"<span style='color:red;'>" + strKeysLeftText +
"</span>";
481 QString strEnabled = tr(
"Disabled");
493 if(
settings.value(
"fLowKeysWarning").toBool()) {
494 QString strWarn = tr(
"Very low number of keys left since last automatic backup!") +
"<br><br>" +
495 tr(
"We are about to create a new automatic backup for you, however " 496 "<span style='color:red;'> you should always make sure you have backups " 497 "saved in some safe place</span>!") +
"<br><br>" +
498 tr(
"Note: You turn this message off in options.");
500 LogPrintf(
"OverviewPage::privateSendStatus -- Very low number of keys left since last automatic backup, warning user and trying to create new backup...\n");
501 QMessageBox::warning(
this, tr(
"PrivateSend"), strWarn, QMessageBox::Ok, QMessageBox::Ok);
503 LogPrintf(
"OverviewPage::privateSendStatus -- Very low number of keys left since last automatic backup, skipping warning and trying to create new backup...\n");
506 std::string strBackupWarning;
507 std::string strBackupError;
509 if (!strBackupWarning.empty()) {
511 LogPrintf(
"OverviewPage::privateSendStatus -- WARNING! Something went wrong on automatic backup: %s\n", strBackupWarning);
513 QMessageBox::warning(
this, tr(
"PrivateSend"),
514 tr(
"WARNING! Something went wrong on automatic backup") +
":<br><br>" + strBackupWarning.c_str(),
515 QMessageBox::Ok, QMessageBox::Ok);
517 if (!strBackupError.empty()) {
519 LogPrintf(
"OverviewPage::privateSendStatus -- ERROR! Failed to create automatic backup: %s\n", strBackupError);
521 QMessageBox::warning(
this, tr(
"PrivateSend"),
522 tr(
"ERROR! Failed to create automatic backup") +
":<br><br>" + strBackupError.c_str() +
"<br>" +
523 tr(
"Mixing is disabled, please close your wallet and fix the issue!"),
524 QMessageBox::Ok, QMessageBox::Ok);
538 QString strError = tr(
"ERROR! Failed to create automatic backup") +
", " +
539 tr(
"see debug.log for details.") +
"<br><br>" +
540 tr(
"Mixing is disabled, please close your wallet and fix the issue!");
546 QString strWarning = tr(
"WARNING! Failed to replenish keypool, please unlock your wallet to do so.");
559 QString s = tr(
"Last PrivateSend message:\n") + strStatus;
562 LogPrintf(
"OverviewPage::privateSendStatus -- Last PrivateSend message: %s\n", strStatus.toStdString());
582 QMessageBox::warning(
this, tr(
"PrivateSend"),
583 tr(
"PrivateSend was successfully reset."),
584 QMessageBox::Ok, QMessageBox::Ok);
595 QString hasMixed =
settings.value(
"hasMixed").toString();
596 if(hasMixed.isEmpty()){
597 QMessageBox::information(
this, tr(
"PrivateSend"),
598 tr(
"If you don't want to see internal PrivateSend fees/transactions select \"Most Common\" as Type on the \"Transactions\" tab."),
599 QMessageBox::Ok, QMessageBox::Ok);
600 settings.setValue(
"hasMixed",
"hasMixed");
606 QMessageBox::warning(
this, tr(
"PrivateSend"),
607 tr(
"PrivateSend requires at least %1 to use.").arg(strMinAmount),
608 QMessageBox::Ok, QMessageBox::Ok);
620 QMessageBox::warning(
this, tr(
"PrivateSend"),
621 tr(
"Wallet is locked and user declined to unlock. Disabling PrivateSend."),
622 QMessageBox::Ok, QMessageBox::Ok);
623 LogPrint(
"privatesend",
"OverviewPage::togglePrivateSend -- Wallet is locked and user declined to unlock. Disabling PrivateSend.\n");
657 filter->setLimit(nNumItems);
658 filter->setDynamicSortFilter(
true);
659 filter->setSortRole(Qt::EditRole);
660 filter->setShowInactive(
false);
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
static CAmount GetMaxCollateralAmount()
OverviewPage(const PlatformStyle *platformStyle, QWidget *parent=0)
QLabel * labelSubmittedDenom
void handleTransactionClicked(const QModelIndex &index)
void updateAlerts(const QString &warnings)
static QString floorWithUnit(int unit, const CAmount &amount, bool plussign=false, SeparatorStyle separators=separatorStandard)
Format as string (with unit) but floor value up to "digits" settings.
CMasternodeSync masternodeSync
QPushButton * privateSendInfo
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
QPushButton * privateSendReset
const PlatformStyle * platformStyle
QLabel * labelWalletStatus
QFrame * lineWatchBalance
QString getStatusBarWarnings() const
Return warnings to be displayed in status bar.
void setupUi(QWidget *OverviewPage)
void setBalance(const CAmount &balance, const CAmount &unconfirmedBalance, const CAmount &immatureBalance, const CAmount &anonymizedBalance, const CAmount &watchOnlyBalance, const CAmount &watchUnconfBalance, const CAmount &watchImmatureBalance)
void updateAdvancedPSUI(bool fShowAdvancedPSUI)
static const CAmount COIN
static std::string GetDenominationsToString(int nDenom)
TxViewDelegate(const PlatformStyle *_platformStyle, QObject *parent=nullptr)
static const int PRIVATESEND_KEYS_THRESHOLD_WARNING
void updatePrivateSendProgress()
CAmount currentWatchUnconfBalance
static CAmount GetSmallestDenomination()
void transactionClicked(const QModelIndex &index)
EncryptionStatus getEncryptionStatus() const
QLabel * labelAmountRounds
void showOutOfSyncWarning(bool fShow)
void DisablePrivateSendCompletely()
void handleOutOfSyncWarningClicks()
std::unique_ptr< TransactionFilterProxy > filter
static QString formatWithUnit(int unit, const CAmount &amount, bool plussign=false, SeparatorStyle separators=separatorStandard)
Format as string (with unit)
bool haveWatchOnly() const
CAmount currentAnonymizedBalance
CAmount GetAnonymizableBalance(bool fSkipDenominated=false, bool fSkipUnconfirmed=true) const
TransactionTableModel * getTransactionTableModel()
QLabel * labelSubmittedDenomText
CAmount getWatchImmatureBalance() const
QLabel * labelWatchPending
QLabel * labelTransactionsStatus
static QString floorHtmlWithUnit(int unit, const CAmount &amount, bool plussign=false, SeparatorStyle separators=separatorStandard)
CAmount getAnonymizedBalance() const
QLabel * labelWatchAvailable
static QString formatHtmlWithUnit(int unit, const CAmount &amount, bool plussign=false, SeparatorStyle separators=separatorStandard)
Format as HTML string (with unit)
TxViewDelegate * txdelegate
void setWalletModel(WalletModel *walletModel)
QLabel * labelPrivateSendSyncStatus
static int LogPrint(const char *category, const char *format)
QLabel * labelPrivateSendEnabled
ClientModel * clientModel
QLabel * labelWatchImmature
WalletModel * walletModel
static secp256k1_context * ctx
bool getShowAdvancedPSUI()
float GetAverageAnonymizedRounds() const
CAmount currentUnconfirmedBalance
static qint64 factor(int unit)
Number of Satoshis (1e-8) per unit.
OptionsModel * getOptionsModel()
CAmount getWatchUnconfirmedBalance() const
#define COLOR_UNCONFIRMED
void setClientModel(ClientModel *clientModel)
QPushButton * privateSendAuto
void outOfSyncWarningClicked()
void SetupTransactionList(int nNumItems)
CPrivateSendClient privateSendClient
void setModel(WalletModel *model)
static int decimals(int unit)
Number of decimals left.
QLabel * labelImmatureText
CAmount GetDenominatedBalance(bool unconfirmed=false) const
CAmount currentWatchImmatureBalance
QLabel * labelCompletitionText
bool IsBlockchainSynced()
QLabel * labelUnconfirmed
CAmount currentImmatureBalance
std::unique_ptr< CConnman > g_connman
void updateWatchOnlyLabels(bool showWatchOnly)
CAmount getUnconfirmedBalance() const
CAmount getBalance(const CCoinControl *coinControl=NULL) const
QFrame * framePrivateSend
CAmount getWatchBalance() const
QProgressBar * privateSendProgress
bool DoAutomaticDenominating(CConnman &connman, bool fDryRun=false)
Passively run mixing in the background according to the configuration in settings.
CAmount getImmatureBalance() const
QPushButton * togglePrivateSend
CAmount currentWatchOnlyBalance
int64_t nKeysLeftSinceAutoBackup
bool AutoBackupWallet(CWallet *wallet, std::string strWalletFile, std::string &strBackupWarning, std::string &strBackupError)
QListView * listTransactions
CAmount GetNormalizedAnonymizedBalance() const
UnlockContext requestUnlock(bool fForMixingOnly=false)
QLabel * labelPrivateSendLastMessage
QString dateTimeStr(const QDateTime &date)