show last few transactions on overview page
authorWladimir J. van der Laan <laanwj@gmail.com>
Wed, 3 Aug 2011 18:52:18 +0000 (20:52 +0200)
committerWladimir J. van der Laan <laanwj@gmail.com>
Wed, 3 Aug 2011 18:52:18 +0000 (20:52 +0200)
13 files changed:
src/qt/forms/overviewpage.ui
src/qt/guiutil.cpp
src/qt/guiutil.h
src/qt/overviewpage.cpp
src/qt/overviewpage.h
src/qt/res/icons/tx_inout.png
src/qt/res/icons/tx_input.png
src/qt/res/icons/tx_mined.png
src/qt/res/icons/tx_output.png
src/qt/transactionfilterproxy.cpp
src/qt/transactionfilterproxy.h
src/qt/transactiontablemodel.cpp
src/qt/transactiontablemodel.h

index d8362a7..cc67fae 100644 (file)
   <property name="windowTitle">
    <string>Form</string>
   </property>
-  <layout class="QVBoxLayout" name="verticalLayout_2">
+  <layout class="QHBoxLayout" name="horizontalLayout" stretch="1,1">
    <item>
-    <widget class="QFrame" name="frame">
-     <property name="frameShape">
-      <enum>QFrame::StyledPanel</enum>
-     </property>
-     <property name="frameShadow">
-      <enum>QFrame::Raised</enum>
-     </property>
-     <layout class="QFormLayout" name="formLayout_2">
-      <property name="fieldGrowthPolicy">
-       <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
-      </property>
-      <property name="horizontalSpacing">
-       <number>12</number>
-      </property>
-      <property name="verticalSpacing">
-       <number>12</number>
-      </property>
-      <item row="0" column="0">
-       <widget class="QLabel" name="label">
-        <property name="text">
-         <string>Balance:</string>
+    <layout class="QVBoxLayout" name="verticalLayout_2">
+     <item>
+      <widget class="QFrame" name="frame">
+       <property name="frameShape">
+        <enum>QFrame::StyledPanel</enum>
+       </property>
+       <property name="frameShadow">
+        <enum>QFrame::Raised</enum>
+       </property>
+       <layout class="QFormLayout" name="formLayout_2">
+        <property name="fieldGrowthPolicy">
+         <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
         </property>
-       </widget>
-      </item>
-      <item row="0" column="1">
-       <widget class="QLabel" name="labelBalance">
-        <property name="text">
-         <string>123.456 BTC</string>
+        <property name="horizontalSpacing">
+         <number>12</number>
         </property>
-       </widget>
-      </item>
-      <item row="2" column="0">
-       <widget class="QLabel" name="label_2">
-        <property name="text">
-         <string>Number of transactions:</string>
+        <property name="verticalSpacing">
+         <number>12</number>
         </property>
-       </widget>
-      </item>
-      <item row="2" column="1">
-       <widget class="QLabel" name="labelNumTransactions">
-        <property name="text">
-         <string>0</string>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="0">
-       <widget class="QLabel" name="label_3">
-        <property name="text">
-         <string>Unconfirmed:</string>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="1">
-       <widget class="QLabel" name="labelUnconfirmed">
-        <property name="text">
-         <string>0 BTC</string>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
+        <item row="2" column="0">
+         <widget class="QLabel" name="label">
+          <property name="text">
+           <string>Balance:</string>
+          </property>
+         </widget>
+        </item>
+        <item row="2" column="1">
+         <widget class="QLabel" name="labelBalance">
+          <property name="text">
+           <string>123.456 BTC</string>
+          </property>
+         </widget>
+        </item>
+        <item row="4" column="0">
+         <widget class="QLabel" name="label_2">
+          <property name="text">
+           <string>Number of transactions:</string>
+          </property>
+         </widget>
+        </item>
+        <item row="4" column="1">
+         <widget class="QLabel" name="labelNumTransactions">
+          <property name="text">
+           <string>0</string>
+          </property>
+         </widget>
+        </item>
+        <item row="3" column="0">
+         <widget class="QLabel" name="label_3">
+          <property name="text">
+           <string>Unconfirmed:</string>
+          </property>
+         </widget>
+        </item>
+        <item row="3" column="1">
+         <widget class="QLabel" name="labelUnconfirmed">
+          <property name="text">
+           <string>0 BTC</string>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="0">
+         <widget class="QLabel" name="label_5">
+          <property name="text">
+           <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Wallet&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+     </item>
+     <item>
+      <spacer name="verticalSpacer">
+       <property name="orientation">
+        <enum>Qt::Vertical</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>20</width>
+         <height>40</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+    </layout>
    </item>
    <item>
