revert(photo-editor): 恢复点击裁剪 icon 进入裁剪的交互
撤销"切到裁剪 tab 自动进入裁剪"的改动,保留原来的两步操作: 点击下方裁剪 icon 进入裁剪模式,再次点击 ✓ 确认裁剪。 ViewModel 恢复 toggleCrop,删除无用的 enterCrop/exitCrop; 保留裁剪框拖动的 bug 修复(本地累积值 + rememberUpdatedState)。
This commit is contained in:
parent
d3ebd6829b
commit
70c97ed9d5
@ -80,18 +80,14 @@ class PhotoEditorViewModel(
|
|||||||
update { it.copy(rotationDegrees = it.rotationDegrees + delta) }
|
update { it.copy(rotationDegrees = it.rotationDegrees + delta) }
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 进入裁剪模式:仅在尚未启用时初始化为默认居中区域,已启用则保留当前框。 */
|
/** 开启/关闭裁剪。开启时使用默认居中 4:3 裁剪框。 */
|
||||||
fun enterCrop() {
|
fun toggleCrop() {
|
||||||
update {
|
|
||||||
if (it.cropEnabled) it
|
|
||||||
else it.copy(cropLeft = 0.1f, cropTop = 0.1f, cropRight = 0.9f, cropBottom = 0.9f)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** 退出裁剪模式:清空裁剪框(不应用裁剪)。 */
|
|
||||||
fun exitCrop() {
|
|
||||||
update {
|
update {
|
||||||
|
if (it.cropEnabled) {
|
||||||
it.copy(cropLeft = null, cropRight = null, cropTop = 0f, cropBottom = 1f)
|
it.copy(cropLeft = null, cropRight = null, cropTop = 0f, cropBottom = 1f)
|
||||||
|
} else {
|
||||||
|
it.copy(cropLeft = 0.1f, cropTop = 0.1f, cropRight = 0.9f, cropBottom = 0.9f)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -97,14 +97,6 @@ fun PhotoEditorScreen(
|
|||||||
var activeTab by remember { mutableStateOf(EditTab.ROTATE) }
|
var activeTab by remember { mutableStateOf(EditTab.ROTATE) }
|
||||||
val savedPath = state.savedPath
|
val savedPath = state.savedPath
|
||||||
|
|
||||||
// 切到裁剪 tab 自动进入裁剪模式;切走则退出(不应用裁剪)
|
|
||||||
LaunchedEffect(activeTab, state.editorState) {
|
|
||||||
when (activeTab) {
|
|
||||||
EditTab.CROP -> viewModel.enterCrop()
|
|
||||||
else -> viewModel.exitCrop()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (savedPath != null) {
|
if (savedPath != null) {
|
||||||
LaunchedEffect(savedPath) { onSaved(savedPath) }
|
LaunchedEffect(savedPath) { onSaved(savedPath) }
|
||||||
}
|
}
|
||||||
@ -167,6 +159,7 @@ fun PhotoEditorScreen(
|
|||||||
activeTab = activeTab,
|
activeTab = activeTab,
|
||||||
onTabChange = { activeTab = it },
|
onTabChange = { activeTab = it },
|
||||||
onRotate = viewModel::rotate,
|
onRotate = viewModel::rotate,
|
||||||
|
onCropToggle = viewModel::toggleCrop,
|
||||||
onApplyCrop = viewModel::applyCrop,
|
onApplyCrop = viewModel::applyCrop,
|
||||||
onCropChange = viewModel::updateCrop,
|
onCropChange = viewModel::updateCrop,
|
||||||
onAddPoint = viewModel::addStrokePoint,
|
onAddPoint = viewModel::addStrokePoint,
|
||||||
@ -191,6 +184,7 @@ private fun EditorBody(
|
|||||||
activeTab: EditTab,
|
activeTab: EditTab,
|
||||||
onTabChange: (EditTab) -> Unit,
|
onTabChange: (EditTab) -> Unit,
|
||||||
onRotate: (Int) -> Unit,
|
onRotate: (Int) -> Unit,
|
||||||
|
onCropToggle: () -> Unit,
|
||||||
onApplyCrop: () -> Unit,
|
onApplyCrop: () -> Unit,
|
||||||
onCropChange: (Float, Float, Float, Float) -> Unit,
|
onCropChange: (Float, Float, Float, Float) -> Unit,
|
||||||
onAddPoint: (Offset) -> Unit,
|
onAddPoint: (Offset) -> Unit,
|
||||||
@ -255,6 +249,7 @@ private fun EditorBody(
|
|||||||
mode = activeTab,
|
mode = activeTab,
|
||||||
state = state,
|
state = state,
|
||||||
onRotate = onRotate,
|
onRotate = onRotate,
|
||||||
|
onCropToggle = onCropToggle,
|
||||||
onApplyCrop = onApplyCrop,
|
onApplyCrop = onApplyCrop,
|
||||||
onUndoStroke = onUndoStroke,
|
onUndoStroke = onUndoStroke,
|
||||||
onStrokeColorChange = onStrokeColorChange,
|
onStrokeColorChange = onStrokeColorChange,
|
||||||
@ -522,6 +517,7 @@ private fun ToolBar(
|
|||||||
mode: EditTab,
|
mode: EditTab,
|
||||||
state: PhotoEditorState,
|
state: PhotoEditorState,
|
||||||
onRotate: (Int) -> Unit,
|
onRotate: (Int) -> Unit,
|
||||||
|
onCropToggle: () -> Unit,
|
||||||
onApplyCrop: () -> Unit,
|
onApplyCrop: () -> Unit,
|
||||||
onUndoStroke: () -> Unit,
|
onUndoStroke: () -> Unit,
|
||||||
onStrokeColorChange: (Color) -> Unit,
|
onStrokeColorChange: (Color) -> Unit,
|
||||||
@ -541,10 +537,16 @@ private fun ToolBar(
|
|||||||
Icon(Icons.Filled.RotateRight, contentDescription = "右转 90°")
|
Icon(Icons.Filled.RotateRight, contentDescription = "右转 90°")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EditTab.CROP -> {
|
EditTab.CROP -> if (state.cropEnabled) {
|
||||||
|
// 已进入裁剪模式:✓ 确认裁剪(烘焙到源图)
|
||||||
FilledIconButton(onClick = onApplyCrop) {
|
FilledIconButton(onClick = onApplyCrop) {
|
||||||
Icon(Icons.Filled.Done, contentDescription = "确认裁剪")
|
Icon(Icons.Filled.Done, contentDescription = "确认裁剪")
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// 未进入:点击进入裁剪模式
|
||||||
|
FilledIconButton(onClick = onCropToggle) {
|
||||||
|
Icon(Icons.Filled.Crop, contentDescription = "进入裁剪")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
EditTab.HANDWRITE -> {
|
EditTab.HANDWRITE -> {
|
||||||
IconButton(onClick = onUndoStroke, enabled = state.strokes.isNotEmpty()) {
|
IconButton(onClick = onUndoStroke, enabled = state.strokes.isNotEmpty()) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user