overviewpage.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. // ECOin - Copyright (c) - 2014/2024 - GPLv3 - epsylon@riseup.net (https://03c8.net)
  2. #include "overviewpage.h"
  3. #include "ui_overviewpage.h"
  4. #include "walletmodel.h"
  5. #include "ecoinunits.h"
  6. #include "optionsmodel.h"
  7. #include "transactiontablemodel.h"
  8. #include "transactionfilterproxy.h"
  9. #include "guiutil.h"
  10. #include "guiconstants.h"
  11. #include <QAbstractItemDelegate>
  12. #include <QPainter>
  13. #include <QVariant>
  14. #include <QDateTime>
  15. using namespace Qt;
  16. #define DECORATION_SIZE 64
  17. #define NUM_ITEMS 3
  18. class TxViewDelegate : public QAbstractItemDelegate
  19. {
  20. Q_OBJECT
  21. public:
  22. TxViewDelegate(): QAbstractItemDelegate(), unit(EcoinUnits::ECO)
  23. {
  24. }
  25. inline void paint(QPainter *painter, const QStyleOptionViewItem &option,
  26. const QModelIndex &index ) const
  27. {
  28. painter->save();
  29. QIcon icon = qvariant_cast<QIcon>(index.data(Qt::DecorationRole));
  30. QRect mainRect = option.rect;
  31. QRect decorationRect(mainRect.topLeft(), QSize(DECORATION_SIZE, DECORATION_SIZE));
  32. int xspace = DECORATION_SIZE + 8;
  33. int ypad = 6;
  34. int halfheight = (mainRect.height() - 2*ypad)/2;
  35. QRect amountRect(mainRect.left() + xspace, mainRect.top()+ypad, mainRect.width() - xspace, halfheight);
  36. QRect addressRect(mainRect.left() + xspace, mainRect.top()+ypad+halfheight, mainRect.width() - xspace, halfheight);
  37. icon.paint(painter, decorationRect);
  38. QDateTime date = index.data(TransactionTableModel::DateRole).toDateTime();
  39. QString address = index.data(Qt::DisplayRole).toString();
  40. qint64 amount = index.data(TransactionTableModel::AmountRole).toLongLong();
  41. bool confirmed = index.data(TransactionTableModel::ConfirmedRole).toBool();
  42. QVariant value = index.data(Qt::ForegroundRole);
  43. QColor foreground = option.palette.color(QPalette::Text);
  44. if (value.canConvert<QColor>())
  45. {
  46. foreground = qvariant_cast<QColor>(value);
  47. }
  48. painter->setPen(foreground);
  49. painter->drawText(addressRect, Qt::AlignLeft|Qt::AlignVCenter, address);
  50. if(amount < 0)
  51. {
  52. foreground = COLOR_NEGATIVE;
  53. }
  54. else if(!confirmed)
  55. {
  56. foreground = COLOR_UNCONFIRMED;
  57. }
  58. else
  59. {
  60. foreground = option.palette.color(QPalette::Text);
  61. }
  62. painter->setPen(foreground);
  63. QString amountText = EcoinUnits::formatWithUnit(unit, amount, true);
  64. if(!confirmed)
  65. {
  66. amountText = QString("[") + amountText + QString("]");
  67. }
  68. painter->drawText(amountRect, Qt::AlignRight|Qt::AlignVCenter, amountText);
  69. painter->setPen(option.palette.color(QPalette::Text));
  70. painter->drawText(amountRect, Qt::AlignLeft|Qt::AlignVCenter, GUIUtil::dateTimeStr(date));
  71. painter->restore();
  72. }
  73. inline QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
  74. {
  75. return QSize(DECORATION_SIZE, DECORATION_SIZE);
  76. }
  77. int unit;
  78. };
  79. #include "overviewpage.moc"
  80. OverviewPage::OverviewPage(QWidget *parent) :
  81. QWidget(parent),
  82. ui(new Ui::OverviewPage),
  83. currentBalance(-1),
  84. currentStake(0),
  85. currentUnconfirmedBalance(-1),
  86. currentImmatureBalance(-1),
  87. txdelegate(new TxViewDelegate()),
  88. filter(0)
  89. {
  90. ui->setupUi(this);
  91. // Recent transactions
  92. ui->listTransactions->setItemDelegate(txdelegate);
  93. ui->listTransactions->setIconSize(QSize(DECORATION_SIZE, DECORATION_SIZE));
  94. ui->listTransactions->setMinimumHeight(NUM_ITEMS * (DECORATION_SIZE + 2));
  95. ui->listTransactions->setAttribute(Qt::WA_MacShowFocusRect, false);
  96. connect(ui->listTransactions, SIGNAL(clicked(QModelIndex)), this, SLOT(handleTransactionClicked(QModelIndex)));
  97. // init "out of sync" warning labels
  98. ui->labelWalletStatus->setText("(" + tr("out of sync") + ")");
  99. ui->labelTransactionsStatus->setText("(" + tr("out of sync") + ")");
  100. // start with displaying the "out of sync" warnings
  101. showOutOfSyncWarning(true);
  102. }
  103. void OverviewPage::handleTransactionClicked(const QModelIndex &index)
  104. {
  105. if(filter)
  106. emit transactionClicked(filter->mapToSource(index));
  107. }
  108. OverviewPage::~OverviewPage()
  109. {
  110. delete ui;
  111. }
  112. void OverviewPage::setBalance(qint64 balance, qint64 stake, qint64 unconfirmedBalance, qint64 immatureBalance)
  113. {
  114. int unit = model->getOptionsModel()->getDisplayUnit();
  115. currentBalance = balance;
  116. currentStake = stake;
  117. currentUnconfirmedBalance = unconfirmedBalance;
  118. currentImmatureBalance = immatureBalance;
  119. ui->labelBalance->setText(EcoinUnits::formatWithUnit(unit, balance));
  120. ui->labelStake->setText(EcoinUnits::formatWithUnit(unit, stake));
  121. ui->labelUnconfirmed->setText(EcoinUnits::formatWithUnit(unit, unconfirmedBalance));
  122. ui->labelImmature->setText(EcoinUnits::formatWithUnit(unit, immatureBalance));
  123. // only show immature (newly mined) balance if it's non-zero, so as not to complicate things for the non-mining users
  124. bool showImmature = immatureBalance != 0;
  125. ui->labelImmature->setVisible(showImmature);
  126. ui->labelImmatureText->setVisible(showImmature);
  127. }
  128. void OverviewPage::setNumTransactions(int count)
  129. {
  130. ui->labelNumTransactions->setText(QLocale::system().toString(count));
  131. }
  132. void OverviewPage::setModel(WalletModel *model)
  133. {
  134. this->model = model;
  135. if(model && model->getOptionsModel())
  136. {
  137. // Set up transaction list
  138. filter = new TransactionFilterProxy();
  139. filter->setSourceModel(model->getTransactionTableModel());
  140. filter->setLimit(NUM_ITEMS);
  141. filter->setDynamicSortFilter(true);
  142. filter->setSortRole(Qt::EditRole);
  143. filter->sort(TransactionTableModel::Status, Qt::DescendingOrder);
  144. ui->listTransactions->setModel(filter);
  145. ui->listTransactions->setModelColumn(TransactionTableModel::ToAddress);
  146. // Keep up to date with wallet
  147. setBalance(model->getBalance(), model->getStake(), model->getUnconfirmedBalance(), model->getImmatureBalance());
  148. connect(model, SIGNAL(balanceChanged(qint64, qint64, qint64, qint64)), this, SLOT(setBalance(qint64, qint64, qint64, qint64)));
  149. setNumTransactions(model->getNumTransactions());
  150. connect(model, SIGNAL(numTransactionsChanged(int)), this, SLOT(setNumTransactions(int)));
  151. connect(model->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(updateDisplayUnit()));
  152. }
  153. // update the display unit, to not use the default ("ECO")
  154. updateDisplayUnit();
  155. }
  156. void OverviewPage::updateDisplayUnit()
  157. {
  158. if(model && model->getOptionsModel())
  159. {
  160. if(currentBalance != -1)
  161. setBalance(currentBalance, model->getStake(), currentUnconfirmedBalance, currentImmatureBalance);
  162. // Update txdelegate->unit with the current unit
  163. txdelegate->unit = model->getOptionsModel()->getDisplayUnit();
  164. ui->listTransactions->update();
  165. }
  166. }
  167. void OverviewPage::showOutOfSyncWarning(bool fShow)
  168. {
  169. ui->labelWalletStatus->setVisible(fShow);
  170. ui->labelTransactionsStatus->setVisible(fShow);
  171. }