123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- // ECOin - Copyright (c) - 2014/2024 - GPLv3 - epsylon@riseup.net (https://03c8.net)
- #include "overviewpage.h"
- #include "ui_overviewpage.h"
- #include "walletmodel.h"
- #include "ecoinunits.h"
- #include "optionsmodel.h"
- #include "transactiontablemodel.h"
- #include "transactionfilterproxy.h"
- #include "guiutil.h"
- #include "guiconstants.h"
- #include <QAbstractItemDelegate>
- #include <QPainter>
- #include <QVariant>
- #include <QDateTime>
- using namespace Qt;
- #define DECORATION_SIZE 64
- #define NUM_ITEMS 3
- class TxViewDelegate : public QAbstractItemDelegate
- {
- Q_OBJECT
- public:
- TxViewDelegate(): QAbstractItemDelegate(), unit(EcoinUnits::ECO)
- {
- }
- inline void paint(QPainter *painter, const QStyleOptionViewItem &option,
- const QModelIndex &index ) const
- {
- painter->save();
- QIcon icon = qvariant_cast<QIcon>(index.data(Qt::DecorationRole));
- QRect mainRect = option.rect;
- QRect decorationRect(mainRect.topLeft(), QSize(DECORATION_SIZE, DECORATION_SIZE));
- int xspace = DECORATION_SIZE + 8;
- int ypad = 6;
- int halfheight = (mainRect.height() - 2*ypad)/2;
- QRect amountRect(mainRect.left() + xspace, mainRect.top()+ypad, mainRect.width() - xspace, halfheight);
- QRect addressRect(mainRect.left() + xspace, mainRect.top()+ypad+halfheight, mainRect.width() - xspace, halfheight);
- icon.paint(painter, decorationRect);
- QDateTime date = index.data(TransactionTableModel::DateRole).toDateTime();
- QString address = index.data(Qt::DisplayRole).toString();
- qint64 amount = index.data(TransactionTableModel::AmountRole).toLongLong();
- bool confirmed = index.data(TransactionTableModel::ConfirmedRole).toBool();
- QVariant value = index.data(Qt::ForegroundRole);
- QColor foreground = option.palette.color(QPalette::Text);
- if (value.canConvert<QColor>())
- {
- foreground = qvariant_cast<QColor>(value);
- }
- painter->setPen(foreground);
- painter->drawText(addressRect, Qt::AlignLeft|Qt::AlignVCenter, address);
- if(amount < 0)
- {
- foreground = COLOR_NEGATIVE;
- }
- else if(!confirmed)
- {
- foreground = COLOR_UNCONFIRMED;
- }
- else
- {
- foreground = option.palette.color(QPalette::Text);
- }
- painter->setPen(foreground);
- QString amountText = EcoinUnits::formatWithUnit(unit, amount, true);
- if(!confirmed)
- {
- amountText = QString("[") + amountText + QString("]");
- }
- painter->drawText(amountRect, Qt::AlignRight|Qt::AlignVCenter, amountText);
- painter->setPen(option.palette.color(QPalette::Text));
- painter->drawText(amountRect, Qt::AlignLeft|Qt::AlignVCenter, GUIUtil::dateTimeStr(date));
- painter->restore();
- }
- inline QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
- {
- return QSize(DECORATION_SIZE, DECORATION_SIZE);
- }
- int unit;
- };
- #include "overviewpage.moc"
- OverviewPage::OverviewPage(QWidget *parent) :
- QWidget(parent),
- ui(new Ui::OverviewPage),
- currentBalance(-1),
- currentStake(0),
- currentUnconfirmedBalance(-1),
- currentImmatureBalance(-1),
- txdelegate(new TxViewDelegate()),
- filter(0)
- {
- ui->setupUi(this);
- // Recent transactions
- ui->listTransactions->setItemDelegate(txdelegate);
- ui->listTransactions->setIconSize(QSize(DECORATION_SIZE, DECORATION_SIZE));
- ui->listTransactions->setMinimumHeight(NUM_ITEMS * (DECORATION_SIZE + 2));
- ui->listTransactions->setAttribute(Qt::WA_MacShowFocusRect, false);
- connect(ui->listTransactions, SIGNAL(clicked(QModelIndex)), this, SLOT(handleTransactionClicked(QModelIndex)));
- // init "out of sync" warning labels
- ui->labelWalletStatus->setText("(" + tr("out of sync") + ")");
- ui->labelTransactionsStatus->setText("(" + tr("out of sync") + ")");
- // start with displaying the "out of sync" warnings
- showOutOfSyncWarning(true);
- }
- void OverviewPage::handleTransactionClicked(const QModelIndex &index)
- {
- if(filter)
- emit transactionClicked(filter->mapToSource(index));
- }
- OverviewPage::~OverviewPage()
- {
- delete ui;
- }
- void OverviewPage::setBalance(qint64 balance, qint64 stake, qint64 unconfirmedBalance, qint64 immatureBalance)
- {
- int unit = model->getOptionsModel()->getDisplayUnit();
- currentBalance = balance;
- currentStake = stake;
- currentUnconfirmedBalance = unconfirmedBalance;
- currentImmatureBalance = immatureBalance;
- ui->labelBalance->setText(EcoinUnits::formatWithUnit(unit, balance));
- ui->labelStake->setText(EcoinUnits::formatWithUnit(unit, stake));
- ui->labelUnconfirmed->setText(EcoinUnits::formatWithUnit(unit, unconfirmedBalance));
- ui->labelImmature->setText(EcoinUnits::formatWithUnit(unit, immatureBalance));
- // only show immature (newly mined) balance if it's non-zero, so as not to complicate things for the non-mining users
- bool showImmature = immatureBalance != 0;
- ui->labelImmature->setVisible(showImmature);
- ui->labelImmatureText->setVisible(showImmature);
- }
- void OverviewPage::setNumTransactions(int count)
- {
- ui->labelNumTransactions->setText(QLocale::system().toString(count));
- }
- void OverviewPage::setModel(WalletModel *model)
- {
- this->model = model;
- if(model && model->getOptionsModel())
- {
- // Set up transaction list
- filter = new TransactionFilterProxy();
- filter->setSourceModel(model->getTransactionTableModel());
- filter->setLimit(NUM_ITEMS);
- filter->setDynamicSortFilter(true);
- filter->setSortRole(Qt::EditRole);
- filter->sort(TransactionTableModel::Status, Qt::DescendingOrder);
- ui->listTransactions->setModel(filter);
- ui->listTransactions->setModelColumn(TransactionTableModel::ToAddress);
- // Keep up to date with wallet
- setBalance(model->getBalance(), model->getStake(), model->getUnconfirmedBalance(), model->getImmatureBalance());
- connect(model, SIGNAL(balanceChanged(qint64, qint64, qint64, qint64)), this, SLOT(setBalance(qint64, qint64, qint64, qint64)));
- setNumTransactions(model->getNumTransactions());
- connect(model, SIGNAL(numTransactionsChanged(int)), this, SLOT(setNumTransactions(int)));
- connect(model->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(updateDisplayUnit()));
- }
- // update the display unit, to not use the default ("ECO")
- updateDisplayUnit();
- }
- void OverviewPage::updateDisplayUnit()
- {
- if(model && model->getOptionsModel())
- {
- if(currentBalance != -1)
- setBalance(currentBalance, model->getStake(), currentUnconfirmedBalance, currentImmatureBalance);
- // Update txdelegate->unit with the current unit
- txdelegate->unit = model->getOptionsModel()->getDisplayUnit();
- ui->listTransactions->update();
- }
- }
- void OverviewPage::showOutOfSyncWarning(bool fShow)
- {
- ui->labelWalletStatus->setVisible(fShow);
- ui->labelTransactionsStatus->setVisible(fShow);
- }
|