Skip to content

Commit c117acc

Browse files
committed
Merge #427: Introduce Signal Based Navigation Model to have Self-Contained Pages
3f94240 qml: rename backClicked signal to back (jarolrod) 7b5f9c1 qml: Use signal based navigation in NodeSettings, don't alias nav elems (jarolrod) a77c7f1 qml: use signal based navigation in CreateWallet pages, introduce wizard (jarolrod) 02a3b25 qml: use signal based navigation in settings with subpages (jarolrod) fad9bd7 qml: signal based navigation in onboarding (jarolrod) Pull request description: Here we introduce a Signal Based navigation model, so that we can have self-contained pages. Self-contained pages include everything they need where they are declared, and do not have more than one definition. This makes pages modular, easier to reason about, but also easier to maintain by eliminating dependencies on hard-coded IDs, direct calls to parent views, and interlinked properties between pages. When we want to reason about `PageA.qml`, we only have to look in there and the child components it uses, and not have to use a search function to ensure we have the entire scope of `PageA.qml`. To Achieve this, this PR implements the following main ideas: 1. Ensure that pages are not hardcoding and reaching into an outside view. 2. Ensure we don't alias down any components into pages, and instead have pages define all their components, but react to state events 3. Ensure we don't have interlinked properties between pages 4. Move navigation and page linking logic from the pages themselves and into the declaration of the view itself. Additionally, while here we structure the CreateWallet flow into a Wizard. **Follow-Ups:** Consider moving onboarding and walletName into more appropriate backend objects. [![Build Artifacts](https://img.shields.io/badge/Build%20Artifacts-green )]() ACKs for top commit: johnny9: ACK 3f94240 MarnixCroes: ACK 3f94240 Tree-SHA512: 134ba2ee3a1b4aec77601ca065cfc690098e6b3695a9bcf8c65498a80e41857fa6f2cf218e9269e9b31c51babb3faa70fd1db35e148dd3dbd261c9359c3212b4
2 parents 88ce525 + 3f94240 commit c117acc

30 files changed

+346
-162
lines changed

Diff for: src/Makefile.qt.include

+1-1
Original file line numberDiff line numberDiff line change
@@ -428,12 +428,12 @@ QML_RES_QML = \
428428
qml/pages/settings/SettingsProxy.qml \
429429
qml/pages/settings/SettingsStorage.qml \
430430
qml/pages/settings/SettingsTheme.qml \
431-
qml/pages/wallet/AddWallet.qml \
432431
qml/pages/wallet/CreateBackup.qml \
433432
qml/pages/wallet/CreateConfirm.qml \
434433
qml/pages/wallet/CreateIntro.qml \
435434
qml/pages/wallet/CreateName.qml \
436435
qml/pages/wallet/CreatePassword.qml \
436+
qml/pages/wallet/CreateWalletWizard.qml \
437437
qml/pages/wallet/DesktopWallets.qml \
438438
qml/pages/wallet/WalletBadge.qml \
439439
qml/pages/wallet/WalletSelect.qml

Diff for: src/qml/bitcoin_qml.qrc

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,12 @@
6868
<file>pages/settings/SettingsProxy.qml</file>
6969
<file>pages/settings/SettingsStorage.qml</file>
7070
<file>pages/settings/SettingsTheme.qml</file>
71-
<file>pages/wallet/AddWallet.qml</file>
7271
<file>pages/wallet/CreateBackup.qml</file>
7372
<file>pages/wallet/CreateConfirm.qml</file>
7473
<file>pages/wallet/CreateIntro.qml</file>
7574
<file>pages/wallet/CreateName.qml</file>
7675
<file>pages/wallet/CreatePassword.qml</file>
76+
<file>pages/wallet/CreateWalletWizard.qml</file>
7777
<file>pages/wallet/DesktopWallets.qml</file>
7878
<file>pages/wallet/WalletBadge.qml</file>
7979
<file>pages/wallet/WalletSelect.qml</file>

Diff for: src/qml/components/AboutOptions.qml

+3-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import QtQuick.Layouts 1.15
88
import "../controls"
99

