diff --git a/src/qt/bitcoin.h b/src/qt/bitcoin.h --- a/src/qt/bitcoin.h +++ b/src/qt/bitcoin.h @@ -14,6 +14,8 @@ #include #include +#include + class BitcoinGUI; class ClientModel; class Config; @@ -27,11 +29,6 @@ class WalletController; class WalletModel; -namespace interfaces { -class Handler; -class Node; -} // namespace interfaces - /** * Class encapsulating Bitcoin ABC startup and shutdown. * Allows running startup and shutdown in a different thread from the UI thread. @@ -47,7 +44,8 @@ void shutdown(); Q_SIGNALS: - void initializeResult(bool success); + void initializeResult(bool success, + interfaces::BlockAndHeaderTipInfo tip_info); void shutdownResult(); void runawayException(const QString &message); @@ -105,7 +103,8 @@ void setNode(interfaces::Node &node); public Q_SLOTS: - void initializeResult(bool success); + void initializeResult(bool success, + interfaces::BlockAndHeaderTipInfo tip_info); void shutdownResult(); /// Handle runaway exceptions. Shows a message box with the problem and /// quits the program. diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp --- a/src/qt/bitcoin.cpp +++ b/src/qt/bitcoin.cpp @@ -84,6 +84,8 @@ qRegisterMetaType>("std::function"); qRegisterMetaType("QMessageBox::Icon"); + qRegisterMetaType( + "interfaces::BlockAndHeaderTipInfo"); // Need to register any types Qt doesn't know about if you intend // to use them with the signal/slot mechanism Qt provides. Even pointers. @@ -185,9 +187,11 @@ try { qDebug() << __func__ << ": Running initialization in thread"; util::ThreadRename("qt-init"); - bool rv = - m_node.appInitMain(*config, *rpcServer, *httpRPCRequestProcessor); - Q_EMIT initializeResult(rv); + + interfaces::BlockAndHeaderTipInfo tip_info; + bool rv = m_node.appInitMain(*config, *rpcServer, + *httpRPCRequestProcessor, &tip_info); + Q_EMIT initializeResult(rv, tip_info); } catch (const std::exception &e) { handleRunawayException(&e); } catch (...) { @@ -389,7 +393,8 @@ Q_EMIT requestedShutdown(); } -void BitcoinApplication::initializeResult(bool success) { +void BitcoinApplication::initializeResult( + bool success, interfaces::BlockAndHeaderTipInfo tip_info) { qDebug() << __func__ << ": Initialization result: " << success; returnValue = success ? EXIT_SUCCESS : EXIT_FAILURE; if (!success) { @@ -403,7 +408,7 @@ // guaranteed complete. qInfo() << "Platform customization:" << platformStyle->getName(); clientModel = new ClientModel(node(), optionsModel); - window->setClientModel(clientModel); + window->setClientModel(clientModel, &tip_info); #ifdef ENABLE_WALLET if (WalletModel::isWalletEnabled()) { m_wallet_controller = diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h --- a/src/qt/bitcoingui.h +++ b/src/qt/bitcoingui.h @@ -44,6 +44,7 @@ namespace interfaces { class Handler; class Node; +struct BlockAndHeaderTipInfo; } // namespace interfaces QT_BEGIN_NAMESPACE @@ -81,7 +82,8 @@ * The client model represents the part of the core that communicates with * the P2P network, and is wallet-agnostic. */ - void setClientModel(ClientModel *clientModel); + void setClientModel(ClientModel *clientModel = nullptr, + interfaces::BlockAndHeaderTipInfo *tip_info = nullptr); #ifdef ENABLE_WALLET void setWalletController(WalletController *wallet_controller); #endif diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -633,7 +633,8 @@ } } -void BitcoinGUI::setClientModel(ClientModel *_clientModel) { +void BitcoinGUI::setClientModel(ClientModel *_clientModel, + interfaces::BlockAndHeaderTipInfo *tip_info) { this->clientModel = _clientModel; if (_clientModel) { // Create system tray menu (or setup the dock menu) that late to prevent @@ -648,11 +649,11 @@ &BitcoinGUI::setNetworkActive); modalOverlay->setKnownBestHeight( - _clientModel->getHeaderTipHeight(), - QDateTime::fromTime_t(_clientModel->getHeaderTipTime())); - setNumBlocks(m_node.getNumBlocks(), - QDateTime::fromTime_t(m_node.getLastBlockTime()), - m_node.getVerificationProgress(), false, + tip_info->header_height, + QDateTime::fromTime_t(tip_info->header_time)); + setNumBlocks(tip_info->block_height, + QDateTime::fromTime_t(tip_info->block_time), + tip_info->verification_progress, false, SynchronizationState::INIT_DOWNLOAD); connect(_clientModel, &ClientModel::numBlocksChanged, this, &BitcoinGUI::setNumBlocks); @@ -668,7 +669,9 @@ connect(_clientModel, &ClientModel::showProgress, this, &BitcoinGUI::showProgress); - rpcConsole->setClientModel(_clientModel); + rpcConsole->setClientModel(_clientModel, tip_info->block_height, + tip_info->block_time, + tip_info->verification_progress); updateProxyIcon(); diff --git a/src/qt/test/apptests.cpp b/src/qt/test/apptests.cpp --- a/src/qt/test/apptests.cpp +++ b/src/qt/test/apptests.cpp @@ -81,6 +81,8 @@ return GetDataDir() / "blocks"; }()); + qRegisterMetaType( + "interfaces::BlockAndHeaderTipInfo"); m_app.parameterSetup(); m_app.createOptionsModel(true /* reset settings */); QScopedPointer style(