aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/qt/forms/overviewpage.ui204
-rw-r--r--src/qt/guiutil.cpp6
-rw-r--r--src/qt/guiutil.h2
-rw-r--r--src/qt/overviewpage.cpp98
-rw-r--r--src/qt/overviewpage.h3
-rw-r--r--src/qt/res/icons/tx_inout.pngbin631 -> 2442 bytes
-rw-r--r--src/qt/res/icons/tx_input.pngbin594 -> 2152 bytes
-rw-r--r--src/qt/res/icons/tx_mined.pngbin754 -> 3287 bytes
-rw-r--r--src/qt/res/icons/tx_output.pngbin593 -> 2129 bytes
-rw-r--r--src/qt/transactionfilterproxy.cpp20
-rw-r--r--src/qt/transactionfilterproxy.h5
-rw-r--r--src/qt/transactiontablemodel.cpp4
-rw-r--r--src/qt/transactiontablemodel.h2
13 files changed, 268 insertions, 76 deletions
diff --git a/src/qt/forms/overviewpage.ui b/src/qt/forms/overviewpage.ui
index d8362a7b25..cc67fae533 100644
--- a/src/qt/forms/overviewpage.ui
+++ b/src/qt/forms/overviewpage.ui
@@ -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>
diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp
index 308a6ba9bc..ece069072f 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 26a1a03712..fb5c575ab5 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 c04bbf6008..f79e1f3e9a 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 <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();
}
diff --git a/src/qt/overviewpage.h b/src/qt/overviewpage.h
index c54dda323a..2abddf16a6 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 ff6bb1c5c3..5f092f97aa 100644
--- a/src/qt/res/icons/tx_inout.png
+++ b/src/qt/res/icons/tx_inout.png
Binary files differ
diff --git a/src/qt/res/icons/tx_input.png b/src/qt/res/icons/tx_input.png
index 1673d06ad3..0f5fea3a84 100644
--- a/src/qt/res/icons/tx_input.png
+++ b/src/qt/res/icons/tx_input.png
Binary files differ
diff --git a/src/qt/res/icons/tx_mined.png b/src/qt/res/icons/tx_mined.png
index a336868e8a..613f30fecc 100644
--- a/src/qt/res/icons/tx_mined.png
+++ b/src/qt/res/icons/tx_mined.png
Binary files differ
diff --git a/src/qt/res/icons/tx_output.png b/src/qt/res/icons/tx_output.png
index 0617239e14..9ae39fb329 100644
--- a/src/qt/res/icons/tx_output.png
+++ b/src/qt/res/icons/tx_output.png
Binary files differ
diff --git a/src/qt/transactionfilterproxy.cpp b/src/qt/transactionfilterproxy.cpp
index cd1194d992..5a66f85121 100644
--- a/src/qt/transactionfilterproxy.cpp
+++ b/src/qt/transactionfilterproxy.cpp
@@ -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);
+ }
+}
diff --git a/src/qt/transactionfilterproxy.h b/src/qt/transactionfilterproxy.h
index a44c9c4df7..4dd2a8e5c6 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 1606df9f5a..458341c0f5 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 71b0644110..0daa5f6aaa 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?