EditPageScreen: fix visual glitch when loading the same page twice
This commit is contained in:
@@ -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
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 = { _ -> },
|
||||
)
|
||||
|
||||
@@ -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 = { _ -> },
|
||||
|
||||
Reference in New Issue
Block a user