From b6280a9c022ae5ac0c5c093ab77d86fd5bbbc652 Mon Sep 17 00:00:00 2001 From: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com> Date: Sun, 29 Aug 2021 08:25:52 +0300 Subject: [PATCH 1/4] qml: Add blockTipHeight property to NodeModel, and expose it to QML --- src/qml/nodemodel.cpp | 8 +++++++- src/qml/nodemodel.h | 9 +++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/qml/nodemodel.cpp b/src/qml/nodemodel.cpp index 2111900503..a8d9c47e68 100644 --- a/src/qml/nodemodel.cpp +++ b/src/qml/nodemodel.cpp @@ -4,7 +4,13 @@ #include -#include +void NodeModel::setBlockTipHeight(int new_height) +{ + if (new_height != m_block_tip_height) { + m_block_tip_height = new_height; + Q_EMIT blockTipHeightChanged(); + } +} void NodeModel::startNodeInitializionThread() { diff --git a/src/qml/nodemodel.h b/src/qml/nodemodel.h index 9daed8e51a..91555c4ef4 100644 --- a/src/qml/nodemodel.h +++ b/src/qml/nodemodel.h @@ -11,14 +11,23 @@ class NodeModel : public QObject { Q_OBJECT + Q_PROPERTY(int blockTipHeight READ blockTipHeight NOTIFY blockTipHeightChanged) public: + int blockTipHeight() const { return m_block_tip_height; } + void setBlockTipHeight(int new_height); + Q_INVOKABLE void startNodeInitializionThread(); void startNodeShutdown(); Q_SIGNALS: + void blockTipHeightChanged(); void requestedInitialize(); void requestedShutdown(); + +private: + // Properties that are exposed to QML. + int m_block_tip_height{0}; }; #endif // BITCOIN_QML_NODEMODEL_H From 1441d5be79f161e7864bf5493b5ed68c51731eec Mon Sep 17 00:00:00 2001 From: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com> Date: Sun, 29 Aug 2021 09:22:51 +0300 Subject: [PATCH 2/4] qml: Add BlockCounter QML component prototype --- src/qml/bitcoin_qml.qrc | 1 + src/qml/components/BlockCounter.qml | 21 +++++++++++++++++++++ src/qml/pages/stub.qml | 11 ++++++++++- 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 src/qml/components/BlockCounter.qml diff --git a/src/qml/bitcoin_qml.qrc b/src/qml/bitcoin_qml.qrc index 172301459e..f6e1e4fa6e 100644 --- a/src/qml/bitcoin_qml.qrc +++ b/src/qml/bitcoin_qml.qrc @@ -1,5 +1,6 @@ + components/BlockCounter.qml pages/initerrormessage.qml pages/stub.qml diff --git a/src/qml/components/BlockCounter.qml b/src/qml/components/BlockCounter.qml new file mode 100644 index 0000000000..e23ba7b72d --- /dev/null +++ b/src/qml/components/BlockCounter.qml @@ -0,0 +1,21 @@ +// Copyright (c) 2021 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +// The BlockCounter component. + +import QtQuick 2.12 +import QtQuick.Controls 2.12 + +Label { + property int blockHeight: 0 + background: Rectangle { + color: "black" + } + color: "orange" + padding: 16 + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + font.pixelSize: height / 3 + text: blockHeight +} diff --git a/src/qml/pages/stub.qml b/src/qml/pages/stub.qml index 2c651737a4..ee30cb735f 100644 --- a/src/qml/pages/stub.qml +++ b/src/qml/pages/stub.qml @@ -2,8 +2,10 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -import QtQml 2.12 +import QtQuick 2.12 import QtQuick.Controls 2.12 +import "../components" as BitcoinCoreComponents + ApplicationWindow { id: appWindow @@ -13,4 +15,11 @@ ApplicationWindow { visible: true Component.onCompleted: nodeModel.startNodeInitializionThread(); + + BitcoinCoreComponents.BlockCounter { + id: blockCounter + anchors.centerIn: parent + height: parent.height / 3 + blockHeight: nodeModel.blockTipHeight + } } From 219088dcd6703141f2834e0d3b1e80f66fe034bd Mon Sep 17 00:00:00 2001 From: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com> Date: Sun, 29 Aug 2021 09:27:38 +0300 Subject: [PATCH 3/4] qml: Pass Node instance to the NodeModel constructor --- src/qml/bitcoin.cpp | 2 +- src/qml/nodemodel.cpp | 7 +++++++ src/qml/nodemodel.h | 8 ++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/qml/bitcoin.cpp b/src/qml/bitcoin.cpp index 593e7bab59..16964d6214 100644 --- a/src/qml/bitcoin.cpp +++ b/src/qml/bitcoin.cpp @@ -127,7 +127,7 @@ int QmlGuiMain(int argc, char* argv[]) handler_message_box.disconnect(); - NodeModel node_model; + NodeModel node_model{*node}; InitExecutor init_executor{*node}; QObject::connect(&node_model, &NodeModel::requestedInitialize, &init_executor, &InitExecutor::initialize); QObject::connect(&node_model, &NodeModel::requestedShutdown, &init_executor, &InitExecutor::shutdown); diff --git a/src/qml/nodemodel.cpp b/src/qml/nodemodel.cpp index a8d9c47e68..b85d33bf80 100644 --- a/src/qml/nodemodel.cpp +++ b/src/qml/nodemodel.cpp @@ -4,6 +4,13 @@ #include +#include + +NodeModel::NodeModel(interfaces::Node& node) + : m_node{node} +{ +} + void NodeModel::setBlockTipHeight(int new_height) { if (new_height != m_block_tip_height) { diff --git a/src/qml/nodemodel.h b/src/qml/nodemodel.h index 91555c4ef4..24ce1a971c 100644 --- a/src/qml/nodemodel.h +++ b/src/qml/nodemodel.h @@ -7,6 +7,10 @@ #include +namespace interfaces { +class Node; +} + /** Model for Bitcoin network client. */ class NodeModel : public QObject { @@ -14,6 +18,8 @@ class NodeModel : public QObject Q_PROPERTY(int blockTipHeight READ blockTipHeight NOTIFY blockTipHeightChanged) public: + explicit NodeModel(interfaces::Node& node); + int blockTipHeight() const { return m_block_tip_height; } void setBlockTipHeight(int new_height); @@ -28,6 +34,8 @@ class NodeModel : public QObject private: // Properties that are exposed to QML. int m_block_tip_height{0}; + + interfaces::Node& m_node; }; #endif // BITCOIN_QML_NODEMODEL_H From 3ead757f60434933a915b0c726e58b419ea8b8c4 Mon Sep 17 00:00:00 2001 From: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com> Date: Sun, 29 Aug 2021 09:29:30 +0300 Subject: [PATCH 4/4] qml: Connect NodeModel to the NotifyBlockTip core signal --- src/qml/bitcoin.cpp | 2 +- src/qml/nodemodel.cpp | 17 +++++++++++++++++ src/qml/nodemodel.h | 11 +++++++++++ src/qt/bitcoin.cpp | 1 - src/qt/main.cpp | 3 +++ 5 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/qml/bitcoin.cpp b/src/qml/bitcoin.cpp index 16964d6214..31bb85aa33 100644 --- a/src/qml/bitcoin.cpp +++ b/src/qml/bitcoin.cpp @@ -131,7 +131,7 @@ int QmlGuiMain(int argc, char* argv[]) InitExecutor init_executor{*node}; QObject::connect(&node_model, &NodeModel::requestedInitialize, &init_executor, &InitExecutor::initialize); QObject::connect(&node_model, &NodeModel::requestedShutdown, &init_executor, &InitExecutor::shutdown); - // QObject::connect(&init_executor, &InitExecutor::initializeResult, &node_model, &NodeModel::initializeResult); + QObject::connect(&init_executor, &InitExecutor::initializeResult, &node_model, &NodeModel::initializeResult); QObject::connect(&init_executor, &InitExecutor::shutdownResult, qGuiApp, &QGuiApplication::quit, Qt::QueuedConnection); // QObject::connect(&init_executor, &InitExecutor::runawayException, &node_model, &NodeModel::handleRunawayException); diff --git a/src/qml/nodemodel.cpp b/src/qml/nodemodel.cpp index b85d33bf80..4ed4612aeb 100644 --- a/src/qml/nodemodel.cpp +++ b/src/qml/nodemodel.cpp @@ -5,10 +5,12 @@ #include #include +#include NodeModel::NodeModel(interfaces::Node& node) : m_node{node} { + ConnectToBlockTipSignal(); } void NodeModel::setBlockTipHeight(int new_height) @@ -28,3 +30,18 @@ void NodeModel::startNodeShutdown() { Q_EMIT requestedShutdown(); } + +void NodeModel::initializeResult([[maybe_unused]] bool success, interfaces::BlockAndHeaderTipInfo tip_info) +{ + // TODO: Handle the `success` parameter, + setBlockTipHeight(tip_info.block_height); +} + +void NodeModel::ConnectToBlockTipSignal() +{ + assert(!m_handler_notify_block_tip); + m_handler_notify_block_tip = m_node.handleNotifyBlockTip( + [this](SynchronizationState state, interfaces::BlockTip tip, double verification_progress) { + setBlockTipHeight(tip.block_height); + }); +} diff --git a/src/qml/nodemodel.h b/src/qml/nodemodel.h index 24ce1a971c..b3190a0199 100644 --- a/src/qml/nodemodel.h +++ b/src/qml/nodemodel.h @@ -5,6 +5,11 @@ #ifndef BITCOIN_QML_NODEMODEL_H #define BITCOIN_QML_NODEMODEL_H +#include +#include + +#include + #include namespace interfaces { @@ -26,6 +31,9 @@ class NodeModel : public QObject Q_INVOKABLE void startNodeInitializionThread(); void startNodeShutdown(); +public Q_SLOTS: + void initializeResult(bool success, interfaces::BlockAndHeaderTipInfo tip_info); + Q_SIGNALS: void blockTipHeightChanged(); void requestedInitialize(); @@ -36,6 +44,9 @@ class NodeModel : public QObject int m_block_tip_height{0}; interfaces::Node& m_node; + std::unique_ptr m_handler_notify_block_tip; + + void ConnectToBlockTipSignal(); }; #endif // BITCOIN_QML_NODEMODEL_H diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp index 7a10729d93..d5f078734e 100644 --- a/src/qt/bitcoin.cpp +++ b/src/qt/bitcoin.cpp @@ -85,7 +85,6 @@ static void RegisterMetaTypes() qRegisterMetaType>("std::function"); qRegisterMetaType("QMessageBox::Icon"); - qRegisterMetaType("interfaces::BlockAndHeaderTipInfo"); } static QString GetLangTerritory() diff --git a/src/qt/main.cpp b/src/qt/main.cpp index 9ef1bbfe0c..b08a2e4709 100644 --- a/src/qt/main.cpp +++ b/src/qt/main.cpp @@ -12,6 +12,7 @@ #include #endif // USE_QML +#include #include #include #include @@ -62,6 +63,8 @@ void DebugMessageHandler(QtMsgType type, const QMessageLogContext& context, cons int main(int argc, char* argv[]) { + qRegisterMetaType("interfaces::BlockAndHeaderTipInfo"); + #ifdef WIN32 util::WinCmdLineArgs win_args; std::tie(argc, argv) = win_args.get();