From a99ac8d3f483d8a839ea3c4e0f400eaa64338acd Mon Sep 17 00:00:00 2001 From: "Wladimir J. van der Laan" Date: Wed, 3 Aug 2011 20:52:18 +0200 Subject: [PATCH] show last few transactions on overview page --- src/qt/forms/overviewpage.ui | 204 ++++++++++++++++++++---------- src/qt/guiutil.cpp | 6 +- src/qt/guiutil.h | 2 + src/qt/overviewpage.cpp | 98 +++++++++++++- src/qt/overviewpage.h | 3 + src/qt/res/icons/tx_inout.png | Bin 631 -> 2442 bytes src/qt/res/icons/tx_input.png | Bin 594 -> 2152 bytes src/qt/res/icons/tx_mined.png | Bin 754 -> 3287 bytes src/qt/res/icons/tx_output.png | Bin 593 -> 2129 bytes src/qt/transactionfilterproxy.cpp | 20 ++- src/qt/transactionfilterproxy.h | 5 + src/qt/transactiontablemodel.cpp | 4 + src/qt/transactiontablemodel.h | 2 + 13 files changed, 268 insertions(+), 76 deletions(-) diff --git a/src/qt/forms/overviewpage.ui b/src/qt/forms/overviewpage.ui index d8362a7b..cc67fae5 100644 --- a/src/qt/forms/overviewpage.ui +++ b/src/qt/forms/overviewpage.ui @@ -13,82 +13,146 @@ Form - + - - - QFrame::StyledPanel - - - QFrame::Raised - - - - QFormLayout::AllNonFixedFieldsGrow - - - 12 - - - 12 - - - - - Balance: + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + QFormLayout::AllNonFixedFieldsGrow - - - - - - 123.456 BTC + + 12 - - - - - - Number of transactions: + + 12 - - - - - - 0 - - - - - - - Unconfirmed: - - - - - - - 0 BTC - - - - - + + + + Balance: + + + + + + + 123.456 BTC + + + + + + + Number of transactions: + + + + + + + 0 + + + + + + + Unconfirmed: + + + + + + + 0 BTC + + + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Wallet</span></p></body></html> + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + - - - Qt::Vertical - - - - 20 - 40 - - - + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + <b>Recent transactions</b> + + + + + + + QFrame::NoFrame + + + Qt::ScrollBarAlwaysOff + + + Qt::ScrollBarAlwaysOff + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp index 308a6ba9..ece06907 100644 --- a/src/qt/guiutil.cpp +++ b/src/qt/guiutil.cpp @@ -11,7 +11,11 @@ QString GUIUtil::DateTimeStr(qint64 nTime) { - QDateTime date = QDateTime::fromTime_t((qint32)nTime); + return DateTimeStr(QDateTime::fromTime_t((qint32)nTime)); +} + +QString GUIUtil::DateTimeStr(const QDateTime &date) +{ return date.date().toString(Qt::SystemLocaleShortDate) + QString(" ") + date.toString("hh:mm"); } diff --git a/src/qt/guiutil.h b/src/qt/guiutil.h index 26a1a037..fb5c575a 100644 --- a/src/qt/guiutil.h +++ b/src/qt/guiutil.h @@ -7,12 +7,14 @@ QT_BEGIN_NAMESPACE class QFont; class QLineEdit; class QWidget; +class QDateTime; QT_END_NAMESPACE class GUIUtil { public: static QString DateTimeStr(qint64 nTime); + static QString DateTimeStr(const QDateTime &datetime); // Render bitcoin addresses in monospace font static QFont bitcoinAddressFont(); diff --git a/src/qt/overviewpage.cpp b/src/qt/overviewpage.cpp index c04bbf60..f79e1f3e 100644 --- a/src/qt/overviewpage.cpp +++ b/src/qt/overviewpage.cpp @@ -4,14 +4,87 @@ #include "walletmodel.h" #include "bitcoinunits.h" #include "optionsmodel.h" +#include "transactiontablemodel.h" +#include "transactionfilterproxy.h" +#include "guiutil.h" +#include "guiconstants.h" #include +#include +#include + +#define DECORATION_SIZE 64 +class TxViewDelegate : public QItemDelegate +{ + //Q_OBJECT +public: + TxViewDelegate(): QItemDelegate(), unit(BitcoinUnits::BTC) + { + + } + + inline void paint(QPainter *painter, const QStyleOptionViewItem &option, + const QModelIndex &index ) const + { + //QItemDelegate::paint(painter, option, index); + painter->save(); + + QIcon icon = qvariant_cast(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(qVariantCanConvert(value)) + { + foreground = qvariant_cast(value); + } + + painter->setPen(foreground); + painter->drawText(addressRect, Qt::AlignLeft|Qt::AlignVCenter, address); + + if(amount < 0) + { + foreground = COLOR_NEGATIVE; + } + else + { + foreground = option.palette.color(QPalette::Text); + } + painter->setPen(foreground); + QString amountText = BitcoinUnits::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(); + } + + int unit; + +}; OverviewPage::OverviewPage(QWidget *parent) : QWidget(parent), ui(new Ui::OverviewPage), currentBalance(-1), - currentUnconfirmedBalance(-1) + currentUnconfirmedBalance(-1), + txdelegate(new TxViewDelegate()) { ui->setupUi(this); @@ -27,9 +100,11 @@ OverviewPage::OverviewPage(QWidget *parent) : ui->labelNumTransactions->setToolTip(tr("Total number of transactions in wallet")); - // Overview page should show: - // Last received transaction(s) - // Last sent transaction(s) + // Recent transactions + ui->listTransactions->setStyleSheet("background:transparent"); + ui->listTransactions->setItemDelegate(txdelegate); + ui->listTransactions->setIconSize(QSize(DECORATION_SIZE, DECORATION_SIZE)); + ui->listTransactions->setSelectionMode(QAbstractItemView::NoSelection); } OverviewPage::~OverviewPage() @@ -55,6 +130,18 @@ void OverviewPage::setModel(WalletModel *model) { this->model = model; + // Set up transaction list + + TransactionFilterProxy *filter = new TransactionFilterProxy(); + filter->setSourceModel(model->getTransactionTableModel()); + filter->setLimit(3); + 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->getUnconfirmedBalance()); connect(model, SIGNAL(balanceChanged(qint64, qint64)), this, SLOT(setBalance(qint64, qint64))); @@ -69,4 +156,7 @@ void OverviewPage::displayUnitChanged() { if(currentBalance != -1) setBalance(currentBalance, currentUnconfirmedBalance); + + txdelegate->unit = model->getOptionsModel()->getDisplayUnit(); + ui->listTransactions->update(); } diff --git a/src/qt/overviewpage.h b/src/qt/overviewpage.h index c54dda32..2abddf16 100644 --- a/src/qt/overviewpage.h +++ b/src/qt/overviewpage.h @@ -7,6 +7,7 @@ namespace Ui { class OverviewPage; } class WalletModel; +class TxViewDelegate; class OverviewPage : public QWidget { @@ -28,6 +29,8 @@ private: qint64 currentBalance; qint64 currentUnconfirmedBalance; + TxViewDelegate *txdelegate; + private slots: void displayUnitChanged(); }; diff --git a/src/qt/res/icons/tx_inout.png b/src/qt/res/icons/tx_inout.png index ff6bb1c5c3ed6049f5cbde02b95d53e7e4739a2f..5f092f97aa3db749e5e7f490158a489e16cbf4cd 100644 GIT binary patch delta 2408 zcmV-u377Ww1d0FdS2i4#krI z$;jMwh4UvwP?AF(?cI$?5W=j&A7~uy_o{IiB$|jyL)+bs4M7M5A}AXh=TM`YGGv62 zT{%z2?XLYkAOC23>$=|cdu_MQY_FubZ@+FsX?6h3=A;14 z4xrhb6rkAwG@FwGG&_K1bHWQSr(OriWO5;}%owvwRnHcYcA#BV+Y8sNz!)&5s$(KD z28@ZwzpS;d0>s~J+*8!Iv^`Jx!0#93Ohg5Ya7!1C7)XJJc07)j3 z*BWDP2Re^d03O*63|VV81%tt@K*J_5M+mTG%NGCStcM98 zB44Q2;jzRR^Od@Nlw6CdUSF@nV~MIZPJm=Gxm-jR)$6c~{{p+n_u_8>ZiD@wKR7se zNj(mxIzgY$_n8`($0mU1fGr}jTUGa2YxlXX`%ZUv_jqZ>NF-t|y6B<~zu&)5RTlzh z0!vkY^=fMDdtBGO6d10>7D@zA)yrpL_m-+|7LmuZ+3fGTySv}>VpJIJzFqiiFHIX7 z8ag|d%Uumz4O|6$z+)^QnMK@3P!vFbPkPAzzP0w#!C-JZ4IGRBY}>Z&t^ND=|7~Dk z;2}WL>GTc2FRR&=HrsGGe7~xu9LIUdYqFH@H_}}EkR#go^e}DgZK);AQ-P_x{(reiUKtz^!%)ia6W3Q}TyY?(&%nRhJ z{vyBM|9OBwATSE-u4XSH2EcXQyUEw+Q&cq_3WdJrrTn4*r+bX|6_5Em(bw0vG?&YN zy`-w8KR|!U_10=WRP{fhQ0RQ%#**7U5qT&S3f*1J-T+u@JqaKp4XXjS-FDjwYwh#o z-vp&)EbHs*>jY5M8OsxqgQ|M3wKgXrnF{IO4~N4)jzl8UF8p||0U~m6{`~oWt(MOV zp-`yD7_$jDwNkq4x)%cYe7>1#z__Y^emfWp{xcqr@3Gc)0S7DO`(`GSc{CD<%&p|4 zs7zG>RCQlxXJ@WjzG{TS;X6g-r+}|Q@;LA%$8k0kzHb$gyMXTk_p0jsz9ur>c+%&8^99zgUq9}-4$-#e z{rznwkx2M}Q>s~r$au9p<&2DsTqz>Q>lFJc*LAy0cXzi-q3z9ts(KkJABN*NPa0#c zr}FEmsfft!u~_Uk#U^mXAff^_t^YspzyoPjy#^Sq#r|lZs^Mrf`Xe}hG!CdLfU2HR zYk`jAJa4VNg8ZULCHAQ571r8Cxm<4HWkAohKPL2aU7?3V@~1WG9ohLLx@NR`Dt@aGr@s@fj_TV zvu3%^=X(NJT$X%}h-?&pksAgE1~%8?zesOy?@vUe($rpoTcgqFgQYi%Lt!sXpe2<` zwbv6|JRaZUy6&fdKUPRy01So0;d?8M-3JE;Pa7N@Jd^y7P?2yre5a~@qe7BZ)mvh* z*n{N>b09B(m*p^H%o)H))r>O`kH<%PdU~#GZEZ~e*Ony%;6ANo(D)I674_|IEO>Od>e2v&;_go{NZr;qpJFIj;tN7h};;BMyFj_ znoSeHTHA=7U;x&Cty`CK9Oq`>2W3fbwzs!G2hh^eatmRcZwo)z%2^*%8%q49WpkBI!Cz8H(e z9<63yYy!Ky1l*`5P>$m`(ZVK2Rz!X^6`V00)ok0^+AM&7wYF$C33NxJ(Z{@$Z2+>_ z>}y^!t7^3gQ_VPz^J{DE@@Ow$_GQT3Se_)9(U%$?qKP6_LFn@?K%lwZj*u&uhyw-rD^9u@}i;F{RRi*U0!MstggQ+2Zr|Y^q>vh%yo~qZulmNyUPj7eNh=f$NeD2;Xo)MAgjvYH5Z{)GsY9~b{olajVBCAz(CHYy|u|k2Z zs=5(>NUmPJx*^+g<;?1=@WzcBmjItDh;bPWIBZ?U81RCK42sC6RjXD_w}jR(W_?(? zNFtG#>-YN?yRN$gSW-A+uo!3uPNVYPALP#zjRGU8`WF#-)fh8utsM>o0k&^;6JAh_$Qh;U$&}>e4 a0saT)@WAbj8CBx|0000w z00Gzm`dp@Rkwzzf0rW{kK~y-6rBgeLQ&AB9zGF;uU3Eo#1QwQUQiN3tOA94FAWd>2 zCW_i_{LV4X7b3Bnq z%vftv*4mT#d_LLfbS_9*41K10z22E}xqR$b0FsA8`9m(3dy>s&zeYyKajp!9!{tt= z^9sO<1CwWlMn>$;1QZUT5O=`#S3lq8az2QUrb zd`!~r5c53(mrA8A$z<|K_}ob{@&QR;WBdsK3o!uE2kwuY>h<~$k{2Dv`6THofD@Ta zW?s^4yWM_C@*&CVwOZ}gcz^@r7Isi)M~Xm06@?4E(5q1 z;syYolYABg!MAXX3nY&M*a6^6x7*!YtyY65QOp?gCJ2Hx08;>x0IVb%_8RpZ(fx5S z5N=|l(U^|M<7XwE1CSy)Cutjij{x3DdJJHxP$;~{?9oqqrT002ovPDHLkV1g4|{sRC2 diff --git a/src/qt/res/icons/tx_input.png b/src/qt/res/icons/tx_input.png index 1673d06ad33a333b0a7c6652a30c4e420e933dc2..0f5fea3a8456c73a27c2f0f3d01b3bc96aee389d 100644 GIT binary patch delta 2116 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 diff --git a/src/qt/res/icons/tx_mined.png b/src/qt/res/icons/tx_mined.png index a336868e8a89b553996f84ad63fba5aba551db06..613f30fecc041468d7ff766236dc509d815f7aab 100644 GIT binary patch delta 3260 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 u$K&x1yUy|%``zIGDqitFoqfeS;Jw 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 = minimum; invalidateFilter(); } + +void TransactionFilterProxy::setLimit(int limit) +{ + this->limitRows = limit; +} + +int TransactionFilterProxy::rowCount(const QModelIndex &parent) const +{ + if(limitRows != -1) + { + return std::min(QSortFilterProxyModel::rowCount(parent), limitRows); + } + else + { + return QSortFilterProxyModel::rowCount(parent); + } +} diff --git a/src/qt/transactionfilterproxy.h b/src/qt/transactionfilterproxy.h index a44c9c4d..4dd2a8e5 100644 --- a/src/qt/transactionfilterproxy.h +++ b/src/qt/transactionfilterproxy.h @@ -26,6 +26,10 @@ public: void setTypeFilter(quint32 modes); void setMinAmount(qint64 minimum); + // Set maximum number of rows returned, -1 if unlimited + void setLimit(int limit); + + int rowCount(const QModelIndex &parent = QModelIndex()) const; protected: bool filterAcceptsRow(int source_row, const QModelIndex & source_parent) const; @@ -35,6 +39,7 @@ private: QString addrPrefix; quint32 typeFilter; qint64 minAmount; + int limitRows; signals: diff --git a/src/qt/transactiontablemodel.cpp b/src/qt/transactiontablemodel.cpp index 1606df9f..458341c0 100644 --- a/src/qt/transactiontablemodel.cpp +++ b/src/qt/transactiontablemodel.cpp @@ -578,6 +578,10 @@ QVariant TransactionTableModel::data(const QModelIndex &index, int role) const { return llabs(rec->credit + rec->debit); } + else if (role == AmountRole) + { + return rec->credit + rec->debit; + } else if (role == TxIDRole) { return QString::fromStdString(rec->getTxID()); diff --git a/src/qt/transactiontablemodel.h b/src/qt/transactiontablemodel.h index 71b06441..0daa5f6a 100644 --- a/src/qt/transactiontablemodel.h +++ b/src/qt/transactiontablemodel.h @@ -39,6 +39,8 @@ public: LabelRole, // Absolute net amount of transaction, for filtering AbsoluteAmountRole, + // Net amount of transaction + AmountRole, // Unique identifier TxIDRole, // Is transaction confirmed?