Skip to content

Commit cc40120

Browse files
committed
Make app window snap to the specific node when it is being searched.
1 parent 24fae61 commit cc40120

File tree

3 files changed

+28
-13
lines changed

3 files changed

+28
-13
lines changed

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

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ import androidx.compose.runtime.snapshots.SnapshotStateMap
1616
import androidx.compose.ui.Alignment
1717
import androidx.compose.ui.Modifier
1818
import androidx.compose.ui.geometry.Offset
19-
import com.squareup.workflow1.traceviewer.TraceMode.File
20-
import com.squareup.workflow1.traceviewer.TraceMode.Live
19+
import androidx.compose.ui.layout.onGloballyPositioned
20+
import androidx.compose.ui.unit.IntSize
2121
import com.squareup.workflow1.traceviewer.model.Node
2222
import com.squareup.workflow1.traceviewer.model.NodeUpdate
2323
import com.squareup.workflow1.traceviewer.ui.ColorLegend
@@ -39,6 +39,7 @@ import io.github.vinceglb.filekit.PlatformFile
3939
internal fun App(
4040
modifier: Modifier = Modifier
4141
) {
42+
var appWindowSize by remember { mutableStateOf(IntSize(0,0)) }
4243
var selectedNode by remember { mutableStateOf<NodeUpdate?>(null) }
4344
var frameSize by remember { mutableIntStateOf(0) }
4445
var rawRenderPass by remember { mutableStateOf("") }
@@ -60,7 +61,9 @@ internal fun App(
6061
}
6162

6263
Box(
63-
modifier = modifier
64+
modifier = modifier.onGloballyPositioned {
65+
appWindowSize = it.size
66+
}
6467
) {
6568
fun resetStates() {
6669
selectedTraceFile = null
@@ -115,8 +118,11 @@ internal fun App(
115118
SearchBox(
116119
nodes = nodeLocations[frameInd].keys.toList(),
117120
onSearch = { name ->
121+
sandboxState.scale = 1f
118122
val node = nodeLocations[frameInd].keys.firstOrNull { it.name == name }
119-
sandboxState.offset = nodeLocations[frameInd][node] ?: sandboxState.offset
123+
val newX = sandboxState.offset.x - nodeLocations[frameInd][node]!!.x + appWindowSize.width / 2
124+
val newY = sandboxState.offset.y - nodeLocations[frameInd][node]!!.y + appWindowSize.height / 2
125+
sandboxState.offset = Offset(x = newX, y = newY)
120126
},
121127
modifier = Modifier.align(Alignment.CenterHorizontally)
122128
)
@@ -126,16 +132,16 @@ internal fun App(
126132
TraceModeToggleSwitch(
127133
onToggle = {
128134
resetStates()
129-
traceMode = if (traceMode is Live) {
135+
traceMode = if (traceMode is TraceMode.Live) {
130136
frameIndex = 0
131-
File(null)
137+
TraceMode.File(null)
132138
} else {
133139
/*
134140
We set the frame to -1 here since we always increment it during Live mode as the list of
135141
frames get populated, so we avoid off by one when indexing into the frames.
136142
*/
137143
frameIndex = -1
138-
Live()
144+
TraceMode.Live()
139145
}
140146
},
141147
traceMode = traceMode,
@@ -148,7 +154,7 @@ internal fun App(
148154
resetOnFileSelect = {
149155
resetStates()
150156
selectedTraceFile = it
151-
traceMode = File(it)
157+
traceMode = TraceMode.File(it)
152158
},
153159
modifier = Modifier.align(Alignment.BottomStart)
154160
)
@@ -158,7 +164,7 @@ internal fun App(
158164
if ((traceMode as TraceMode.Live).device == null) {
159165
DisplayDevices(
160166
onDeviceSelect = { selectedDevice ->
161-
traceMode = Live(selectedDevice)
167+
traceMode = TraceMode.Live(selectedDevice)
162168
},
163169
devices = listDevices(),
164170
modifier = Modifier.align(Alignment.Center)

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import androidx.compose.ui.input.pointer.PointerEventType
2323
import androidx.compose.ui.input.pointer.isSecondaryPressed
2424
import androidx.compose.ui.input.pointer.onPointerEvent
2525
import androidx.compose.ui.layout.onGloballyPositioned
26-
import androidx.compose.ui.layout.positionInParent
26+
import androidx.compose.ui.layout.positionInRoot
2727
import androidx.compose.ui.unit.dp
2828
import androidx.compose.ui.unit.sp
2929
import com.squareup.workflow1.traceviewer.model.Node
@@ -305,8 +305,12 @@ private fun DrawNode(
305305
}
306306
.padding(16.dp)
307307
.onGloballyPositioned { coords ->
308-
val offset = coords.positionInParent()
309-
storeNodeLocation(node, offset)
308+
val offsetToTopLeft = coords.positionInRoot()
309+
val offsetToCenter = Offset(
310+
x = offsetToTopLeft.x + coords.size.width / 2,
311+
y = offsetToTopLeft.y + coords.size.height / 2
312+
)
313+
storeNodeLocation(node, offsetToCenter)
310314
}
311315
) {
312316
Column(horizontalAlignment = Alignment.CenterHorizontally) {

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import androidx.compose.material.icons.filled.Close
1010
import androidx.compose.material3.DockedSearchBar
1111
import androidx.compose.material3.ExperimentalMaterial3Api
1212
import androidx.compose.material3.ListItem
13+
import androidx.compose.material3.ListItemDefaults
1314
import androidx.compose.material3.SearchBarColors
1415
import androidx.compose.material3.SearchBarDefaults
1516
import androidx.compose.runtime.Composable
@@ -70,7 +71,11 @@ internal fun SearchBox(
7071
.clickable {
7172
onSearch(node.name)
7273
expanded = false
73-
}
74+
},
75+
colors = ListItemDefaults.colors(
76+
containerColor = Color.White,
77+
headlineColor = Color.Black
78+
)
7479
)
7580
}
7681
}

0 commit comments

Comments
 (0)