1010
ColumnLayout {
11+
id: root
12+
signal next
1113
spacing: 4
1214
Setting {
1315
id: websiteLink
@@ -69,7 +71,7 @@ ColumnLayout {
6971
color: gotoDeveloper.stateColor
7072
}
7173
onClicked: {
72-
aboutSwipe.incrementCurrentIndex()
74+
root.next()
7375
}
7476
}
7577
ExternalPopup {

Diff for: src/qml/components/ConnectionSettings.qml

+3-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import QtQuick.Layouts 1.15
88
import "../controls"
99

1010
ColumnLayout {
11+
id: root
12+
signal next
1113
spacing: 4
1214
Setting {
1315
Layout.fillWidth: true
@@ -69,6 +71,6 @@ ColumnLayout {
6971
actionItem: CaretRightIcon {
7072
color: gotoProxy.stateColor
7173
}
72-
onClicked: connectionSwipe.incrementCurrentIndex()
74+
onClicked: root.next()
7375
}
7476
}

Diff for: src/qml/controls/InformationPage.qml

+3-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import org.bitcoincore.qt 1.0
99

1010
Page {
1111
id: root
12+
signal back
13+
signal next
1214
implicitHeight: information.height + continueButton.height + buttonMargin
1315
property alias bannerItem: banner_loader.sourceComponent
1416
property alias detailItem: detail_loader.sourceComponent
@@ -106,7 +108,7 @@ Page {
106108
anchors.rightMargin: 20
107109
anchors.horizontalCenter: parent.horizontalCenter
108110
text: root.buttonText
109-
onClicked: root.lastPage ? swipeView.finished = true : swipeView.incrementCurrentIndex()
111+
onClicked: root.next()
110112
}
111113
}
112114

Diff for: src/qml/pages/main.qml

+26-9
Original file line numberDiff line numberDiff line change
@@ -70,18 +70,35 @@ ApplicationWindow {
7070
property bool finished: false
7171
interactive: false
7272

73-
OnboardingCover {}
74-
OnboardingStrengthen {}
75-
OnboardingBlockclock {}
76-
OnboardingStorageLocation {}
77-
OnboardingStorageAmount {}
78-
OnboardingConnection {}
73+
OnboardingCover {
74+
onNext: swipeView.incrementCurrentIndex()
75+
}
76+
OnboardingStrengthen {
77+
onBack: swipeView.decrementCurrentIndex()
78+
onNext: swipeView.incrementCurrentIndex()
79+
}
80+
OnboardingBlockclock {
81+
onBack: swipeView.decrementCurrentIndex()
82+
onNext: swipeView.incrementCurrentIndex()
83+
}
84+
OnboardingStorageLocation {
85+
onBack: swipeView.decrementCurrentIndex()
86+
onNext: swipeView.incrementCurrentIndex()
87+
}
88+
OnboardingStorageAmount {
89+
onBack: swipeView.decrementCurrentIndex()
90+
onNext: swipeView.incrementCurrentIndex()
91+
}
92+
OnboardingConnection {
93+
onBack: swipeView.decrementCurrentIndex()
94+
onNext: swipeView.finished = true
95+
}
7996

8097
onFinishedChanged: {
8198
optionsModel.onboard()
8299
if (AppMode.walletEnabled && AppMode.isDesktop) {
83100
main.push(desktopWallets)
84-
main.push(addWallet)
101+
main.push(createWalletWizard)
85102
} else {
86103
main.push(node)
87104
}
@@ -95,8 +112,8 @@ ApplicationWindow {
95112
}
96113

97114
Component {
98-
id: addWallet
99-
AddWallet {
115+
id: createWalletWizard
116+
CreateWalletWizard {
100117
onFinished: {
101118
main.pop()
102119
}

Diff for: src/qml/pages/node/NetworkTraffic.qml

+10-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,16 @@ InformationPage {
1919
id: settings
2020
property alias trafficGraphScale: root.trafficGraphScale
2121
}
22-
22+
navLeftDetail: NavButton {
23+
iconSource: "image://images/caret-left"
24+
text: qsTr("Back")
25+
onClicked: root.back()
26+
}
27+
navMiddleDetail: Header {
28+
headerBold: true
29+
headerSize: 18
30+
header: qsTr("Network traffic")
31+
}
2332
bannerActive: false
2433
bold: true
2534
headerText: qsTr("Network Traffic")

Diff for: src/qml/pages/node/NodeSettings.qml

+7-59
Original file line numberDiff line numberDiff line change
@@ -122,74 +122,33 @@ Item {
122122
Component {
123123
id: about_page
124124
SettingsAbout {
125-
showHeader: false
126-
navLeftDetail: NavButton {
127-
iconSource: "image://images/caret-left"
128-
text: qsTr("Back")
129-
onClicked: {
130-
nodeSettingsView.pop()
131-
}
132-
}
133-
navMiddleDetail: Header {
134-
headerBold: true
135-
headerSize: 18
136-
header: qsTr("About")
137-
}
138-
devMiddleDetail: Header {
139-
headerBold: true
140-
headerSize: 18
141-
header: qsTr("Developer settings")
142-
}
125+
onBack: nodeSettingsView.pop()
143126
}
144127
}
145128
Component {
146129
id: display_page
147130
SettingsDisplay {
148-
onBackClicked: {
131+
onBack: {
149132
nodeSettingsView.pop()
150133
}
151134
}
152135
}
153136
Component {
154137
id: storage_page
155138
SettingsStorage {
156-
showHeader: false
157-
navLeftDetail: NavButton {
158-
iconSource: "image://images/caret-left"
159-
text: qsTr("Back")
160-
onClicked: {
161-
nodeSettingsView.pop()
162-
}
163-
}
164-
navMiddleDetail: Header {
165-
headerBold: true
166-
headerSize: 18
167-
header: qsTr("Storage settings")
168-
}
139+
onBack: nodeSettingsView.pop()
169140
}
170141
}
171142
Component {
172143
id: connection_page
173144
SettingsConnection {
174-
showHeader: false
175-
navLeftDetail: NavButton {
176-
iconSource: "image://images/caret-left"
177-
text: qsTr("Back")
178-
onClicked: {
179-
nodeSettingsView.pop()
180-
}
181-
}
182-
navMiddleDetail: Header {
183-
headerBold: true
184-
headerSize: 18
185-
header: qsTr("Connection settings")
186-
}
145+
onBack: nodeSettingsView.pop()
187146
}
188147
}
189148
Component {
190149
id: peers_page
191150
Peers {
192-
onBackClicked: {
151+
onBack: {
193152
nodeSettingsView.pop()
194153
peerTableModel.stopAutoRefresh();
195154
}
@@ -201,7 +160,7 @@ Item {
201160
Component {
202161
id: peer_details
203162
PeerDetails {
204-
onBackClicked: {
163+
onBack: {
205164
nodeSettingsView.pop()
206165
}
207166
}
@@ -210,18 +169,7 @@ Item {
210169
id: networktraffic_page
211170
NetworkTraffic {
212171
showHeader: false
213-
navLeftDetail: NavButton {
214-
iconSource: "image://images/caret-left"
215-
text: qsTr("Back")
216-
onClicked: {
217-
nodeSettingsView.pop()
218-
}
219-
}
220-
navMiddleDetail: Header {
221-
headerBold: true
222-
headerSize: 18
223-
header: qsTr("Network traffic")
224-
}
172+
onBack: nodeSettingsView.pop()
225173
}
226174
}
227175
}

Diff for: src/qml/pages/node/PeerDetails.qml

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ import "../../components"
1111

1212
Page {
1313
id: root
14-
signal backClicked()
14+
signal back()
1515

1616
property PeerDetailsModel details
1717

1818
Connections {
1919
target: details
2020
function onDisconnected() {
21-
root.backClicked()
21+
root.back()
2222
}
2323
}
2424

@@ -27,7 +27,7 @@ Page {
2727
leftItem: NavButton {
2828
iconSource: "image://images/caret-left"
2929
text: qsTr("Back")
30-
onClicked: root.backClicked()
30+
onClicked: root.back()
3131
}
3232
centerItem: Header {
3333
headerBold: true

Diff for: src/qml/pages/node/Peers.qml

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import "../../controls"
1111
import "../../components"
1212

1313
Page {
14-
signal backClicked
14+
signal back
1515
signal peerSelected(PeerDetailsModel peerDetails)
1616

1717
id: root
@@ -21,7 +21,7 @@ Page {
2121
leftItem: NavButton {
2222
iconSource: "image://images/caret-left"
2323
text: qsTr("Back")
24-
onClicked: root.backClicked()
24+
onClicked: root.back()
2525
}
2626
centerItem: Header {
2727
headerBold: true

Diff for: src/qml/pages/onboarding/OnboardingBlockclock.qml

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ import QtQuick.Layouts 1.15
88
import "../../controls"
99

1010
InformationPage {
11+
id: root
1112
navLeftDetail: NavButton {
1213
iconSource: "image://images/caret-left"
1314
text: qsTr("Back")
14-
onClicked: swipeView.decrementCurrentIndex()
15+
onClicked: root.back()
1516
}
1617
bannerItem: Image {
1718
source: Theme.image.blocktime

Diff for: src/qml/pages/onboarding/OnboardingConnection.qml

+7-7
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ import "../../components"
1010
import "../settings"
1111

1212
Page {
13+
id: root
14+
signal back
15+
signal next
1316
background: null
1417
clip: true
1518
SwipeView {
@@ -21,7 +24,7 @@ Page {
2124
navLeftDetail: NavButton {
2225
iconSource: "image://images/caret-left"
2326
text: qsTr("Back")
24-
onClicked: swipeView.decrementCurrentIndex()
27+
onClicked: root.back()
2528
}
2629
bannerItem: Image {
2730
Layout.topMargin: 20
@@ -47,14 +50,11 @@ Page {
4750
lastPage: true
4851
buttonText: qsTr("Next")
4952
buttonMargin: 20
53+
onNext: root.next()
5054
}
5155
SettingsConnection {
52-
navRightDetail: NavButton {
53-
text: qsTr("Done")
54-
onClicked: {
55-
connections.decrementCurrentIndex()
56-
}
57-
}
56+
onboarding: true
57+
onBack: connections.decrementCurrentIndex()
5858
}
5959
}
6060
}

Diff for: src/qml/pages/onboarding/OnboardingCover.qml

+5-7
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import "../../components"
1010
import "../settings"
1111

1212
Page {
13+
id: root
14+
signal next
1315
background: null
1416
clip: true
1517
SwipeView {
@@ -48,15 +50,11 @@ Page {
4850
descriptionSize: 24
4951
subtext: qsTr("100% open-source & open-design")
5052
buttonText: qsTr("Start")
53+
onNext: root.next()
5154
}
5255
SettingsAbout {
53-
navLeftDetail: NavButton {
54-
iconSource: "image://images/caret-left"
55-
text: qsTr("Back")
56-
onClicked: {
57-
introductions.decrementCurrentIndex()
58-
}
59-
}
56+
onboarding: true
57+
onBack: introductions.decrementCurrentIndex()
6058
}
6159
}
6260
}

0 commit comments

Comments
 (0)