Export screen: fix layout in landscape mode

This commit is contained in:
Pierre-Yves Nicolas
2025-08-31 20:18:05 +02:00
parent ed77eb6eba
commit 5f7327d798

View File

@@ -24,6 +24,7 @@ import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
@@ -58,6 +59,7 @@ import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontStyle
@@ -152,33 +154,46 @@ fun ExportScreen(
) )
} }
) { innerPadding -> ) { innerPadding ->
Column( val containerModifier = Modifier
modifier = Modifier
.padding(innerPadding) .padding(innerPadding)
.padding(16.dp) .padding(16.dp)
.fillMaxSize(), if (!isLandscape(LocalConfiguration.current)) {
Column(
modifier = containerModifier.fillMaxSize(),
verticalArrangement = Arrangement.spacedBy(16.dp) verticalArrangement = Arrangement.spacedBy(16.dp)
) { ) {
val focusRequester = remember { FocusRequester() } TextFieldAndPdfInfos(filename, onFilenameChange, uiState, onOpen)
OutlinedTextField( Spacer(Modifier.weight(1f)) // push buttons down
value = filename.value, MainActions(uiState, onShare, onSave, onCloseScan)
onValueChange = onFilenameChange, }
label = { Text(stringResource(R.string.filename)) }, } else {
singleLine = true, Row(
modifier = Modifier modifier = containerModifier.fillMaxHeight(),
.fillMaxWidth() horizontalArrangement = Arrangement.spacedBy(16.dp)
.focusRequester(focusRequester), ) {
trailingIcon = { Column(
if (filename.value.isNotEmpty()) { modifier = Modifier.weight(1f),
IconButton(onClick = { verticalArrangement = Arrangement.spacedBy(16.dp)
filename.value = "" ) {
focusRequester.requestFocus() TextFieldAndPdfInfos(filename, onFilenameChange, uiState, onOpen)
}) { }
Icon(Icons.Default.Clear, stringResource(R.string.clear_text)) Column(modifier = Modifier.weight(1f)) {
MainActions(uiState, onShare, onSave, onCloseScan)
} }
} }
},
) }
}
}
@Composable
private fun TextFieldAndPdfInfos(
filename: MutableState<String>,
onFilenameChange: (String) -> Unit,
uiState: PdfGenerationUiState,
onOpen: () -> Unit,
) {
FilenameTextField(filename, onFilenameChange)
val pdf = uiState.generatedPdf val pdf = uiState.generatedPdf
@@ -206,12 +221,33 @@ fun ExportScreen(
if (uiState.errorMessage != null) { if (uiState.errorMessage != null) {
ErrorBar(uiState.errorMessage) ErrorBar(uiState.errorMessage)
} }
}
Spacer(Modifier.weight(1f)) // push buttons down @Composable
private fun FilenameTextField(
MainActions(uiState, onShare, onSave, onCloseScan) filename: MutableState<String>,
onFilenameChange: (String) -> Unit,
) {
val focusRequester = remember { FocusRequester() }
OutlinedTextField(
value = filename.value,
onValueChange = onFilenameChange,
label = { Text(stringResource(R.string.filename)) },
singleLine = true,
modifier = Modifier
.fillMaxWidth()
.focusRequester(focusRequester),
trailingIcon = {
if (filename.value.isNotEmpty()) {
IconButton(onClick = {
filename.value = ""
focusRequester.requestFocus()
}) {
Icon(Icons.Default.Clear, stringResource(R.string.clear_text))
} }
} }
},
)
} }
@Composable @Composable
@@ -378,6 +414,19 @@ fun ExportScreenPreviewWithError() {
) )
} }
@Preview(showBackground = true, widthDp = 720, heightDp = 360)
@Composable
fun PreviewExportScreenAfterSaveHorizontal() {
val file = File("fake.pdf")
ExportPreviewToCustomize(
uiState = PdfGenerationUiState(
generatedPdf = GeneratedPdf(file, 442897L, 3),
savedFileUri = file.toUri(),
saveDirectoryName = "Downloads",
),
)
}
@Composable @Composable
fun ExportPreviewToCustomize(uiState: PdfGenerationUiState) { fun ExportPreviewToCustomize(uiState: PdfGenerationUiState) {
MyScanTheme { MyScanTheme {
@@ -393,4 +442,3 @@ fun ExportPreviewToCustomize(uiState: PdfGenerationUiState) {
) )
} }
} }