-    <spacer name="verticalSpacer">
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>20</width>
-       <height>40</height>
-      </size>
-     </property>
-    </spacer>
+    <layout class="QVBoxLayout" name="verticalLayout_3">
+     <item>
+      <widget class="QFrame" name="frame_2">
+       <property name="frameShape">
+        <enum>QFrame::StyledPanel</enum>
+       </property>
+       <property name="frameShadow">
+        <enum>QFrame::Raised</enum>
+       </property>
+       <layout class="QVBoxLayout" name="verticalLayout">
+        <item>
+         <widget class="QLabel" name="label_4">
+          <property name="text">
+           <string>&lt;b&gt;Recent transactions&lt;/b&gt;</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QListView" name="listTransactions">
+          <property name="frameShape">
+           <enum>QFrame::NoFrame</enum>
+          </property>
+          <property name="verticalScrollBarPolicy">
+           <enum>Qt::ScrollBarAlwaysOff</enum>
+          </property>
+          <property name="horizontalScrollBarPolicy">
+           <enum>Qt::ScrollBarAlwaysOff</enum>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+     </item>
+     <item>
+      <spacer name="verticalSpacer_2">
+       <property name="orientation">
+        <enum>Qt::Vertical</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>20</width>
+         <height>40</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+    </layout>
    </item>
   </layout>
  </widget>
index 308a6ba..ece0690 100644 (file)
 
 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");
 }
 
index 26a1a03..fb5c575 100644 (file)
@@ -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();
index c04bbf6..f79e1f3 100644 (file)
@@ -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 <QDebug>
+#include <QItemDelegate>
+#include <QPainter>
+
+#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<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(qVariantCanConvert<QColor>(value))
+        {
+            foreground = qvariant_cast<QColor>(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();
 }
index c54dda3..2abddf1 100644 (file)
@@ -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();
 };
index ff6bb1c..5f092f9 100644 (file)
Binary files a/src/qt/res/icons/tx_inout.png and b/src/qt/res/icons/tx_inout.png differ
index 1673d06..0f5fea3 100644 (file)
Binary files a/src/qt/res/icons/tx_input.png and b/src/qt/res/icons/tx_input.png differ
index a336868..613f30f 100644 (file)
Binary files a/src/qt/res/icons/tx_mined.png and b/src/qt/res/icons/tx_mined.png differ
index 0617239..9ae39fb 100644 (file)
Binary files a/src/qt/res/icons/tx_output.png and b/src/qt/res/icons/tx_output.png differ
index cd1194d..5a66f85 100644 (file)
@@ -15,7 +15,8 @@ TransactionFilterProxy::TransactionFilterProxy(QObject *parent) :
     dateTo(MAX_DATE),
     addrPrefix(),
     typeFilter(ALL_TYPES),
-    minAmount(0)
+    minAmount(0),
+    limitRows(-1)
 {
 }
 
@@ -65,3 +66,20 @@ void TransactionFilterProxy::setMinAmount(qint64 minimum)
     this->minAmount = 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);
+    }
+}
index a44c9c4..4dd2a8e 100644 (file)
@@ -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:
 
index 1606df9..458341c 100644 (file)
@@ -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());
index 71b0644..0daa5f6 100644 (file)
@@ -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?