diff --git a/components/HistoryTable.qml b/components/HistoryTable.qml
index 15e3a7d8..13bf3775 100644
--- a/components/HistoryTable.qml
+++ b/components/HistoryTable.qml
@@ -29,10 +29,12 @@
import QtQuick 2.0
import moneroComponents.Clipboard 1.0
+
ListView {
id: listView
clip: true
boundsBehavior: ListView.StopAtBounds
+ property var previousItem
footer: Rectangle {
height: 127
@@ -48,7 +50,7 @@ ListView {
}
}
- property var previousItem
+
delegate: Rectangle {
id: delegate
height: 114
@@ -63,13 +65,13 @@ ListView {
anchors.right: parent.right
anchors.top: parent.top
anchors.topMargin: 14
-
+ // -- direction indicator
Rectangle {
id: dot
width: 14
height: width
radius: width / 2
- color: out ? "#FF4F41" : "#36B05B"
+ color: isOut ? "#FF4F41" : "#36B05B"
}
Item { //separator
@@ -77,6 +79,7 @@ ListView {
height: 14
}
+ // -- description aka recepient name from address book (TODO)
Text {
id: descriptionText
width: text.length ? (descriptionArea.containsMouse ? parent.width - x - 12 : 120) : 0
@@ -100,7 +103,7 @@ ListView {
height: 14
visible: !descriptionArea.containsMouse
}
-
+ // -- address (in case outgoing transaction) - N/A in case of incoming
Text {
id: addressText
anchors.verticalCenter: dot.verticalCenter
@@ -109,11 +112,11 @@ ListView {
font.family: "Arial"
font.pixelSize: 14
color: "#545454"
- text: address
+ text: hash
visible: !descriptionArea.containsMouse
}
}
-
+ // -- "PaymentID" title
Text {
id: paymentLabel
anchors.left: parent.left
@@ -128,7 +131,7 @@ ListView {
color: "#535353"
text: paymentId !== "" ? qsTr("Payment ID:") + translationManager.emptyString : ""
}
-
+ // -- "PaymentID" value
Text {
anchors.bottom: paymentLabel.bottom
anchors.left: paymentLabel.right
@@ -143,7 +146,7 @@ ListView {
color: "#545454"
text: paymentId
}
-
+ // -- "Date", "Balance" and "Amound" section
Row {
anchors.left: parent.left
anchors.bottom: parent.bottom
@@ -155,6 +158,7 @@ ListView {
height: 14
}
+ // -- "Date" column
Column {
anchors.top: parent.top
width: 215
@@ -189,10 +193,13 @@ ListView {
}
}
}
-
+ // -- "Balance" column
+ // XXX: we don't have a balance
+ /*
Column {
anchors.top: parent.top
width: 148
+ visible: false
Text {
anchors.left: parent.left
@@ -210,7 +217,9 @@ ListView {
text: balance
}
}
+ */
+ // -- "Amount column
Column {
anchors.top: parent.top
width: 148
@@ -230,8 +239,8 @@ ListView {
anchors.bottomMargin: 3
font.family: "Arial"
font.pixelSize: 16
- color: out ? "#FF4F41" : "#36B05B"
- text: out ? "↓" : "↑"
+ color: isOut ? "#FF4F41" : "#36B05B"
+ text: isOut ? "↓" : "↑"
}
Text {
@@ -239,22 +248,16 @@ ListView {
font.family: "Arial"
font.pixelSize: 18
font.letterSpacing: -1
- color: out ? "#FF4F41" : "#36B05B"
+ color: isOut ? "#FF4F41" : "#36B05B"
text: amount
}
}
}
}
- ListModel {
- id: dropModel
- ListElement { name: "Copy address to clipboard"; icon: "../images/dropdownCopy.png" }
- ListElement { name: "Add to address book"; icon: "../images/dropdownAdd.png" }
- ListElement { name: "Send to same destination"; icon: "../images/dropdownSend.png" }
- ListElement { name: "Find similar transactions"; icon: "../images/dropdownSearch.png" }
- }
- Clipboard { id: clipboard }
+
+
TableDropdown {
id: dropdown
anchors.right: parent.right
@@ -283,4 +286,14 @@ ListView {
color: "#DBDBDB"
}
}
+
+ ListModel {
+ id: dropModel
+ ListElement { name: "Copy address to clipboard"; icon: "../images/dropdownCopy.png" }
+ ListElement { name: "Add to address book"; icon: "../images/dropdownAdd.png" }
+ ListElement { name: "Send to same destination"; icon: "../images/dropdownSend.png" }
+ ListElement { name: "Find similar transactions"; icon: "../images/dropdownSearch.png" }
+ }
+
+ Clipboard { id: clipboard }
}
diff --git a/main.cpp b/main.cpp
index d7c510b5..1709dc88 100644
--- a/main.cpp
+++ b/main.cpp
@@ -39,6 +39,7 @@
#include "Wallet.h"
#include "PendingTransaction.h"
#include "TranslationManager.h"
+#include "TransactionInfo.h"
#include "model/TransactionHistoryModel.h"
@@ -72,6 +73,8 @@ int main(int argc, char *argv[])
qRegisterMetaType();
+ qRegisterMetaType();
+
qmlRegisterUncreatableType("moneroComponents", 1, 0, "TransactionHistoryModel",
"TranslationManager can't be instantiated directly");
diff --git a/pages/History.qml b/pages/History.qml
index 8fce5110..15cf1bc0 100644
--- a/pages/History.qml
+++ b/pages/History.qml
@@ -33,10 +33,13 @@ import moneroComponents.WalletManager 1.0
Rectangle {
id: root
- property ListModel model: testModel
+ property var model: testModel
color: "#F0EEEE"
+ onModelChanged: {
+ console.log("model.rowCount: " + model.rowCount())
+ }
Text {
diff --git a/src/libwalletqt/TransactionHistory.cpp b/src/libwalletqt/TransactionHistory.cpp
index 7466038f..8f52f07e 100644
--- a/src/libwalletqt/TransactionHistory.cpp
+++ b/src/libwalletqt/TransactionHistory.cpp
@@ -2,11 +2,18 @@
#include "TransactionInfo.h"
#include
+#include
+
TransactionInfo *TransactionHistory::transaction(int index)
{
// box up Bitmonero::TransactionInfo
Bitmonero::TransactionInfo * impl = m_pimpl->transaction(index);
+ if (!impl) {
+ qCritical("%s: no transaction info for index %d", __FUNCTION__, index);
+ qCritical("%s: there's %d transactions in backend", __FUNCTION__, m_pimpl->count());
+ return nullptr;
+ }
TransactionInfo * result = new TransactionInfo(impl, this);
return result;
}
@@ -34,6 +41,7 @@ QList TransactionHistory::getAll() const
void TransactionHistory::refresh()
{
// XXX this invalidates previously saved history that might be used by clients
+
emit refreshStarted();
m_pimpl->refresh();
emit refreshFinished();
diff --git a/src/libwalletqt/TransactionInfo.cpp b/src/libwalletqt/TransactionInfo.cpp
index 40711765..3aa7334c 100644
--- a/src/libwalletqt/TransactionInfo.cpp
+++ b/src/libwalletqt/TransactionInfo.cpp
@@ -39,13 +39,23 @@ QString TransactionInfo::hash() const
return QString::fromStdString(m_pimpl->hash());
}
-QString TransactionInfo::timestamp()
+QDateTime TransactionInfo::timestamp() const
{
- QString result = QDateTime::fromTime_t(m_pimpl->timestamp()).toString(Qt::ISODate);
+ QDateTime result = QDateTime::fromTime_t(m_pimpl->timestamp());
return result;
}
-QString TransactionInfo::paymentId()
+QString TransactionInfo::date() const
+{
+ return timestamp().date().toString(Qt::ISODate);
+}
+
+QString TransactionInfo::time() const
+{
+ return timestamp().time().toString(Qt::ISODate);
+}
+
+QString TransactionInfo::paymentId() const
{
return QString::fromStdString(m_pimpl->paymentId());
}
diff --git a/src/libwalletqt/TransactionInfo.h b/src/libwalletqt/TransactionInfo.h
index 4dabc5b4..3381131a 100644
--- a/src/libwalletqt/TransactionInfo.h
+++ b/src/libwalletqt/TransactionInfo.h
@@ -1,8 +1,9 @@
#ifndef TRANSACTIONINFO_H
#define TRANSACTIONINFO_H
-#include
#include
+#include
+#include
class TransactionInfo : public QObject
{
@@ -14,7 +15,9 @@ class TransactionInfo : public QObject
Q_PROPERTY(QString fee READ fee)
Q_PROPERTY(quint64 blockHeight READ blockHeight)
Q_PROPERTY(QString hash READ hash)
- Q_PROPERTY(QString timestamp READ timestamp)
+ Q_PROPERTY(QDateTime timestamp READ timestamp)
+ Q_PROPERTY(QString date READ date)
+ Q_PROPERTY(QString time READ time)
Q_PROPERTY(QString paymentId READ paymentId)
public:
@@ -41,8 +44,11 @@ public:
quint64 blockHeight() const;
//! transaction_id
QString hash() const;
- QString timestamp();
- QString paymentId();
+ QDateTime timestamp() const;
+ QString date() const;
+ QString time() const;
+ QString paymentId() const;
+
// TODO: implement it
//! only applicable for output transactions
@@ -57,4 +63,5 @@ private:
// in order to wrap it to QVariant
Q_DECLARE_METATYPE(TransactionInfo*)
+
#endif // TRANSACTIONINFO_H
diff --git a/src/libwalletqt/Wallet.cpp b/src/libwalletqt/Wallet.cpp
index 9f0908b9..39d40a17 100644
--- a/src/libwalletqt/Wallet.cpp
+++ b/src/libwalletqt/Wallet.cpp
@@ -40,12 +40,14 @@ public:
virtual void newBlock(uint64_t height)
{
// qDebug() << __FUNCTION__;
+ m_wallet->m_history->refresh();
emit m_wallet->newBlock(height);
}
virtual void updated()
{
qDebug() << __FUNCTION__;
+ m_wallet->m_history->refresh();
emit m_wallet->updated();
}
@@ -53,6 +55,7 @@ public:
virtual void refreshed()
{
qDebug() << __FUNCTION__;
+
emit m_wallet->refreshed();
}
@@ -166,6 +169,7 @@ quint64 Wallet::daemonBlockChainTargetHeight() const
bool Wallet::refresh()
{
bool result = m_walletImpl->refresh();
+ m_history->refresh();
if (result)
emit updated();
return result;
@@ -205,10 +209,10 @@ void Wallet::disposeTransaction(PendingTransaction *t)
TransactionHistory *Wallet::history()
{
- if (!m_history) {
- Bitmonero::TransactionHistory * impl = m_walletImpl->history();
- m_history = new TransactionHistory(impl, this);
- }
+// if (m_history->count() == 0) {
+// m_history->refresh();
+// }
+
return m_history;
}
@@ -252,6 +256,7 @@ Wallet::Wallet(Bitmonero::Wallet *w, QObject *parent)
, m_daemonBlockChainHeight(0)
, m_daemonBlockChainHeightTtl(DAEMON_BLOCKCHAIN_HEIGHT_CACHE_TTL_SECONDS)
{
+ m_history = new TransactionHistory(m_walletImpl->history(), this);
m_walletImpl->setListener(new WalletListenerImpl(this));
}
diff --git a/src/model/TransactionHistoryModel.cpp b/src/model/TransactionHistoryModel.cpp
index 1666981c..b8f23f68 100644
--- a/src/model/TransactionHistoryModel.cpp
+++ b/src/model/TransactionHistoryModel.cpp
@@ -2,6 +2,8 @@
#include "TransactionHistory.h"
#include "TransactionInfo.h"
+#include
+
TransactionHistoryModel::TransactionHistoryModel(QObject *parent)
: QAbstractListModel(parent), m_transactionHistory(nullptr)
@@ -14,6 +16,12 @@ void TransactionHistoryModel::setTransactionHistory(TransactionHistory *th)
beginResetModel();
m_transactionHistory = th;
endResetModel();
+
+ connect(m_transactionHistory, &TransactionHistory::refreshStarted,
+ this, &TransactionHistoryModel::beginResetModel);
+ connect(m_transactionHistory, &TransactionHistory::refreshFinished,
+ this, &TransactionHistoryModel::endResetModel);
+
emit transactionHistoryChanged();
}
@@ -72,6 +80,15 @@ QVariant TransactionHistoryModel::data(const QModelIndex &index, int role) const
case TransactionPaymentIdRole:
result = tInfo->paymentId();
break;
+ case TransactionIsOutRole:
+ result = tInfo->direction() == TransactionInfo::Direction_Out;
+ break;
+ case TransactionDateRole:
+ result = tInfo->date();
+ break;
+ case TransactionTimeRole:
+ result = tInfo->time();
+ break;
}
return result;
@@ -96,6 +113,9 @@ QHash TransactionHistoryModel::roleNames() const
roleNames.insert(TransactionHashRole, "hash");
roleNames.insert(TransactionTimeStampRole, "timeStamp");
roleNames.insert(TransactionPaymentIdRole, "paymentId");
+ roleNames.insert(TransactionIsOutRole, "isOut");
+ roleNames.insert(TransactionDateRole, "date");
+ roleNames.insert(TransactionTimeRole, "time");
return roleNames;
}
diff --git a/src/model/TransactionHistoryModel.h b/src/model/TransactionHistoryModel.h
index 2813a89a..96d3ff32 100644
--- a/src/model/TransactionHistoryModel.h
+++ b/src/model/TransactionHistoryModel.h
@@ -25,7 +25,12 @@ public:
TransactionBlockHeightRole,
TransactionHashRole,
TransactionTimeStampRole,
- TransactionPaymentIdRole
+ TransactionPaymentIdRole,
+ // extra role (alias) for TransactionDirectionRole (as UI currently wants just boolean "out")
+ TransactionIsOutRole,
+ // extra roles for date and time (as UI wants date and time separately)
+ TransactionDateRole,
+ TransactionTimeRole
};
TransactionHistoryModel(QObject * parent = 0);
@@ -33,9 +38,9 @@ public:
TransactionHistory * transactionHistory() const;
/// QAbstractListModel
- virtual QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const override;
- virtual int rowCount(const QModelIndex & parent = QModelIndex()) const override;
- virtual QHash roleNames() const override;
+ virtual QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const override;
+ virtual int rowCount(const QModelIndex & parent = QModelIndex()) const override;
+ virtual QHash roleNames() const override;
signals:
void transactionHistoryChanged();