#pragma once #pragma GCC diagnostic ignored "-Wunknown-pragmas" #include #include #include #include #include #include #include #include #include #include #include #include using boost::multi_index_container; using namespace boost::multi_index; Q_DECLARE_METATYPE(std::function) class Crypto { Q_GADGET public: Q_INVOKABLE QString sha256(QByteArray data) { return QCryptographicHash::hash(data, QCryptographicHash::Sha256).toHex(); } }; QML_DECLARE_TYPE(Crypto) class Asset : public QObject { Q_OBJECT Q_PROPERTY(QString symbol MEMBER symbol) Q_PROPERTY(qint64 id MEMBER id) Q_PROPERTY(quint8 precision MEMBER precision) QString symbol; qint64 id; quint8 precision; }; class Balance : public QObject { Q_OBJECT Q_PROPERTY(Asset* type MEMBER type) Q_PROPERTY(qint64 amount MEMBER amount) Q_PROPERTY(qint64 id MEMBER id) Asset* type; qint64 amount; qint64 id; }; class Account : public QObject { Q_OBJECT Q_PROPERTY(QString accountName MEMBER accountName NOTIFY accountNameChanged) Q_PROPERTY(qint64 id MEMBER id NOTIFY idChanged) Q_PROPERTY(QQmlListProperty balances READ balances) QString accountName; qint64 id; QList m_balances; public: Account(QObject* parent = nullptr) : QObject(parent){} const QString& getAccountName()const { return accountName; } qint64 getId()const { return id; } std::string name()const { return accountName.toStdString(); } QQmlListProperty balances(); signals: void accountNameChanged(); void idChanged(); }; struct by_id; struct by_account_name; /** * @ingroup object_index */ typedef multi_index_container< Account*, indexed_by< hashed_unique< tag, const_mem_fun >, hashed_unique< tag, const_mem_fun > // ordered_non_unique< tag, const_mem_fun > > > account_multi_index_type; class ChainDataModel : public QObject { Q_OBJECT public: Q_INVOKABLE Account* getAccount(qint64 id); Q_INVOKABLE Account* getAccount(QString name); ChainDataModel(){} ChainDataModel( fc::thread& t, QObject* parent = nullptr ); void setDatabaseAPI( fc::api dbapi ){ m_db_api = dbapi; } Q_SIGNALS: void queueExecute( const std::function& ); void exceptionThrown( QString message ); private: fc::thread* m_thread = nullptr; std::string m_api_url; fc::api m_db_api; qint64 m_account_query_num = -1; account_multi_index_type m_accounts; }; class GrapheneApplication : public QObject { Q_OBJECT Q_PROPERTY(ChainDataModel* model READ model CONSTANT) Q_PROPERTY(bool isConnected READ isConnected NOTIFY isConnectedChanged) fc::thread m_thread; ChainDataModel* m_model = nullptr; bool m_isConnected = false; std::shared_ptr m_client; fc::future m_done; void setIsConnected( bool v ); Q_SLOT void execute( const std::function& )const; public: GrapheneApplication( QObject* parent = nullptr ); ~GrapheneApplication(); ChainDataModel* model() const { return m_model; } Q_INVOKABLE void start(QString apiUrl, QString user, QString pass ); bool isConnected() const { return m_isConnected; } Q_SIGNALS: void exceptionThrown( QString message ); void loginFailed(); void isConnectedChanged(bool isConnected); void queueExecute( const std::function& ); };