diff --git a/KelvinDashboardGUI/DapCommandController.cpp b/KelvinDashboardGUI/DapCommandController.cpp index ace19cf633e011f401c19e785d3ffe701931419b..e475a6b357a693c5841cfc0475c2b6213a0047c5 100755 --- a/KelvinDashboardGUI/DapCommandController.cpp +++ b/KelvinDashboardGUI/DapCommandController.cpp @@ -52,6 +52,12 @@ void DapCommandController::getNodeLogs() connect(reply, SIGNAL(finished()), this, SLOT(processGetNodeLogs())); } +void DapCommandController::setListenerHistory() +{ + DapRpcServiceReply *reply = m_DAPRpcSocket->invokeRemoteMethod("RPCServer.getHistory"); + connect(reply, SIGNAL(finished()), this, SLOT(processGetHistory())); +} + void DapCommandController::processChangedLog() { // QStringList tempLogModel; @@ -173,6 +179,13 @@ void DapCommandController::processExecuteCommand() emit executeCommandChanged(result); } +void DapCommandController::processGetHistory() +{ + qInfo() << "processGetHistory()"; + DapRpcServiceReply *reply = static_cast<DapRpcServiceReply *>(sender()); + emit sendHistory(reply->response().result().toVariant()); +} + /// Show or hide GUI client by clicking on the tray icon. /// @param aIsActivated Accepts true - when requesting to /// display a client, falso - when requesting to hide a client. diff --git a/KelvinDashboardGUI/DapCommandController.h b/KelvinDashboardGUI/DapCommandController.h index bac1d36516aaa5b7f72291a75f0309943d4d6346..75c4546766a1e14f3537a2eeefc3e2c1faf5dba3 100755 --- a/KelvinDashboardGUI/DapCommandController.h +++ b/KelvinDashboardGUI/DapCommandController.h @@ -46,6 +46,9 @@ signals: void onClearLogModel(); void onLogModel(); + + void sendHistory(const QVariant& aData); + public: /// Overloaded constructor. /// @param apIODevice Data transfer device. @@ -72,6 +75,9 @@ private slots: void processGetNodeStatus(); void processExecuteCommand(); + + void processGetHistory(); + public slots: /// Show or hide GUI client by clicking on the tray icon. /// @param aIsActivated Accepts true - when requesting to @@ -103,6 +109,8 @@ public slots: void clearLogModel(); /// Get node logs. void getNodeLogs(); + + void setListenerHistory(); }; #endif // COMMANDCONTROLLER_H diff --git a/KelvinDashboardGUI/DapScreenHistoryFilterModel.cpp b/KelvinDashboardGUI/DapScreenHistoryFilterModel.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ed91771e3ae5e8340757923288bd1cf8e5e08eab --- /dev/null +++ b/KelvinDashboardGUI/DapScreenHistoryFilterModel.cpp @@ -0,0 +1,53 @@ +#include "DapScreenHistoryFilterModel.h" + +DapScreenHistoryFilterModel::DapScreenHistoryFilterModel(QObject *parent) : + QSortFilterProxyModel(parent) +{ + +} + +DapScreenHistoryFilterModel& DapScreenHistoryFilterModel::getInstance() +{ + static DapScreenHistoryFilterModel instance; + return instance; +} + +void DapScreenHistoryFilterModel::setFilterWallet(const QString& aWalletNumber) +{ + if(m_walletNumber == aWalletNumber) return; + m_walletNumber = aWalletNumber; +} + +void DapScreenHistoryFilterModel::setFilterDate(const QDateTime& aDateLeft, const QDateTime& aDateRight) +{ + if(m_dateLeft == aDateLeft || m_dateRight == aDateRight) return; + m_dateLeft = aDateLeft; + m_dateRight = aDateRight; +} + +void DapScreenHistoryFilterModel::setFilterStatus(const DapScreenHistoryModel::DapTransactionStatus aStatus) +{ + if(m_status == aStatus) return; + m_status = aStatus; +} + +bool DapScreenHistoryFilterModel::lessThan(const QModelIndex& source_left, const QModelIndex& source_right) const +{ + QString first = source_left.data().toString(); + QString second = source_right.data().toString(); + return first < second; +} + +bool DapScreenHistoryFilterModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const +{ + QDateTime time; + QModelIndex index = sourceModel()->index(source_row, 0, source_parent); + QString timeStr = index.data(DapScreenHistoryModel::DisplayDateRole).toString(); + + if(timeStr == tr("Today")) time = QDateTime::currentDateTime(); + else time = QDateTime::fromString(MASK_FOR_MODEL); + + return (index.data(DapScreenHistoryModel::DisplayNumberWalletRole).toString() == m_walletNumber) || + (index.data(DapScreenHistoryModel::DisplayStatusRole).toInt() == m_status) || + (time >= m_dateLeft && time <= m_dateRight); +} diff --git a/KelvinDashboardGUI/DapScreenHistoryFilterModel.h b/KelvinDashboardGUI/DapScreenHistoryFilterModel.h new file mode 100644 index 0000000000000000000000000000000000000000..44f63308f0b805bb5b4dc6f749b0a9d61e8de647 --- /dev/null +++ b/KelvinDashboardGUI/DapScreenHistoryFilterModel.h @@ -0,0 +1,32 @@ +#ifndef DAPSCREENHISTORYFILTERMODEL_H +#define DAPSCREENHISTORYFILTERMODEL_H + +#include <QSortFilterProxyModel> + +#include "DapScreenHistoryModel.h" + +class DapScreenHistoryFilterModel : public QSortFilterProxyModel +{ + Q_OBJECT + +private: + QString m_walletNumber; + QDateTime m_dateLeft; + QDateTime m_dateRight; + int m_status; + +protected: + bool lessThan(const QModelIndex& source_left, const QModelIndex& source_right) const; + bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const; + +public: + explicit DapScreenHistoryFilterModel(QObject *parent = nullptr); + static DapScreenHistoryFilterModel &getInstance(); + +public slots: + void setFilterWallet(const QString& aWalletNumber); + void setFilterDate(const QDateTime& aDateLeft, const QDateTime& aDateRight); + void setFilterStatus(const DapScreenHistoryModel::DapTransactionStatus aStatus); +}; + +#endif // DAPSCREENHISTORYFILTERMODEL_H diff --git a/KelvinDashboardGUI/DapScreenHistoryModel.cpp b/KelvinDashboardGUI/DapScreenHistoryModel.cpp index 9a6c0c361557305f1eb3ceb1a0fccb6fbfd0d668..e376050858f1a022f5701a1279aa55cc9d4f932b 100644 --- a/KelvinDashboardGUI/DapScreenHistoryModel.cpp +++ b/KelvinDashboardGUI/DapScreenHistoryModel.cpp @@ -3,38 +3,7 @@ DapScreenHistoryModel::DapScreenHistoryModel(QObject *parent) : QAbstractListModel(parent) { - for(int i = 0; i < 5; i++) - { - DapTransactionItem element; - element.TokenName = QString("token %1").arg(i); - element.Date = "today"; - element.WalletNumber = "number wallet"; - element.Status = "Sent"; - element.Currency = QString("$ 1020201010%1").arg(i); - element.Cryptocurrency = QString("KLV 4443222111%1").arg(i); - m_elementList.append(element); - } - - for(int i = 0; i < 5; i++) - { - DapTransactionItem element; - element.TokenName = QString("token %1").arg(i); - element.Date = "yesterday"; - element.WalletNumber = "number wallet"; - element.Status = "Error"; - element.Currency = QString("$ 15647475623820%1").arg(i); - element.Cryptocurrency = QString("KLV 454535453%1").arg(i); - m_elementList.append(element); - } -// DapTransactionItem element; -// element.TokenName = QString("token new"); -// element.Date = "today"; -// element.WalletNumber = "number wallet 1221"; -// element.Status = "sent"; -// element.Currency = QString("$ 1555444"); -// element.Cryptocurrency = QString("KLV 44433"); -// m_elementList.append(element); } DapScreenHistoryModel& DapScreenHistoryModel::getInstance() @@ -55,6 +24,36 @@ QHash<int, QByteArray> DapScreenHistoryModel::roleNames() const return names; } +void DapScreenHistoryModel::receiveNewData(const QVariant& aData) +{ + beginResetModel(); + QList<QVariant> dataList = aData.toList(); + m_elementList.clear(); + + for(int i = 0; i < dataList.count(); i++) + { + // Description QStringList + // ------------------------ + // 0: date + // 1: status + // 2: currency + // 3: token + // 4: wallet_to + // 5: wallet_from + + QStringList dataItem = dataList.at(i).toStringList(); + DapTransactionItem item; + item.Date = QDateTime::fromString(dataItem.at(0), "ddd MMM dd h:mm:ss YYYY"); + item.Status = static_cast<DapTransactionStatus>(dataItem.at(1).toInt()); + item.Cryptocurrency = dataItem.at(2); + item.TokenName = dataItem.at(3); + item.WalletNumber = dataItem.at(5); + item.Currency = "$ 0 USD"; // TODO: + m_elementList.append(item); + } + endResetModel(); +} + int DapScreenHistoryModel::rowCount(const QModelIndex &parent) const { if (parent.isValid()) return 0; @@ -67,7 +66,13 @@ QVariant DapScreenHistoryModel::data(const QModelIndex &index, int role) const switch (role) { - case DisplayDateRole: return m_elementList.at(index.row()).Date; + case DisplayDateRole: + { + QDateTime currentTime = QDateTime::currentDateTime(); + QDateTime itemDate = m_elementList.at(index.row()).Date; + if(currentTime == itemDate) return QString("Today"); + return itemDate.toString(MASK_FOR_MODEL); + } case DisplayNameTokenRole: return m_elementList.at(index.row()).TokenName; case DisplayNumberWalletRole: return m_elementList.at(index.row()).WalletNumber; case DisplayStatusRole: return m_elementList.at(index.row()).Status; diff --git a/KelvinDashboardGUI/DapScreenHistoryModel.h b/KelvinDashboardGUI/DapScreenHistoryModel.h index aa50bf6d11688e0ac5ca1a300c7e06860499dce8..db75a9a238a502783c69ba9602d85c0a02cfc01d 100644 --- a/KelvinDashboardGUI/DapScreenHistoryModel.h +++ b/KelvinDashboardGUI/DapScreenHistoryModel.h @@ -4,22 +4,33 @@ #include <QDebug> #include <QImage> #include <QAbstractListModel> +#include <QDateTime> -struct DapTransactionItem { - QString Date; - QImage TokenPic; - QString Status; - QString TokenName; - QString WalletNumber; - QString Cryptocurrency; - QString Currency; -}; +#define MASK_FOR_MODEL QString("MMMM, dd") class DapScreenHistoryModel : public QAbstractListModel { Q_OBJECT -private: +public: + enum DapTransactionStatus { + Pending, + Sent, + Received, + Error + }; + Q_ENUM(DapTransactionStatus) + + struct DapTransactionItem { + QDateTime Date; + QImage TokenPic; + DapTransactionStatus Status; + QString TokenName; + QString WalletNumber; + QString Cryptocurrency; + QString Currency; + }; + enum { DisplayDateRole = Qt::UserRole, DisplayNameTokenRole, @@ -29,6 +40,7 @@ private: DisplayCurrency }; +private: QList<DapTransactionItem> m_elementList; public: @@ -40,8 +52,7 @@ public: QHash<int, QByteArray> roleNames() const override; public slots: - - + void receiveNewData(const QVariant& aData); }; #endif // DAPSCREENHISTORYMODEL_H diff --git a/KelvinDashboardGUI/DapServiceController.cpp b/KelvinDashboardGUI/DapServiceController.cpp index aa06a764a769257135cf748e5352a2b0f2304fab..bc97ed80e8a602add2a22e5c7ce9979fd270795e 100755 --- a/KelvinDashboardGUI/DapServiceController.cpp +++ b/KelvinDashboardGUI/DapServiceController.cpp @@ -55,6 +55,8 @@ void DapServiceController::init(DapServiceClient *apDapServiceClient) connect(&DapChainNodeNetworkModel::getInstance(), SIGNAL(requestNodeNetwork()), this, SLOT(getNodeNetwork())); connect(&DapChainNodeNetworkModel::getInstance(), SIGNAL(requestNodeStatus(bool)), this, SLOT(setNodeStatus(bool))); + + connect(m_pDapCommandController, SIGNAL(sendHistory(QVariant)), this, SLOT(processGetHistory(QVariant))); } QString DapServiceController::getBrand() const @@ -231,6 +233,11 @@ void DapServiceController::processGetNodeNetwork(const QVariant& aData) DapChainNodeNetworkModel::getInstance().receiveNewNetwork(aData); } +void DapServiceController::processGetHistory(const QVariant& aData) +{ + DapScreenHistoryModel::getInstance().receiveNewData(aData); +} + /// Get an instance of a class. /// @return Instance of a class. diff --git a/KelvinDashboardGUI/DapServiceController.h b/KelvinDashboardGUI/DapServiceController.h index 7222e0f7d20d731d8e9fdc4138c714c9ee6c0e1c..83cbef79fdd44cd960639a74b0d26b42a587cab3 100755 --- a/KelvinDashboardGUI/DapServiceController.h +++ b/KelvinDashboardGUI/DapServiceController.h @@ -14,6 +14,7 @@ #include "DapLogModel.h" #include "DapChainWalletsModel.h" #include "DapChainNodeNetworkModel.h" +#include "DapScreenHistoryModel.h" class DapServiceController : public QObject { @@ -113,6 +114,8 @@ private slots: void processGetNodeNetwork(const QVariant& aData); + void processGetHistory(const QVariant& aData); + public slots: void getNodeNetwork(); void setNodeStatus(const bool aIsOnline); diff --git a/KelvinDashboardGUI/DapUiQmlScreenHistory.qml b/KelvinDashboardGUI/DapUiQmlScreenHistory.qml index 5a15312b6f2077b1c3abc02da0a8e2872ea475b2..4e68377f3a9727afd8eaa8381777c4d809ae6ac5 100644 --- a/KelvinDashboardGUI/DapUiQmlScreenHistory.qml +++ b/KelvinDashboardGUI/DapUiQmlScreenHistory.qml @@ -1,7 +1,10 @@ import QtQuick 2.9 +import QtQml 2.12 import QtQuick.Controls 2.2 import QtQuick.Layouts 1.12 +import DapTransactionHistory 1.0 + Page { ListView { id: dapListView @@ -117,10 +120,12 @@ Page { font.pointSize: 12 onTextChanged: { - if(text == "Error") color = "#00081B" - else if(text == "Received") color = "#454E63" - else if(text == "Sent") color = "#959CA6" - else if(text == "Pending") color = "#E3E3E3"; + switch(text) { + case DapTransactionModel.Error: color = "#00081B"; break; + case DapTransactionModel.Received: color = "#454E63"; break; + case DapTransactionModel.Sent: color = "#959CA6"; break; + case DapTransactionModel.Pending: color = "#E3E3E3"; break; + } } } } diff --git a/KelvinDashboardGUI/KelvinDashboardGUI.pro b/KelvinDashboardGUI/KelvinDashboardGUI.pro index 0fbdf8de95a5ee912642dc845c298822229726ee..37c5639d60074f10ab012ef2a3847cad5d97a40b 100755 --- a/KelvinDashboardGUI/KelvinDashboardGUI.pro +++ b/KelvinDashboardGUI/KelvinDashboardGUI.pro @@ -42,6 +42,7 @@ ICON = icon.ico SOURCES += \ DapChainNodeNetworkExplorer.cpp \ DapChainNodeNetworkModel.cpp \ + DapScreenHistoryFilterModel.cpp \ DapScreenHistoryModel.cpp \ DapUiQmlWidgetChainTransactions.cpp \ main.cpp \ @@ -77,6 +78,7 @@ else: unix:!android: target.path = /opt/kelvin-dashboard/bin HEADERS += \ DapChainNodeNetworkExplorer.h \ DapChainNodeNetworkModel.h \ + DapScreenHistoryFilterModel.h \ DapScreenHistoryModel.h \ DapUiQmlWidgetChainBallance.h \ DapUiQmlWidgetChainBlockExplorer.h \ diff --git a/KelvinDashboardGUI/main.cpp b/KelvinDashboardGUI/main.cpp index 3aced68c19a01c83292431840c4b893f1882a527..b9143429363d915cfff2f90007c29669adbf690d 100755 --- a/KelvinDashboardGUI/main.cpp +++ b/KelvinDashboardGUI/main.cpp @@ -6,6 +6,7 @@ #include <QIcon> #include <QSystemSemaphore> #include <QSharedMemory> +#include <QScreen> #include "DapHalper.h" #include "DapScreenDialog.h" @@ -21,8 +22,8 @@ #include "DapChainWalletsModel.h" #include "DapChainNodeNetworkModel.h" #include "DapChainNodeNetworkExplorer.h" +#include "DapScreenHistoryFilterModel.h" -#include "DapScreenHistoryModel.h" #include <QRegExp> @@ -52,6 +53,9 @@ int main(int argc, char *argv[]) dapServiceClient.init(); controller.getNodeLogs(0, 100); controller.getWallets(); + + DapScreenHistoryFilterModel::getInstance() + .setSourceModel(&DapScreenHistoryModel::getInstance()); // controller.getNodeNetwork(); qmlRegisterType<DapScreenDialog>("KelvinDashboard", 1, 0, "DapScreenDialog"); @@ -60,14 +64,17 @@ int main(int argc, char *argv[]) qmlRegisterType<DapChainNodeNetworkExplorer>("NodeNetworkExplorer", 1, 0, "DapUiQmlWidgetNodeNetwork"); // qmlRegisterType<DapScreenHistoryModel>("") qmlRegisterSingletonType<DapUiQmlWidgetModel>("KelvinDashboard", 1, 0, "DapUiQmlWidgetModel", DapUiQmlWidgetModel::singletonProvider); + qmlRegisterType<DapScreenHistoryModel>("DapTransactionHistory", 1, 0, "DapTransactionModel"); QQmlApplicationEngine engine; + qreal dpi = QGuiApplication::primaryScreen()->physicalDotsPerInch(); engine.rootContext()->setContextProperty("dapServiceController", &DapServiceController::getInstance()); engine.rootContext()->setContextProperty("dapUiQmlWidgetModel", &DapUiQmlWidgetModel::getInstance()); engine.rootContext()->setContextProperty("dapLogModel", &DapLogModel::getInstance()); engine.rootContext()->setContextProperty("dapChainWalletsModel", &DapChainWalletsModel::getInstance()); engine.rootContext()->setContextProperty("dapNodeNetworkModel", &DapChainNodeNetworkModel::getInstance()); engine.rootContext()->setContextProperty("dapHistoryModel", &DapScreenHistoryModel::getInstance()); + engine.rootContext()->setContextProperty("pt", 1/72*dpi); engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); // DapSettings &settings = DapSettings::getInstance("Settings.json");