1
+ // Copyright (c) 2023-present The Bitcoin Core developers
2
+ // Distributed under the MIT software license, see the accompanying
3
+ // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
+
5
+ import QtQuick 2.15
6
+ import QtQuick.Controls 2.15
7
+ import QtQuick.Layouts 1.15
8
+ import QtQuick.Dialogs 1.3
9
+
10
+ import "../controls"
11
+ import "../controls/utils.js" as Utils
12
+
13
+
14
+ ColumnLayout {
15
+ id: columnLayout
16
+ signal back
17
+ property bool onboarding: false
18
+ property bool generateSnapshot: false
19
+ property string selectedFile: " "
20
+ property bool snapshotGenerating: nodeModel .snapshotGenerating
21
+ property bool isPruned: optionsModel .prune
22
+ property bool isIBDCompleted: nodeModel .isIBDCompleted
23
+ property bool isSnapshotGenerated: nodeModel .isSnapshotGenerated
24
+ property var snapshotInfo: ( isSnapshotGenerated || isIBDCompleted ) ? chainModel .getSnapshotInfo () : ({})
25
+ property bool isRewinding: nodeModel .isRewinding
26
+
27
+
28
+ width: Math .min (parent .width , 450 )
29
+ anchors .horizontalCenter : parent .horizontalCenter
30
+
31
+ StackLayout {
32
+ id: genSettingsStack
33
+ currentIndex: snapshotGenerating ? 1 : isSnapshotGenerated ? 2 : generateSnapshot ? 0 : onboarding ? 0 : 0
34
+
35
+ ColumnLayout {
36
+ // index: 0
37
+ Layout .alignment : Qt .AlignHCenter
38
+ Layout .preferredWidth : Math .min (parent .width , 450 )
39
+
40
+ Image {
41
+ Layout .alignment : Qt .AlignCenter
42
+ source: " image://images/circle-file"
43
+ sourceSize .width : 200
44
+ sourceSize .height : 200
45
+ }
46
+
47
+ Header {
48
+ Layout .fillWidth : true
49
+ Layout .topMargin : 20
50
+ headerBold: true
51
+ header: qsTr (" Generate snapshot" )
52
+ descriptionBold: false
53
+ descriptionColor: Theme .color .neutral6
54
+ descriptionSize: 17
55
+ descriptionLineHeight: 1.1
56
+ description: isPruned
57
+ ? qsTr (" A snapshot captures the state of the bitcoin network up to a certain date in the recent past. " +
58
+ " It can be imported into other bitcoin nodes to speed up the initial setup.\n\n " )
59
+ : isIBDCompleted
60
+ ? qsTr (" A snapshot captures the state of the bitcoin network up to a certain date in the recent past. " +
61
+ " It can be imported into other bitcoin nodes to speed up the initial setup.\n\n " +
62
+ " You can generate a snapshot at block height %1 and date %2." ).arg (snapshotInfo[" height" ]).arg (snapshotInfo[" date" ])
63
+ : qsTr (" A snapshot captures the state of the bitcoin network up to a certain date in the recent past. " +
64
+ " It can be imported into other bitcoin nodes to speed up the initial setup.\n\n " +
65
+ " Snapshot generation is available once the initial block download is complete." )
66
+ }
67
+
68
+ CoreText {
69
+ Layout .fillWidth : true
70
+ // Layout.topMargin: 20
71
+ color: Theme .color .red
72
+ font .pixelSize : 17
73
+ visible: isPruned
74
+ text: isPruned
75
+ ? qsTr (" Cannot generate snapshot when pruning is enabled" )
76
+ : qsTr (" " )
77
+ }
78
+
79
+ ContinueButton {
80
+ Layout .preferredWidth : Math .min (300 , columnLayout .width - 2 * Layout .leftMargin )
81
+ Layout .topMargin : 40
82
+ Layout .alignment : Qt .AlignCenter
83
+ text: qsTr (" Generate" )
84
+ enabled: ! isPruned && isIBDCompleted
85
+ onClicked: {
86
+ nodeModel .generateSnapshotThread ()
87
+ }
88
+ }
89
+ }
90
+
91
+ ColumnLayout {
92
+ // index: 1
93
+ Layout .alignment : Qt .AlignHCenter
94
+ Layout .preferredWidth : Math .min (parent .width , 450 )
95
+
96
+ Image {
97
+ Layout .alignment : Qt .AlignCenter
98
+ source: " image://images/circle-file"
99
+ sourceSize .width : 200
100
+ sourceSize .height : 200
101
+ }
102
+
103
+ Header {
104
+ Layout .fillWidth : true
105
+ Layout .topMargin : 20
106
+ headerBold: true
107
+ header: qsTr (" Generating Snapshot" )
108
+ description: isRewinding ? qsTr (" Rewinding...\n This might take a while..." ) : qsTr (" Restoring...\n This might take a while..." )
109
+ }
110
+
111
+ ProgressIndicator {
112
+ id: generatingProgressIndicator
113
+ Layout .topMargin : 20
114
+ width: 200
115
+ height: 20
116
+ progress: nodeModel .snapshotGenerating ? nodeModel .rewindProgress : 0
117
+ Layout .alignment : Qt .AlignCenter
118
+ progressColor: Theme .color .blue
119
+ }
120
+ }
121
+
122
+ ColumnLayout {
123
+ // index: 2
124
+ id: snapshotGeneratedColumn
125
+ Layout .alignment : Qt .AlignHCenter
126
+ Layout .preferredWidth : Math .min (parent .width , 450 )
127
+
128
+ Image {
129
+ Layout .alignment : Qt .AlignCenter
130
+ source: " image://images/circle-green-check"
131
+ sourceSize .width : 60
132
+ sourceSize .height : 60
133
+ }
134
+
135
+ Header {
136
+ Layout .fillWidth : true
137
+ Layout .topMargin : 20
138
+ headerBold: true
139
+ header: qsTr (" Snapshot Generated" )
140
+ descriptionBold: false
141
+ descriptionColor: Theme .color .neutral6
142
+ descriptionSize: 17
143
+ descriptionLineHeight: 1.1
144
+ description: snapshotInfo && snapshotInfo[" date" ] ?
145
+ qsTr (" It contains transactions up to %1." +
146
+ " You can use this snapshot to quickstart other nodes." ).arg (snapshotInfo[" date" ])
147
+ : qsTr (" It contains transactions up to DEBUG. You can use this snapshot to quickstart other nodes." )
148
+ }
149
+
150
+ TextButton {
151
+ Layout .alignment : Qt .AlignCenter
152
+ text: qsTr (" Generate new snapshot" )
153
+ onClicked: {
154
+ nodeModel .generateSnapshotThread ()
155
+ }
156
+ }
157
+
158
+ ContinueButton {
159
+ Layout .preferredWidth : Math .min (300 , columnLayout .width - 2 * Layout .leftMargin )
160
+ Layout .topMargin : 20
161
+ Layout .alignment : Qt .AlignCenter
162
+ text: qsTr (" View file" )
163
+ borderColor: Theme .color .neutral6
164
+ backgroundColor: " transparent"
165
+ onClicked: viewSnapshotFileDialog .open ()
166
+ }
167
+
168
+ FileDialog {
169
+ id: viewSnapshotFileDialog
170
+ folder: nodeModel .getSnapshotDirectory ()
171
+ selectMultiple: false
172
+ selectExisting: true
173
+ nameFilters: [" Snapshot files (*.dat)" , " All files (*)" ]
174
+ }
175
+
176
+ Setting {
177
+ id: snapshotGeneratedViewDetails
178
+ Layout .alignment : Qt .AlignCenter
179
+ header: qsTr (" View details" )
180
+ actionItem: CaretRightIcon {
181
+ id: snapshotGeneratedCaretIcon
182
+ color: snapshotGeneratedViewDetails .stateColor
183
+ rotation: snapshotGeneratedViewDetails .expanded ? 90 : 0
184
+ Behavior on rotation { NumberAnimation { duration: 200 } }
185
+ }
186
+
187
+ property bool expanded: false
188
+
189
+ onClicked: {
190
+ expanded = ! expanded
191
+ }
192
+ }
193
+
194
+ ColumnLayout {
195
+ id: snapshotGeneratedDetailsContent
196
+ visible: snapshotGeneratedViewDetails .expanded
197
+ Layout .preferredWidth : Math .min (300 , parent .width - 2 * Layout .leftMargin )
198
+ Layout .alignment : Qt .AlignCenter
199
+ Layout .leftMargin : 80
200
+ Layout .rightMargin : 80
201
+ Layout .topMargin : 10
202
+ spacing: 10
203
+ // TODO: make sure the block height number aligns right
204
+ RowLayout {
205
+ CoreText {
206
+ text: qsTr (" Block Height:" )
207
+ Layout .alignment : Qt .AlignLeft
208
+ font .pixelSize : 14
209
+ }
210
+ CoreText {
211
+ text: snapshotInfo && snapshotInfo[" height" ] ?
212
+ snapshotInfo[" height" ] : qsTr (" DEBUG" )
213
+ Layout .alignment : Qt .AlignRight
214
+ font .pixelSize : 14
215
+ }
216
+ }
217
+ Separator { Layout .fillWidth : true }
218
+ CoreText {
219
+ text: snapshotInfo && snapshotInfo[" hashSerialized" ] ?
220
+ qsTr (" Hash: %1" ).arg (snapshotInfo[" hashSerialized" ].substring (0 , 13 ) + " ..." ) :
221
+ qsTr (" Hash: DEBUG" )
222
+ font .pixelSize : 14
223
+ }
224
+ }
225
+ }
226
+ }
227
+ }
0 commit comments