Browse Source

show last few transactions on overview page

pull/1/head
Wladimir J. van der Laan 11 years ago
parent
commit
a99ac8d3f4
  1. 204
      src/qt/forms/overviewpage.ui
  2. 6
      src/qt/guiutil.cpp
  3. 2
      src/qt/guiutil.h
  4. 98
      src/qt/overviewpage.cpp
  5. 3
      src/qt/overviewpage.h
  6. BIN
      src/qt/res/icons/tx_inout.png
  7. BIN
      src/qt/res/icons/tx_input.png
  8. BIN
      src/qt/res/icons/tx_mined.png
  9. BIN
      src/qt/res/icons/tx_output.png
  10. 20
      src/qt/transactionfilterproxy.cpp
  11. 5
      src/qt/transactionfilterproxy.h
  12. 4
      src/qt/transactiontablemodel.cpp
  13. 2
      src/qt/transactiontablemodel.h

204
src/qt/forms/overviewpage.ui

@ -13,82 +13,146 @@ @@ -13,82 +13,146 @@
<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>

6
src/qt/guiutil.cpp

@ -11,7 +11,11 @@ @@ -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");
}

2
src/qt/guiutil.h

@ -7,12 +7,14 @@ QT_BEGIN_NAMESPACE @@ -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();

98
src/qt/overviewpage.cpp

@ -4,14 +4,87 @@ @@ -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) : @@ -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) @@ -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() @@ -69,4 +156,7 @@ void OverviewPage::displayUnitChanged()
{
if(currentBalance != -1)
setBalance(currentBalance, currentUnconfirmedBalance);
txdelegate->unit = model->getOptionsModel()->getDisplayUnit();
ui->listTransactions->update();
}

3
src/qt/overviewpage.h

@ -7,6 +7,7 @@ namespace Ui { @@ -7,6 +7,7 @@ namespace Ui {
class OverviewPage;
}
class WalletModel;
class TxViewDelegate;
class OverviewPage : public QWidget
{
@ -28,6 +29,8 @@ private: @@ -28,6 +29,8 @@ private:
qint64 currentBalance;
qint64 currentUnconfirmedBalance;
TxViewDelegate *txdelegate;
private slots:
void displayUnitChanged();
};

BIN
src/qt/res/icons/tx_inout.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 631 B

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
src/qt/res/icons/tx_input.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 594 B

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
src/qt/res/icons/tx_mined.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 754 B

After

Width:  |  Height:  |  Size: 3.2 KiB

BIN
src/qt/res/icons/tx_output.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 593 B

After

Width:  |  Height:  |  Size: 2.1 KiB

20
src/qt/transactionfilterproxy.cpp

@ -15,7 +15,8 @@ TransactionFilterProxy::TransactionFilterProxy(QObject *parent) : @@ -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) @@ -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);
}
}

5
src/qt/transactionfilterproxy.h

@ -26,6 +26,10 @@ public: @@ -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: @@ -35,6 +39,7 @@ private:
QString addrPrefix;
quint32 typeFilter;
qint64 minAmount;
int limitRows;
signals:

4
src/qt/transactiontablemodel.cpp

@ -578,6 +578,10 @@ QVariant TransactionTableModel::data(const QModelIndex &index, int role) const @@ -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());

2
src/qt/transactiontablemodel.h

@ -39,6 +39,8 @@ public: @@ -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?

Loading…
Cancel
Save