EditPageScreen: fix visual glitch when loading the same page twice

This commit is contained in:
Pierre-Yves Nicolas
2026-05-06 21:09:05 +02:00
parent fed95c99d4
commit c43e4e73ad
4 changed files with 14 additions and 17 deletions

View File

@@ -182,7 +182,6 @@ class MainActivity : ComponentActivity() {
is Screen.Main.EditImage -> {
EditPageScreen(
pageId = documentUiState.currentPage?.key?.pageId ?: "",
onLoad = { id -> viewModel.loadCropInitialState(id)},
initState = cropInitialState,
navigation = navigation,
onUpdatePageQuad = { quad -> viewModel.setCurrentPageUserQuad(quad) },
@@ -196,6 +195,7 @@ class MainActivity : ComponentActivity() {
onDeleteImage = { viewModel.deleteCurrentPage() },
onRotateImage = { clockwise -> viewModel.rotateCurrentPage(clockwise) },
onToggleColorMode = { viewModel.toggleCurrentPageColorMode() },
onCropClick = { viewModel.onClickOnCropButton() },
onPageReorder = { id, newIndex -> viewModel.movePage(id, newIndex) },
onPageSelected = viewModel::onPageSelected
)

View File

@@ -242,13 +242,12 @@ class MainViewModel(val imageRepository: ImageRepository): ViewModel() {
val cropInitState: StateFlow<CropInitState> = _cropInitState
private var cropInitialStateJob: Job? = null
fun loadCropInitialState(pageId: String) {
fun onClickOnCropButton() {
cropInitialStateJob?.cancel()
cropInitialStateJob = viewModelScope.launch {
_cropInitState.value = CropInitState.Loading
val page = _pages.value.find { it.id == pageId }
?: return@launch
val page = currentPage()
val metadata = page.metadata
val rotation = page.totalRotation()
@@ -277,6 +276,8 @@ class MainViewModel(val imageRepository: ImageRepository): ViewModel() {
CropInitState.Error
else
CropInitState.Ready(page.id, bitmap, quad)
navigateTo(Screen.Main.EditImage)
}
}
}

View File

@@ -99,6 +99,7 @@ fun DocumentScreen(
onDeleteImage: () -> Unit,
onRotateImage: (Boolean) -> Unit,
onToggleColorMode: () -> Unit,
onCropClick: () -> Unit,
onPageReorder: (String, Int) -> Unit,
onPageSelected: (Int) -> Unit,
) {
@@ -132,7 +133,7 @@ fun DocumentScreen(
{ showDeletePageDialog.value = true },
onRotateImage,
onToggleColorMode,
navigation,
onCropClick,
modifier
)
if (showDeletePageDialog.value) {
@@ -151,7 +152,7 @@ private fun DocumentPreview(
onDeleteImage: () -> Unit,
onRotateImage: (Boolean) -> Unit,
onToggleColorMode: () -> Unit,
navigation: Navigation,
onCropClick: () -> Unit,
modifier: Modifier,
) {
val currentPageIndex = uiState.currentPageIndex
@@ -199,7 +200,7 @@ private fun DocumentPreview(
EditButtons(
uiState,
onToggleColorMode,
navigation,
onCropClick,
modifier = Modifier.align(Alignment.BottomStart)
)
RotationButtons(onRotateImage, Modifier.align(Alignment.BottomCenter))
@@ -256,7 +257,7 @@ fun RotationButtons(
fun EditButtons(
uiState: DocumentUiState,
onToggleColorMode: () -> Unit,
navigation: Navigation,
onCropClick: () -> Unit,
modifier: Modifier
) {
Row(modifier = modifier.padding(8.dp)) {
@@ -271,7 +272,7 @@ fun EditButtons(
SecondaryActionButton(
icon = Icons.Default.Crop,
contentDescription = "Crop", // TODO externalize string
onClick = navigation.toEditImageScreen,
onClick = onCropClick,
)
}
}
@@ -378,6 +379,7 @@ fun DocumentScreenPreview() {
onDeleteImage = { },
onRotateImage = { _ -> },
onToggleColorMode = { },
onCropClick = { },
onPageReorder = { _,_ -> },
onPageSelected = { _ -> },
)

View File

@@ -66,25 +66,20 @@ import org.fairscan.imageprocessing.Quad
@Composable
fun EditPageScreen(
pageId: String,
onLoad: (String) -> Unit,
initState: CropInitState,
navigation: Navigation,
onUpdatePageQuad: (Quad) -> Unit,
) {
val state = remember { EditPageScreenState() }
val state = remember(pageId) { EditPageScreenState() }
val quadHandler = remember { QuadEditingHandler() }
if (initState is CropInitState.Ready && initState.pageId == pageId) {
if (initState is CropInitState.Ready && initState.pageId == pageId && state.bitmap == null) {
state.bitmap = initState.bitmap
state.setInitialQuad(initState.quad)
}
BackHandler { navigation.back() }
LaunchedEffect(pageId) {
onLoad(pageId)
}
val isLandscape = isLandscape(LocalConfiguration.current)
MyScaffold(
@@ -321,7 +316,6 @@ fun EditPageScreenPreview() {
val quad = Quad(Point(.1, .1), Point(.9, .1), Point(.9, .9), Point(.1, .9))
EditPageScreen(
pageId = "123",
onLoad = {},
initState = CropInitState.Ready("123",dummyImage, quad),
navigation = dummyNavigation(),
onUpdatePageQuad = { _ -> },