Skip to content

Commit d85d0ff

Browse files
committed
Add scroll bar functionality to allow indexing different states within trace
1 parent da2da0c commit d85d0ff

File tree

5 files changed

+58
-11
lines changed

5 files changed

+58
-11
lines changed

workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@ package com.squareup.workflow1.traceviewer
22

33
import androidx.compose.foundation.layout.Box
44
import androidx.compose.runtime.Composable
5-
import androidx.compose.runtime.LaunchedEffect
65
import androidx.compose.runtime.getValue
76
import androidx.compose.runtime.mutableIntStateOf
8-
import androidx.compose.runtime.mutableIntStateOf
97
import androidx.compose.runtime.mutableStateOf
108
import androidx.compose.runtime.remember
119
import androidx.compose.runtime.setValue
10+
import androidx.compose.ui.Alignment
1211
import androidx.compose.ui.Modifier
1312
import com.squareup.workflow1.traceviewer.model.WorkflowNode
1413
import com.squareup.workflow1.traceviewer.ui.InfoPanel
1514
import com.squareup.workflow1.traceviewer.ui.RenderDiagram
15+
import com.squareup.workflow1.traceviewer.ui.StateSelectTab
1616
import com.squareup.workflow1.traceviewer.utils.SandboxBackground
1717
import com.squareup.workflow1.traceviewer.utils.UploadFile
1818
import io.github.vinceglb.filekit.PlatformFile
@@ -26,30 +26,34 @@ public fun App(
2626
) {
2727
var selectedFile by remember { mutableStateOf<PlatformFile?>(null) }
2828
var selectedNode by remember { mutableStateOf<WorkflowNode?>(null) }
29+
var workflowTrace by remember { mutableStateOf<List<WorkflowNode>>(emptyList()) }
2930
var snapshotIndex by remember { mutableIntStateOf(0) }
3031

31-
// Used when user selects a new file in [UploadFile]
32-
val resetSelectedNode = { selectedNode = null }
33-
3432
Box {
3533
// Main content
3634
if (selectedFile != null) {
3735
SandboxBackground {
3836
RenderDiagram(
39-
file = selectedFile,
37+
file = selectedFile!!,
4038
traceInd = snapshotIndex,
39+
onFileParse = { workflowTrace = it },
4140
onNodeSelect = { selectedNode = it }
4241
)
4342
}
4443
}
4544

4645
// Top trace selector row
47-
// TraceSelectRow { snapshotIndex.value = it }
46+
StateSelectTab(
47+
trace = workflowTrace,
48+
currentIndex = snapshotIndex,
49+
onIndexChange = { snapshotIndex = it },
50+
modifier = Modifier.align(Alignment.TopCenter)
51+
)
4852

4953
// Left side information panel
5054
InfoPanel(selectedNode)
5155

5256
// Bottom right upload button
53-
UploadFile(resetSelectedNode, { selectedFile = it })
57+
UploadFile(resetSelectedNode = { selectedNode = null }, onFileSelect = { selectedFile = it })
5458
}
5559
}

workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/WorkflowJsonParser.kt

Whitespace-only changes.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.squareup.workflow1.traceviewer.ui
2+
3+
import androidx.compose.foundation.layout.padding
4+
import androidx.compose.foundation.lazy.LazyRow
5+
import androidx.compose.foundation.lazy.rememberLazyListState
6+
import androidx.compose.material.Button
7+
import androidx.compose.material.ButtonDefaults
8+
import androidx.compose.material.Text
9+
import androidx.compose.runtime.Composable
10+
import androidx.compose.ui.Modifier
11+
import androidx.compose.ui.graphics.Color
12+
import androidx.compose.ui.unit.dp
13+
import com.squareup.workflow1.traceviewer.model.WorkflowNode
14+
15+
@Composable
16+
public fun StateSelectTab(
17+
trace: List<WorkflowNode>,
18+
currentIndex: Int,
19+
onIndexChange: (Int) -> Unit,
20+
modifier: Modifier = Modifier
21+
) {
22+
val state = rememberLazyListState()
23+
24+
LazyRow(
25+
modifier = modifier,
26+
state = state
27+
) {
28+
items(trace.size) { index ->
29+
Button(
30+
modifier = Modifier
31+
.padding(10.dp),
32+
onClick = { onIndexChange(index) },
33+
colors = ButtonDefaults.buttonColors(
34+
backgroundColor = if (index == currentIndex) Color.DarkGray else Color.LightGray
35+
)
36+
) {
37+
Text("State ${index + 1}")
38+
}
39+
}
40+
}
41+
}

workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ import androidx.compose.foundation.layout.fillMaxSize
1010
import androidx.compose.foundation.layout.padding
1111
import androidx.compose.material.Text
1212
import androidx.compose.runtime.Composable
13+
import androidx.compose.runtime.LaunchedEffect
1314
import androidx.compose.runtime.getValue
1415
import androidx.compose.runtime.mutableStateOf
1516
import androidx.compose.runtime.remember
1617
import androidx.compose.runtime.setValue
17-
import androidx.compose.runtime.LaunchedEffect
1818
import androidx.compose.ui.Alignment
1919
import androidx.compose.ui.Modifier
2020
import androidx.compose.ui.graphics.Color
@@ -29,15 +29,17 @@ import io.github.vinceglb.filekit.PlatformFile
2929
*/
3030
@Composable
3131
public fun RenderDiagram(
32-
file: PlatformFile?,
32+
file: PlatformFile,
3333
traceInd: Int,
34+
onFileParse: (List<WorkflowNode>) -> Unit,
3435
onNodeSelect: (WorkflowNode) -> Unit,
3536
) {
3637
var workflowNodes by remember { mutableStateOf<List<WorkflowNode>>(emptyList()) }
3738
var isLoading by remember { mutableStateOf(true) }
3839

3940
LaunchedEffect(file) {
4041
workflowNodes = fetchTrace(file)
42+
onFileParse(workflowNodes)
4143
isLoading = false
4244
}
4345

workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/utils/SandboxBackground.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public fun SandboxBackground(
3838
.fillMaxSize()
3939
.pointerInput(Unit) {
4040
// Panning capabilities: watches for drag gestures and applies the translation
41-
detectDragGestures { _, translation->
41+
detectDragGestures { _, translation ->
4242
offset += translation
4343
}
4444
}

0 commit comments

Comments
 (0)