Skip to content

Commit 4b2243c

Browse files
Merge pull request #291 from KovalevAndrey/dfs-for-selecting-nodes
Use dfs for selecting nodes in sample app
2 parents d940452 + 484dc25 commit 4b2243c

1 file changed

Lines changed: 47 additions & 33 deletions

File tree

samples/app/src/main/kotlin/com/bumble/appyx/app/node/slideshow/slide/modeldriven/ComposableNavigation.kt

Lines changed: 47 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -74,16 +74,51 @@ class ComposableNavigation(
7474
)
7575
)
7676

77+
private fun deselect(node: GraphNode) {
78+
node.isActive.value = false
79+
for (child in node.children()) {
80+
deselect(child)
81+
}
82+
}
83+
84+
private fun deselectAllNodes() {
85+
deselect(root)
86+
}
87+
88+
private fun selectNode(
89+
currentNode: GraphNode,
90+
targetNode: GraphNode,
91+
pathToNode: List<GraphNode>
92+
) {
93+
if (currentNode == targetNode) {
94+
currentNode.isActive.value = true
95+
pathToNode.forEach {
96+
it.isActive.value = true
97+
}
98+
return
99+
} else {
100+
for (child in currentNode.children()) {
101+
selectNode(child, targetNode, pathToNode + child)
102+
}
103+
}
104+
105+
}
106+
107+
private fun selectNode(nodeToSelect: GraphNode) {
108+
deselectAllNodes()
109+
selectNode(root, nodeToSelect, emptyList())
110+
}
111+
77112
@SuppressWarnings("LongMethod")
78113
@Composable
79114
override fun View(modifier: Modifier) {
80115
Page(
81116
modifier = modifier,
82117
title = "Composable",
83118
body = "With Appyx, navigation itself is composable, too.\n" +
84-
"\n" +
85-
"You can represent your app as a hierarchy of Nodes – " +
86-
"each with their own UI, lifecycle and their own NavModels."
119+
"\n" +
120+
"You can represent your app as a hierarchy of Nodes – " +
121+
"each with their own UI, lifecycle and their own NavModels."
87122
) {
88123
Column(
89124
modifier = Modifier
@@ -101,48 +136,27 @@ class ComposableNavigation(
101136
val intervalDelay: Long = 1600
102137

103138
while (true) {
104-
root.isActive.value = false
105-
onboarding.isActive.value = false
106-
o1.isActive.value = false
107-
o2.isActive.value = false
108-
o3.isActive.value = false
109-
main.isActive.value = false
110-
settings.isActive.value = false
111-
profile.isActive.value = false
112-
messages.isActive.value = false
113-
people.isActive.value = false
114-
chat.isActive.value = false
115139

116140
delay(startDelay)
117-
root.isActive.value = true
118-
onboarding.isActive.value = true
119-
o1.isActive.value = true
141+
selectNode(o1)
142+
120143
delay(intervalDelay)
121-
o1.isActive.value = false
122-
o2.isActive.value = true
144+
selectNode(o2)
145+
123146
delay(intervalDelay)
124-
o2.isActive.value = false
125-
o3.isActive.value = true
147+
selectNode(o3)
126148

127149
delay(intervalDelay)
128-
o3.isActive.value = false
129-
onboarding.isActive.value = false
130-
main.isActive.value = true
131-
profile.isActive.value = true
150+
selectNode(profile)
132151

133152
delay(intervalDelay)
134-
profile.isActive.value = false
135-
messages.isActive.value = true
136-
people.isActive.value = true
153+
selectNode(people)
137154

138155
delay(intervalDelay)
139-
people.isActive.value = false
140-
chat.isActive.value = true
156+
selectNode(chat)
141157

142158
delay(intervalDelay)
143-
messages.isActive.value = false
144-
chat.isActive.value = false
145-
settings.isActive.value = true
159+
selectNode(settings)
146160

147161
delay(intervalDelay * 2)
148162
}

0 commit comments

Comments
 (0)