Auto commit Sat Mar 21 08:01:01 PM CDT 2026
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user