From 1f5249d89e795dadfd5f2bf1bf0abd982b15d566 Mon Sep 17 00:00:00 2001 From: "littletux89@gmail.com" <littletux89@gmail.com> Date: Fri, 24 Jan 2020 17:09:37 +0300 Subject: [PATCH] [+] Test implementation of passing your own object in qml. --- CellFrameDashboardGUI/DapServiceController.h | 2 + CellFrameDashboardGUI/main.cpp | 6 +- .../Dashboard/DapDashboardTopPanel.qml | 22 +++- libCellFrameDashboardCommon/DapWallet.cpp | 76 +++++++++-- libCellFrameDashboardCommon/DapWallet.h | 40 +++++- .../DapWalletToken.cpp | 105 ++++++++++++++- libCellFrameDashboardCommon/DapWalletToken.h | 38 +++++- .../Handlers/DapGetListWalletsCommand.cpp | 123 +++++++++++------- .../Handlers/DapGetListWalletsCommand.h | 5 +- 9 files changed, 343 insertions(+), 74 deletions(-) diff --git a/CellFrameDashboardGUI/DapServiceController.h b/CellFrameDashboardGUI/DapServiceController.h index fc2f658..90288f3 100644 --- a/CellFrameDashboardGUI/DapServiceController.h +++ b/CellFrameDashboardGUI/DapServiceController.h @@ -7,6 +7,7 @@ #include <QJSEngine> #include <QVector> #include <algorithm> +#include <QDataStream> #include "DapServiceClient.h" #include "Handlers/DapAbstractCommand.h" @@ -15,6 +16,7 @@ #include "Handlers/DapUpdateLogsCommand.h" #include "Handlers/DapAddWalletCommand.h" #include "Handlers/DapGetListWalletsCommand.h" +#include "DapWallet.h" class DapServiceController : public QObject { diff --git a/CellFrameDashboardGUI/main.cpp b/CellFrameDashboardGUI/main.cpp index 6112b12..3784484 100644 --- a/CellFrameDashboardGUI/main.cpp +++ b/CellFrameDashboardGUI/main.cpp @@ -40,13 +40,17 @@ int main(int argc, char *argv[]) #endif //#endif + qRegisterMetaType<DapWallet>(); + /// Local client. DapServiceClient dapServiceClient; // Creating a service controller DapServiceController &controller = DapServiceController::getInstance(); controller.init(&dapServiceClient); dapServiceClient.init(); - qmlRegisterType<DapLogMessage>("LogMessage", 1, 0, "DapLogMessage"); + qmlRegisterType<DapLogMessage>("Demlabs", 1, 0, "DapLogMessage"); + qmlRegisterType<DapWallet>("Demlabs", 1, 0, "DapWallet"); + qmlRegisterType<DapWalletToken>("Demlabs", 1, 0, "DapWalletToken"); QQmlApplicationEngine engine; engine.rootContext()->setContextProperty("dapServiceController", &DapServiceController::getInstance()); diff --git a/CellFrameDashboardGUI/screen/desktop/Dashboard/DapDashboardTopPanel.qml b/CellFrameDashboardGUI/screen/desktop/Dashboard/DapDashboardTopPanel.qml index 7f84bb6..485ee28 100644 --- a/CellFrameDashboardGUI/screen/desktop/Dashboard/DapDashboardTopPanel.qml +++ b/CellFrameDashboardGUI/screen/desktop/Dashboard/DapDashboardTopPanel.qml @@ -1,7 +1,14 @@ import QtQuick 2.4 +import Demlabs 1.0 DapDashboardTopPanelForm { + DapWallet + { + id: wal + } + + property var objectsArray: [] ListModel { id: modelWallets @@ -17,12 +24,21 @@ DapDashboardTopPanelForm else console.log(wallet[1]) } + onWalletsListReceived: + { + objectsArray.push(wal.fromVariant(wallet)) + for (var i = 0; i < objectsArray.length; ++i) + { +// var str = objectsArray[i].Name + objectsArray[i].Networks + objectsArray[i].getTokens("private").Balance + "\n" + modelWallets.append({ "name" : objectsArray[i].Name}) + } + } } - function updateModel(wallet) + function updateModel(nameWallet) { - console.log(wallet[2]) - modelWallets.append({ "name" : wallet[1]}) + console.log(nameWallet) + modelWallets.append({ "name" : nameWallet}) } dapAddWalletButton.onClicked: diff --git a/libCellFrameDashboardCommon/DapWallet.cpp b/libCellFrameDashboardCommon/DapWallet.cpp index 52c5904..d29cfc7 100644 --- a/libCellFrameDashboardCommon/DapWallet.cpp +++ b/libCellFrameDashboardCommon/DapWallet.cpp @@ -1,34 +1,63 @@ #include "DapWallet.h" -DapWallet::DapWallet(const QString &asName) - : m_name(asName) +DapWallet::DapWallet(const QString &asName, QObject * parent) + : QObject(parent), m_sName(asName) { } +DapWallet::DapWallet(const DapWallet &aToken) + : QObject(parent()), m_sName(aToken.m_sName), m_aNetworks(aToken.m_aNetworks), + m_aAddress(aToken.m_aAddress), m_aTokens(aToken.m_aTokens) +{ + +} + +DapWallet &DapWallet::operator=(const DapWallet &aToken) +{ + QObject(parent()); + m_sName = aToken.m_sName; + m_aNetworks = aToken.m_aNetworks; + m_aAddress = aToken.m_aAddress; + m_aTokens = aToken.m_aTokens; + return (*this); +} + +QString DapWallet::getName() const +{ + return m_sName; +} + +void DapWallet::setName(const QString &sName) +{ + m_sName = sName; + + emit nameChanged(m_sName); +} + void DapWallet::addNetwork(const QString &asNetwork) { - m_networks.append(asNetwork); + m_aNetworks.append(asNetwork); } QList<QString> &DapWallet::getNetworks() { - return m_networks; + return m_aNetworks; } void DapWallet::setAddress(const QString& aiAddress, const QString &asNetwork) { - m_iAddress.insert(asNetwork, aiAddress); + m_aAddress.insert(asNetwork, aiAddress); } QString DapWallet::getAddress(const QString &asNetwork) { - return m_iAddress.find(asNetwork).value(); + return m_aAddress.find(asNetwork).value(); } -void DapWallet::addToken(const DapWalletToken &aToken, const QString &asNetwork) +void DapWallet::addToken(DapWalletToken aToken) { - m_aTokens.insert(asNetwork, aToken); + m_aTokens.append(aToken); } QList<DapWalletToken *> DapWallet::getTokens(const QString &asNetwork) @@ -38,10 +67,37 @@ QList<DapWalletToken *> DapWallet::getTokens(const QString &asNetwork) auto end = m_aTokens.end(); for(;begin != end; ++begin) { - if(begin.key() == asNetwork) + if(begin->getNetwork() == asNetwork) { - tokens.append(&begin.value()); + tokens.append(&(*begin)); } } return tokens; } + +QObject* DapWallet::fromVariant(const QVariant &aWallet) +{ + DapWallet * wallet = new DapWallet(); + QByteArray data = QByteArray::fromStdString(aWallet.toString().toStdString()); + QDataStream in(&data, QIODevice::ReadOnly); + in >> *wallet; + return wallet; +} + +QDataStream& operator << (QDataStream& aOut, const DapWallet& aWallet) +{ + aOut << aWallet.m_sName + << aWallet.m_aNetworks + << aWallet.m_aAddress + << aWallet.m_aTokens; + return aOut; +} + +QDataStream& operator >> (QDataStream& aOut, DapWallet& aWallet) +{ + aOut >> aWallet.m_sName + >> aWallet.m_aNetworks + >> aWallet.m_aAddress + >> aWallet.m_aTokens; + return aOut; +} diff --git a/libCellFrameDashboardCommon/DapWallet.h b/libCellFrameDashboardCommon/DapWallet.h index faabd37..88a19ac 100644 --- a/libCellFrameDashboardCommon/DapWallet.h +++ b/libCellFrameDashboardCommon/DapWallet.h @@ -1,30 +1,56 @@ #ifndef DAPWALLET_H #define DAPWALLET_H +#include <QObject> #include <QString> #include <QList> +#include <QQmlEngine> #include "DapWalletToken.h" -class DapWallet +class DapWallet : public QObject { - QString m_name; - QList<QString> m_networks; - QMap<QString, QString> m_iAddress; - QMultiMap<QString, DapWalletToken> m_aTokens; + Q_OBJECT + + QString m_sName; + QList<QString> m_aNetworks; + QMap<QString, QString> m_aAddress; + QList<DapWalletToken> m_aTokens; public: - DapWallet(const QString& asName); + Q_INVOKABLE explicit DapWallet(const QString& asName = QString(), QObject * parent = nullptr); + Q_INVOKABLE DapWallet(const DapWallet& aToken); + Q_INVOKABLE DapWallet& operator=(const DapWallet& aToken); + + Q_PROPERTY(QString Name MEMBER m_sName READ getName WRITE setName NOTIFY nameChanged) + Q_PROPERTY(QList<QString> Networks MEMBER m_aNetworks READ getNetworks NOTIFY networkAdded) + + + friend QDataStream& operator << (QDataStream& aOut, const DapWallet& aToken); + friend QDataStream& operator >> (QDataStream& aOut, DapWallet& aToken); + + Q_INVOKABLE QObject* fromVariant(const QVariant& aWallet); +signals: + void nameChanged(const QString& asName); + void networkAdded(const QString& asName); + +public slots: + + QString getName() const; + void setName(const QString &sName); void addNetwork(const QString& asNetwork); QList<QString>& getNetworks(); void setAddress(const QString &aiAddress, const QString& asNetwork); QString getAddress(const QString& asNetwork); - void addToken(const DapWalletToken& asName, const QString& asNetwork); + void addToken(DapWalletToken asName); QList<DapWalletToken*> getTokens(const QString& asNetwork); }; +Q_DECLARE_METATYPE(DapWallet) + + #endif // DAPWALLET_H diff --git a/libCellFrameDashboardCommon/DapWalletToken.cpp b/libCellFrameDashboardCommon/DapWalletToken.cpp index 04b2def..3298206 100644 --- a/libCellFrameDashboardCommon/DapWalletToken.cpp +++ b/libCellFrameDashboardCommon/DapWalletToken.cpp @@ -1,7 +1,108 @@ #include "DapWalletToken.h" -DapWalletToken::DapWalletToken(const QString &asName) - : m_sName(asName) +DapWalletToken::DapWalletToken(const QString &asName, QObject *parent) + : QObject(parent), m_sName(asName) { } + +DapWalletToken::DapWalletToken(const DapWalletToken &aToken) + : QObject(aToken.parent()), m_sName(aToken.m_sName), m_dBalance(aToken.m_dBalance), + m_iEmission(aToken.m_iEmission), m_sNetwork(aToken.m_sNetwork) +{ + +} + +DapWalletToken &DapWalletToken::operator=(const DapWalletToken &aToken) +{ + QObject(parent()); + m_sName = aToken.m_sName; + m_dBalance = aToken.m_dBalance; + m_iEmission = aToken.m_iEmission; + m_sNetwork = aToken.m_sNetwork; + return (*this); +} + +bool DapWalletToken::operator==(const DapWalletToken &aToken) const +{ + return m_sName == aToken.m_sName + && m_dBalance == aToken.m_dBalance + && m_iEmission == aToken.m_iEmission + && m_sNetwork == aToken.m_sNetwork; +} + +QString DapWalletToken::getName() const +{ + return m_sName; +} + +void DapWalletToken::setName(const QString &sName) +{ + m_sName = sName; + + emit nameChanged(m_sName); +} + +double DapWalletToken::getBalance() const +{ + return m_dBalance; +} + +void DapWalletToken::setBalance(double dBalance) +{ + m_dBalance = dBalance; + + emit balanceChanged(m_dBalance); +} + +quint64 DapWalletToken::getEmission() const +{ + return m_iEmission; +} + +void DapWalletToken::setEmission(const quint64 &iEmission) +{ + m_iEmission = iEmission; + + emit emissionChanged(m_iEmission); +} + +QString DapWalletToken::getNetwork() const +{ + return m_sNetwork; +} + +void DapWalletToken::setNetwork(const QString &sNetwork) +{ + m_sNetwork = sNetwork; + + emit networkChanged(m_sNetwork); +} + +QDataStream& operator << (QDataStream& aOut, const DapWalletToken& aToken) +{ + QString balance; + balance.setNum(aToken.m_dBalance); + QString emission; + emission.setNum(aToken.m_iEmission); + aOut << aToken.m_sName + << balance + << emission + << aToken.m_sNetwork; + return aOut; +} + +QDataStream& operator >> (QDataStream& aOut, DapWalletToken& aToken) +{ + QString balance; + QString emission; + aOut >> aToken.m_sName + >> balance + >> emission + >> aToken.m_sNetwork; + aToken.m_dBalance = balance.toDouble(); + aToken.m_iEmission = emission.toULongLong(); + return aOut; +} + + diff --git a/libCellFrameDashboardCommon/DapWalletToken.h b/libCellFrameDashboardCommon/DapWalletToken.h index 99eb270..92e9e6d 100644 --- a/libCellFrameDashboardCommon/DapWalletToken.h +++ b/libCellFrameDashboardCommon/DapWalletToken.h @@ -1,10 +1,14 @@ #ifndef DAPWALLETTOKEN_H #define DAPWALLETTOKEN_H +#include <QObject> #include <QString> +#include <QDataStream> -struct DapWalletToken +class DapWalletToken : public QObject { + Q_OBJECT + /// Token name. QString m_sName; /// Token balance. @@ -15,7 +19,37 @@ struct DapWalletToken QString m_sNetwork; public: - explicit DapWalletToken(const QString& asName = QString()); + explicit DapWalletToken(const QString& asName = QString(), QObject *parent = nullptr); + DapWalletToken(const DapWalletToken& aToken); + DapWalletToken& operator=(const DapWalletToken& aToken); + bool operator==(const DapWalletToken& aToken) const; + + Q_PROPERTY(QString Name MEMBER m_sName READ getName WRITE setName NOTIFY nameChanged) + Q_PROPERTY(double Balance MEMBER m_dBalance READ getBalance WRITE setBalance NOTIFY balanceChanged) + Q_PROPERTY(quint64 Emission MEMBER m_iEmission READ getEmission WRITE setEmission NOTIFY emissionChanged) + Q_PROPERTY(QString Network MEMBER m_sNetwork READ getNetwork WRITE setNetwork NOTIFY networkChanged) + + + friend QDataStream& operator << (QDataStream& aOut, const DapWalletToken& aToken); + friend QDataStream& operator >> (QDataStream& aOut, DapWalletToken& aToken); + +signals: + void nameChanged(const QString & asName); + void balanceChanged(const double & adBalance); + void emissionChanged(const qint64& aiEmission); + void networkChanged(const QString &asNetwork); + +public slots: + QString getName() const; + void setName(const QString &sName); + double getBalance() const; + void setBalance(double dBalance); + quint64 getEmission() const; + void setEmission(const quint64 &iEmission); + QString getNetwork() const; + void setNetwork(const QString &sNetwork); }; +Q_DECLARE_METATYPE(DapWalletToken) + #endif // DAPWALLETTOKEN_H diff --git a/libCellFrameDashboardCommon/Handlers/DapGetListWalletsCommand.cpp b/libCellFrameDashboardCommon/Handlers/DapGetListWalletsCommand.cpp index 58a60b1..65e3211 100644 --- a/libCellFrameDashboardCommon/Handlers/DapGetListWalletsCommand.cpp +++ b/libCellFrameDashboardCommon/Handlers/DapGetListWalletsCommand.cpp @@ -21,8 +21,8 @@ QVariant DapGetListWalletsCommand::respondToClient(const QVariant &arg1, const Q { Q_UNUSED(arg1) Q_UNUSED(arg2) + Q_UNUSED(arg3) Q_UNUSED(arg4) - Q_UNUSED(arg8) Q_UNUSED(arg5) Q_UNUSED(arg6) Q_UNUSED(arg7) @@ -30,63 +30,90 @@ QVariant DapGetListWalletsCommand::respondToClient(const QVariant &arg1, const Q Q_UNUSED(arg9) Q_UNUSED(arg10) - QList<DapWallet> wallets; + DapWallet wallet("MyWallet5"); + wallet.addNetwork("Kelvin-testnet"); + wallet.addNetwork("Private"); + wallet.setAddress("ar4th4t4j6tyj7utjk45u654kuj4kl6ui4l54k5lu5u4il5i34l35", "Kelvin-testnet"); + wallet.setAddress("ar4th4t4j6tyj7utjk45u654kuj4kl6ui4l54k5lu5u4il5i34l35", "Private"); + DapWalletToken token1("KLV", &wallet); + token1.setBalance(5.5); + token1.setNetwork("Kelvin-testnet"); + token1.setEmission(464645646546); + DapWalletToken token2("CELL", &wallet); + token2.setBalance(100); + token2.setNetwork("Private"); + token2.setEmission(121212121); + wallet.addToken(token1); + wallet.addToken(token2); + + QByteArray datas; + QDataStream out(&datas, QIODevice::WriteOnly); + out << wallet; +// std::string s = datas.toStdString(); +// QString str = QString::fromStdString(s); - QStringList list = arg1.toStringList(); - QProcess process; - process.start(QString("%1 wallet list").arg(CLI_PATH)); - process.waitForFinished(-1); - QString res = QString::fromLatin1(process.readAll()); - QRegularExpression rx("wallet:\\s(.+)\\s", QRegularExpression::MultilineOption); - QRegularExpressionMatchIterator itr = rx.globalMatch(res); - while (itr.hasNext()) - { - QRegularExpressionMatch match = itr.next(); - QString walletName = match.captured(1); +// DapWallet w; +// QByteArray d; +// QDataStream in(&datas, QIODevice::ReadOnly); +// in>>w; - auto begin = list.begin(); - auto end = list.end(); - for(; begin != end; ++begin) - { - DapWallet wallet(walletName); - wallet.addNetwork(*begin); + return QVariant(QString::fromStdString(datas.toStdString())); +// QList<DapWallet> wallets; - QProcess process_token; - process_token.start(QString("%1 wallet info -w %2 -net %3") - .arg(CLI_PATH) - .arg(walletName) - .arg(*begin)); +// QStringList list = arg1.toStringList(); +// QProcess process; +// process.start(QString("%1 wallet list").arg(CLI_PATH)); +// process.waitForFinished(-1); +// QString res = QString::fromLatin1(process.readAll()); +// QRegularExpression rx("wallet:\\s(.+)\\s", QRegularExpression::MultilineOption); +// QRegularExpressionMatchIterator itr = rx.globalMatch(res); +// while (itr.hasNext()) +// { +// QRegularExpressionMatch match = itr.next(); +// QString walletName = match.captured(1); - process_token.waitForFinished(-1); - QByteArray result_tokens = process_token.readAll(); - QRegExp regex("wallet: (.+)\\s+addr:\\s+(.+)\\s+(balance)|(\\d+.\\d+)\\s\\((\\d+)\\)\\s(\\w+)"); +// auto begin = list.begin(); +// auto end = list.end(); +// for(; begin != end; ++begin) +// { +// DapWallet wallet (walletName); +// wallet.addNetwork(*begin); - int pos = 0; - while((pos = regex.indexIn(result_tokens, pos)) != -1) - { - DapWalletToken token; - if(!regex.cap(2).isEmpty()) - { - wallet.setAddress(regex.cap(2), *begin); - } - else - { +// QProcess process_token; +// process_token.start(QString("%1 wallet info -w %2 -net %3") +// .arg(CLI_PATH) +// .arg(walletName) +// .arg(*begin)); - token.m_sName = regex.cap(6); - token.m_dBalance = regex.cap(4).toDouble(); - token.m_sNetwork = *begin; - token.m_iEmission = regex.cap(5).toUInt(); - } +// process_token.waitForFinished(-1); +// QByteArray result_tokens = process_token.readAll(); +// QRegExp regex("wallet: (.+)\\s+addr:\\s+(.+)\\s+(balance)|(\\d+.\\d+)\\s\\((\\d+)\\)\\s(\\w+)"); - pos += regex.matchedLength(); - } - wallets.append(wallet); - } - } +// int pos = 0; +// while((pos = regex.indexIn(result_tokens, pos)) != -1) +// { +// DapWalletToken token; +// if(!regex.cap(2).isEmpty()) +// { +// wallet.setAddress(regex.cap(2), *begin); +// } +// else +// { + +// token.setName(regex.cap(6)); +// token.setBalance(regex.cap(4).toDouble()); +// token.setEmission(regex.cap(5).toUInt()); +// token.setNetwork(*begin); +// } +// pos += regex.matchedLength(); +// } +// wallets.append(wallet); +// } +// } // if(m_walletList != walletList) // { // m_walletList = walletList; // emit walletDataChanged(walletData()); // } - return QVariant(); +// return QVariant(); } diff --git a/libCellFrameDashboardCommon/Handlers/DapGetListWalletsCommand.h b/libCellFrameDashboardCommon/Handlers/DapGetListWalletsCommand.h index ff75853..e97d439 100644 --- a/libCellFrameDashboardCommon/Handlers/DapGetListWalletsCommand.h +++ b/libCellFrameDashboardCommon/Handlers/DapGetListWalletsCommand.h @@ -4,6 +4,9 @@ #include <QProcess> #include <QRegExp> #include <QRegularExpression> +#include <QByteArray> +#include <QDataStream> +#include <QBuffer> #include "DapWallet.h" #include "DapAbstractCommand.h" @@ -26,7 +29,7 @@ public slots: const QVariant &arg3 = QVariant(), const QVariant &arg4 = QVariant(), const QVariant &arg5 = QVariant(), const QVariant &arg6 = QVariant(), const QVariant &arg7 = QVariant(), const QVariant &arg8 = QVariant(), - const QVariant &arg9 = QVariant(), const QVariant &arg10 = QVariant()); + const QVariant &arg9 = QVariant(), const QVariant &arg10 = QVariant()) override; }; #endif // DAPGETLISTWALLETSCOMMAND_H -- GitLab