@@ -20,6 +20,7 @@ NodeModel::NodeModel(interfaces::Node& node)
2020 : m_node{node}
2121{
2222 ConnectToBlockTipSignal ();
23+ ConnectToHeaderTipSignal ();
2324 ConnectToNumConnectionsChangedSignal ();
2425}
2526
@@ -39,6 +40,47 @@ void NodeModel::setNumOutboundPeers(int new_num)
3940 }
4041}
4142
43+ void NodeModel::setInHeaderSync (bool new_in_header_sync)
44+ {
45+ if (new_in_header_sync != m_in_header_sync) {
46+ m_in_header_sync = new_in_header_sync;
47+ Q_EMIT inHeaderSyncChanged ();
48+ }
49+ }
50+
51+ void NodeModel::setHeaderSyncProgress (int64_t header_height, const QDateTime& block_date)
52+ {
53+ int estimated_headers_left = block_date.secsTo (QDateTime::currentDateTime ()) / Params ().GetConsensus ().nPowTargetSpacing ;
54+ double new_header_sync_progress = (100.0 / (header_height + estimated_headers_left) * header_height) / 10000 ;
55+
56+ if (new_header_sync_progress != m_header_sync_progress) {
57+ m_header_sync_progress = new_header_sync_progress;
58+ setVerificationProgress (0.0 );
59+ Q_EMIT headerSyncProgressChanged ();
60+ }
61+ }
62+
63+ void NodeModel::setInPreHeaderSync (bool new_in_pre_header_sync)
64+ {
65+ if (new_in_pre_header_sync != m_in_pre_header_sync) {
66+ m_in_pre_header_sync = new_in_pre_header_sync;
67+ Q_EMIT inPreHeaderSyncChanged ();
68+ }
69+ }
70+
71+ void NodeModel::setPreHeaderSyncProgress (int64_t header_height, const QDateTime& block_date)
72+ {
73+ int estimated_headers_left = block_date.secsTo (QDateTime::currentDateTime ()) / Params ().GetConsensus ().nPowTargetSpacing ;
74+ double new_pre_header_sync_progress = (100.0 / (header_height + estimated_headers_left) * header_height) / 10000 ;
75+
76+ if (new_pre_header_sync_progress != m_pre_header_sync_progress) {
77+ m_pre_header_sync_progress = new_pre_header_sync_progress;
78+ setVerificationProgress (0.0 );
79+ Q_EMIT preHeaderSyncProgressChanged ();
80+
81+ }
82+ }
83+
4284void NodeModel::setRemainingSyncTime (double new_progress)
4385{
4486 int currentTime = QDateTime::currentDateTime ().toMSecsSinceEpoch ();
@@ -74,12 +116,19 @@ void NodeModel::setRemainingSyncTime(double new_progress)
74116 }
75117 }
76118}
119+
77120void NodeModel::setVerificationProgress (double new_progress)
78121{
79- if (new_progress != m_verification_progress) {
80- setRemainingSyncTime (new_progress);
122+ double header_progress = m_header_sync_progress + m_pre_header_sync_progress;
123+ if (!m_in_header_sync && !m_in_pre_header_sync) {
124+ if (new_progress != m_verification_progress) {
125+ setRemainingSyncTime (new_progress);
81126
82- m_verification_progress = new_progress;
127+ m_verification_progress = header_progress + (new_progress - header_progress);
128+ Q_EMIT verificationProgressChanged ();
129+ }
130+ } else {
131+ m_verification_progress = header_progress;
83132 Q_EMIT verificationProgressChanged ();
84133 }
85134}
@@ -135,12 +184,33 @@ void NodeModel::ConnectToBlockTipSignal()
135184 QMetaObject::invokeMethod (this , [=] {
136185 setBlockTipHeight (tip.block_height );
137186 setVerificationProgress (verification_progress);
138-
187+ setInHeaderSync (false );
188+ setInPreHeaderSync (false );
139189 Q_EMIT setTimeRatioList (tip.block_time );
140190 });
141191 });
142192}
143193
194+ void NodeModel::ConnectToHeaderTipSignal ()
195+ {
196+ assert (!m_handler_notify_header_tip);
197+
198+ m_handler_notify_header_tip = m_node.handleNotifyHeaderTip (
199+ [this ](SynchronizationState sync_state, interfaces::BlockTip tip, bool presync) {
200+ QMetaObject::invokeMethod (this , [=] {
201+ if (presync) {
202+ setInHeaderSync (false );
203+ setInPreHeaderSync (true );
204+ setPreHeaderSyncProgress (tip.block_height , QDateTime::fromSecsSinceEpoch (tip.block_time ));
205+ } else {
206+ setInHeaderSync (true );
207+ setInPreHeaderSync (false );
208+ setHeaderSyncProgress (tip.block_height , QDateTime::fromSecsSinceEpoch (tip.block_time ));
209+ }
210+ });
211+ });
212+ }
213+
144214void NodeModel::ConnectToNumConnectionsChangedSignal ()
145215{
146216 assert (!m_handler_notify_num_peers_changed);
0 commit comments