Auto commit Sat Mar 21 08:01:01 PM CDT 2026

This commit is contained in:
Tretzi
2026-03-21 20:01:01 -05:00
parent 2c8a8eb43f
commit 835a486794

View File

@@ -27,6 +27,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
@@ -205,6 +206,15 @@ internal fun TimelineGraph(
val selectedLeft = activeCurve == leftId
val selectedRight = activeCurve == rightId
val currentViewport by rememberUpdatedState(viewport)
val currentSelection by rememberUpdatedState(selection)
val currentCurveLeft by rememberUpdatedState(curveLeft)
val currentCurveRight by rememberUpdatedState(curveRight)
val currentOnViewportChanged by rememberUpdatedState(onViewportChanged)
val currentOnSelectionChanged by rememberUpdatedState(onSelectionChanged)
val currentOnUpdateCurve by rememberUpdatedState(onUpdateCurve)
val currentOnTapSideSelect by rememberUpdatedState(onTapSideSelect)
val context = LocalContext.current
var dragMode by remember { mutableStateOf(HandleDrag.NONE) }
var draggingPointIndex by remember { mutableStateOf<Int?>(null) }
@@ -260,10 +270,14 @@ internal fun TimelineGraph(
.height(190.dp)
.background(Color(0xFF0A0E18), RoundedCornerShape(10.dp))
.testTag("timeline_graph")
.pointerInput(viewport, selection, curveLeft, curveRight, activeCurve) {
.pointerInput(Unit) {
awaitPointerEventScope {
while (true) {
val down = awaitFirstDown(requireUnconsumed = false)
val viewport = currentViewport
val selection = currentSelection
val curveLeft = currentCurveLeft
val curveRight = currentCurveRight
val w = size.width.toFloat()
val h = size.height.toFloat()
val startX = viewport.timeToX(selection.startSec, w)
@@ -299,7 +313,7 @@ internal fun TimelineGraph(
draggingCurveId = nearestHit.first
draggingPointIndex = nearestHit.second
dragMode = HandleDrag.NONE
onTapSideSelect(if (nearestHit.first == leftId) Side.LEFT else Side.RIGHT)
currentOnTapSideSelect(if (nearestHit.first == leftId) Side.LEFT else Side.RIGHT)
} else {
draggingPointIndex = null
draggingCurveId = null
@@ -337,7 +351,7 @@ internal fun TimelineGraph(
widthPx = size.width.toFloat(),
centroidPx = centroid.x,
)
onViewportChanged(newViewport)
currentOnViewportChanged(newViewport)
}
event.changes.forEach { it.consume() }
continue
@@ -355,7 +369,7 @@ internal fun TimelineGraph(
if (pointIndex != null && curveId != null) {
val targetCurve = if (curveId == leftId) curveLeft else curveRight
val updated = targetCurve.movePointVerticalWithPropagation(pointIndex, primary.position.y, h)
onUpdateCurve(curveId, updated)
currentOnUpdateCurve(curveId, updated)
onCurveEditedHaptic()
primary.consume()
continue
@@ -364,11 +378,11 @@ internal fun TimelineGraph(
val t = viewport.xToTimeSec(primary.position.x, w).toInt().coerceAtLeast(0)
when (dragMode) {
HandleDrag.START -> {
onSelectionChanged(TimelineSelection(startSec = min(t, selection.endSec - 60), endSec = selection.endSec))
currentOnSelectionChanged(TimelineSelection(startSec = min(t, selection.endSec - 60), endSec = selection.endSec))
primary.consume()
}
HandleDrag.END -> {
onSelectionChanged(TimelineSelection(startSec = selection.startSec, endSec = max(t, selection.startSec + 60)))
currentOnSelectionChanged(TimelineSelection(startSec = selection.startSec, endSec = max(t, selection.startSec + 60)))
primary.consume()
}
HandleDrag.NONE -> {
@@ -379,7 +393,7 @@ internal fun TimelineGraph(
widthPx = w,
centroidPx = w / 2f,
)
onViewportChanged(newViewport)
currentOnViewportChanged(newViewport)
primary.consume()
}
}
@@ -388,7 +402,7 @@ internal fun TimelineGraph(
if (!moved && !isTransform) {
val side = if (down.position.x < size.width / 2f) Side.LEFT else Side.RIGHT
onTapSideSelect(side)
currentOnTapSideSelect(side)
}
draggingPointIndex = null
draggingCurveId = null