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