Right-to-left: fix target position of post-capture animation (#122)

This commit is contained in:
Pierre-Yves Nicolas
2026-03-09 14:47:08 +01:00
parent 8784c0b923
commit 8666fce250

View File

@@ -48,8 +48,10 @@ import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.Density import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import org.fairscan.app.THUMBNAIL_SIZE_DP import org.fairscan.app.THUMBNAIL_SIZE_DP
@@ -116,10 +118,12 @@ fun CommonPageList(
) )
} }
if (state.document.isEmpty()) { if (state.document.isEmpty()) {
val layoutDirection = LocalLayoutDirection.current
Box( Box(
modifier = Modifier modifier = Modifier
.height(THUMBNAIL_SIZE_DP.dp) .height(THUMBNAIL_SIZE_DP.dp)
.addPositionCallback(state.onLastItemPosition, LocalDensity.current, 0.5f) .addPositionCallback(
state.onLastItemPosition, LocalDensity.current, 0.5f, layoutDirection)
) {} ) {}
} }
} }
@@ -143,7 +147,9 @@ private fun PageThumbnail(
Modifier.width(maxImageSize) Modifier.width(maxImageSize)
if (index == state.document.lastIndex()) { if (index == state.document.lastIndex()) {
val density = LocalDensity.current val density = LocalDensity.current
imageModifier = imageModifier.addPositionCallback(state.onLastItemPosition, density, 1.0f) val layoutDirection = LocalLayoutDirection.current
imageModifier = imageModifier.addPositionCallback(
state.onLastItemPosition, density, 1.0f, layoutDirection)
} }
Box(modifier = modifier.height(PAGE_LIST_ELEMENT_SIZE_DP.dp)) { Box(modifier = modifier.height(PAGE_LIST_ELEMENT_SIZE_DP.dp)) {
Card( Card(
@@ -182,16 +188,28 @@ private fun BoxScope.PageNumberBadge(index: Int) {
} }
} }
fun Modifier.addPositionCallback(callback: ((Offset) -> Unit)?, density: Density, xFactor: Float): Modifier { fun Modifier.addPositionCallback(
callback: ((Offset) -> Unit)?,
density: Density,
xFactor: Float,
layoutDirection: LayoutDirection
): Modifier {
if (callback == null) { if (callback == null) {
return this return this
} }
return this.onGloballyPositioned { coordinates -> return this.onGloballyPositioned { coordinates ->
with(density) { with(density) {
callback(coordinates.localToWindow( val width = PAGE_LIST_ELEMENT_SIZE_DP.dp.toPx()
Offset(
x = PAGE_LIST_ELEMENT_SIZE_DP.dp.toPx() * xFactor, val x = when (layoutDirection) {
y = PAGE_LIST_ELEMENT_SIZE_DP.dp.toPx() / 2))) LayoutDirection.Ltr -> width * xFactor
LayoutDirection.Rtl -> width * (0.5f - xFactor)
}
callback(
coordinates.localToWindow(Offset(x = x, y = width / 2))
)
} }
} }
} }