Fix last item on more settings screens.

This commit is contained in:
eranl 2025-04-15 03:00:28 +03:00
parent 988c99aeae
commit 86d4d0dfaf
2 changed files with 181 additions and 149 deletions

View file

@ -6,6 +6,7 @@ import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.PaddingValues
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
@ -201,9 +202,11 @@ fun <T: Any?> SearchScreen(
} }
} else { } else {
val items = filteredItems(searchText.text) val items = filteredItems(searchText.text)
LazyColumn { Scaffold { innerPadding ->
items(items) { LazyColumn(contentPadding = PaddingValues.Absolute(bottom = innerPadding.calculateBottomPadding())) {
itemContent(it) items(items) {
itemContent(it)
}
} }
} }
} }

View file

@ -13,6 +13,7 @@ import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.material3.Switch import androidx.compose.material3.Switch
import androidx.compose.material3.Text import androidx.compose.material3.Text
@ -140,163 +141,191 @@ fun SubtypeScreen(
itemContent = { }, itemContent = { },
filteredItems = { emptyList<String>() } filteredItems = { emptyList<String>() }
) { ) {
Column( Scaffold { innerPadding ->
modifier = Modifier.verticalScroll(scrollState).padding(horizontal = 12.dp), Column(
verticalArrangement = Arrangement.spacedBy(8.dp), modifier = Modifier.verticalScroll(scrollState).padding(horizontal = 12.dp)
) { .then(Modifier.padding(bottom = innerPadding.calculateBottomPadding())),
MainLayoutRow(currentSubtype, customMainLayouts) { setCurrentSubtype(it) } verticalArrangement = Arrangement.spacedBy(8.dp),
if (availableLocalesForScript.size > 1) { ) {
WithSmallTitle(stringResource(R.string.secondary_locale)) { MainLayoutRow(currentSubtype, customMainLayouts) { setCurrentSubtype(it) }
TextButton(onClick = { showSecondaryLocaleDialog = true }) { if (availableLocalesForScript.size > 1) {
val text = getSecondaryLocales(currentSubtype.extraValues).joinToString(", ") { WithSmallTitle(stringResource(R.string.secondary_locale)) {
it.localizedDisplayName(ctx) TextButton(onClick = { showSecondaryLocaleDialog = true }) {
}.ifEmpty { stringResource(R.string.action_none) } val text = getSecondaryLocales(currentSubtype.extraValues).joinToString(", ") {
Text(text, Modifier.fillMaxWidth()) it.localizedDisplayName(ctx)
} }.ifEmpty { stringResource(R.string.action_none) }
} Text(text, Modifier.fillMaxWidth())
}
Row {
TextButton(onClick = { showKeyOrderDialog = true }, Modifier.weight(1f))
{ Text(stringResource(R.string.popup_order)) }
DefaultButton(currentSubtype.getExtraValueOf(ExtraValue.POPUP_ORDER) == null) {
setCurrentSubtype(currentSubtype.without(ExtraValue.POPUP_ORDER))
}
}
Row {
TextButton(onClick = { showHintOrderDialog = true }, Modifier.weight(1f))
{ Text(stringResource(R.string.hint_source)) }
DefaultButton(currentSubtype.getExtraValueOf(ExtraValue.HINT_ORDER) == null) {
setCurrentSubtype(currentSubtype.without(ExtraValue.HINT_ORDER))
}
}
if (currentSubtype.locale.script() == ScriptUtils.SCRIPT_LATIN) {
WithSmallTitle(stringResource(R.string.show_popup_keys_title)) {
val explicitValue = currentSubtype.getExtraValueOf(ExtraValue.MORE_POPUPS)
val value = explicitValue ?: prefs.getString(Settings.PREF_MORE_POPUP_KEYS, Defaults.PREF_MORE_POPUP_KEYS)!!
Row {
TextButton(onClick = { showMorePopupsDialog = true }, Modifier.weight(1f))
{ Text(stringResource(morePopupKeysResId(value))) }
DefaultButton(explicitValue == null) {
setCurrentSubtype(currentSubtype.without(ExtraValue.MORE_POPUPS))
} }
} }
} }
} Row {
if (hasLocalizedNumberRow(currentSubtype.locale, ctx)) { TextButton(onClick = { showKeyOrderDialog = true }, Modifier.weight(1f))
Row(verticalAlignment = Alignment.CenterVertically) { { Text(stringResource(R.string.popup_order)) }
val checked = currentSubtype.getExtraValueOf(ExtraValue.LOCALIZED_NUMBER_ROW)?.toBoolean() DefaultButton(currentSubtype.getExtraValueOf(ExtraValue.POPUP_ORDER) == null) {
Text(stringResource(R.string.localized_number_row), Modifier.weight(1f)) setCurrentSubtype(currentSubtype.without(ExtraValue.POPUP_ORDER))
Switch(
checked = checked ?: prefs.getBoolean(Settings.PREF_LOCALIZED_NUMBER_ROW, Defaults.PREF_LOCALIZED_NUMBER_ROW),
onCheckedChange = {
setCurrentSubtype(currentSubtype.with(ExtraValue.LOCALIZED_NUMBER_ROW, it.toString()))
}
)
DefaultButton(checked == null) {
setCurrentSubtype(currentSubtype.without(ExtraValue.LOCALIZED_NUMBER_ROW))
} }
} }
} Row {
HorizontalDivider() TextButton(onClick = { showHintOrderDialog = true }, Modifier.weight(1f))
Text(stringResource(R.string.settings_screen_secondary_layouts), style = MaterialTheme.typography.titleMedium) { Text(stringResource(R.string.hint_source)) }
LayoutType.entries.forEach { type -> DefaultButton(currentSubtype.getExtraValueOf(ExtraValue.HINT_ORDER) == null) {
if (type == LayoutType.MAIN) return@forEach setCurrentSubtype(currentSubtype.without(ExtraValue.HINT_ORDER))
WithSmallTitle(stringResource(type.displayNameId)) { }
val explicitLayout = currentSubtype.layoutName(type) }
val layout = explicitLayout ?: Settings.readDefaultLayoutName(type, prefs) if (currentSubtype.locale.script() == ScriptUtils.SCRIPT_LATIN) {
val defaultLayouts = LayoutUtils.getAvailableLayouts(type, ctx) WithSmallTitle(stringResource(R.string.show_popup_keys_title)) {
val customLayouts = LayoutUtilsCustom.getLayoutFiles(type, ctx).map { it.name } val explicitValue = currentSubtype.getExtraValueOf(ExtraValue.MORE_POPUPS)
DropDownField( val value = explicitValue ?: prefs.getString(
items = defaultLayouts + customLayouts, Settings.PREF_MORE_POPUP_KEYS,
selectedItem = layout, Defaults.PREF_MORE_POPUP_KEYS
onSelected = { )!!
setCurrentSubtype(currentSubtype.withLayout(type, it)) Row {
}, TextButton(onClick = { showMorePopupsDialog = true }, Modifier.weight(1f))
extraButton = { DefaultButton(explicitLayout == null) { { Text(stringResource(morePopupKeysResId(value))) }
setCurrentSubtype(currentSubtype.withoutLayout(type)) DefaultButton(explicitValue == null) {
} }, setCurrentSubtype(currentSubtype.without(ExtraValue.MORE_POPUPS))
) { }
val displayName = if (LayoutUtilsCustom.isCustomLayout(it)) LayoutUtilsCustom.getDisplayName(it) }
else it.getStringResourceOrName("layout_", ctx) }
var showLayoutEditDialog by remember { mutableStateOf(false) } }
Row( if (hasLocalizedNumberRow(currentSubtype.locale, ctx)) {
horizontalArrangement = Arrangement.SpaceBetween, Row(verticalAlignment = Alignment.CenterVertically) {
verticalAlignment = Alignment.CenterVertically, val checked = currentSubtype.getExtraValueOf(ExtraValue.LOCALIZED_NUMBER_ROW)?.toBoolean()
modifier = Modifier.fillMaxWidth() Text(stringResource(R.string.localized_number_row), Modifier.weight(1f))
Switch(
checked = checked ?: prefs.getBoolean(
Settings.PREF_LOCALIZED_NUMBER_ROW,
Defaults.PREF_LOCALIZED_NUMBER_ROW
),
onCheckedChange = {
setCurrentSubtype(currentSubtype.with(ExtraValue.LOCALIZED_NUMBER_ROW, it.toString()))
}
)
DefaultButton(checked == null) {
setCurrentSubtype(currentSubtype.without(ExtraValue.LOCALIZED_NUMBER_ROW))
}
}
}
HorizontalDivider()
Text(
stringResource(R.string.settings_screen_secondary_layouts),
style = MaterialTheme.typography.titleMedium
)
LayoutType.entries.forEach { type ->
if (type == LayoutType.MAIN) return@forEach
WithSmallTitle(stringResource(type.displayNameId)) {
val explicitLayout = currentSubtype.layoutName(type)
val layout = explicitLayout ?: Settings.readDefaultLayoutName(type, prefs)
val defaultLayouts = LayoutUtils.getAvailableLayouts(type, ctx)
val customLayouts = LayoutUtilsCustom.getLayoutFiles(type, ctx).map { it.name }
DropDownField(
items = defaultLayouts + customLayouts,
selectedItem = layout,
onSelected = {
setCurrentSubtype(currentSubtype.withLayout(type, it))
},
extraButton = {
DefaultButton(explicitLayout == null) {
setCurrentSubtype(currentSubtype.withoutLayout(type))
}
},
) { ) {
Text(displayName) val displayName =
if (LayoutUtilsCustom.isCustomLayout(it)) if (LayoutUtilsCustom.isCustomLayout(it)) LayoutUtilsCustom.getDisplayName(it)
IconButton({ showLayoutEditDialog = true }) { Icon(painterResource(R.drawable.ic_edit), stringResource(R.string.edit_layout)) } else it.getStringResourceOrName("layout_", ctx)
var showLayoutEditDialog by remember { mutableStateOf(false) }
Row(
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.fillMaxWidth()
) {
Text(displayName)
if (LayoutUtilsCustom.isCustomLayout(it))
IconButton({
showLayoutEditDialog = true
}) {
Icon(
painterResource(R.drawable.ic_edit),
stringResource(R.string.edit_layout)
)
}
}
if (showLayoutEditDialog)
LayoutEditDialog(
onDismissRequest = { showLayoutEditDialog = false },
layoutType = type,
initialLayoutName = it,
isNameValid = null
)
} }
if (showLayoutEditDialog)
LayoutEditDialog(
onDismissRequest = { showLayoutEditDialog = false },
layoutType = type,
initialLayoutName = it,
isNameValid = null
)
} }
} }
} }
} }
} if (showSecondaryLocaleDialog)
if (showSecondaryLocaleDialog) MultiListPickerDialog(
MultiListPickerDialog( onDismissRequest = { showSecondaryLocaleDialog = false },
onDismissRequest = { showSecondaryLocaleDialog = false }, onConfirmed = { locales ->
onConfirmed = { locales -> val newValue = locales.joinToString(Separators.KV) { it.toLanguageTag() }
val newValue = locales.joinToString(Separators.KV) { it.toLanguageTag() } setCurrentSubtype(
setCurrentSubtype( if (newValue.isEmpty()) currentSubtype.without(ExtraValue.SECONDARY_LOCALES)
if (newValue.isEmpty()) currentSubtype.without(ExtraValue.SECONDARY_LOCALES) else currentSubtype.with(ExtraValue.SECONDARY_LOCALES, newValue)
else currentSubtype.with(ExtraValue.SECONDARY_LOCALES, newValue) )
) },
}, title = { Text(stringResource(R.string.locales_with_dict)) },
title = { Text(stringResource(R.string.locales_with_dict)) }, items = availableLocalesForScript,
items = availableLocalesForScript, initialSelection = currentSubtype.getExtraValueOf(ExtraValue.SECONDARY_LOCALES)
initialSelection = currentSubtype.getExtraValueOf(ExtraValue.SECONDARY_LOCALES) ?.split(Separators.KV)?.map { it.constructLocale() }.orEmpty(),
?.split(Separators.KV)?.map { it.constructLocale() }.orEmpty(), getItemName = { it.localizedDisplayName(ctx) }
getItemName = { it.localizedDisplayName(ctx) } )
) if (showKeyOrderDialog) {
if (showKeyOrderDialog) { val setting = currentSubtype.getExtraValueOf(ExtraValue.POPUP_ORDER)
val setting = currentSubtype.getExtraValueOf(ExtraValue.POPUP_ORDER) PopupOrderDialog(
PopupOrderDialog( onDismissRequest = { showKeyOrderDialog = false },
onDismissRequest = { showKeyOrderDialog = false }, initialValue = setting ?: prefs.getString(
initialValue = setting ?: prefs.getString(Settings.PREF_POPUP_KEYS_ORDER, Defaults.PREF_POPUP_KEYS_ORDER)!!, Settings.PREF_POPUP_KEYS_ORDER,
title = stringResource(R.string.popup_order), Defaults.PREF_POPUP_KEYS_ORDER
showDefault = setting != null, )!!,
onConfirmed = { title = stringResource(R.string.popup_order),
setCurrentSubtype( showDefault = setting != null,
if (it == null) currentSubtype.without(ExtraValue.POPUP_ORDER) onConfirmed = {
else currentSubtype.with(ExtraValue.POPUP_ORDER, it) setCurrentSubtype(
) if (it == null) currentSubtype.without(ExtraValue.POPUP_ORDER)
} else currentSubtype.with(ExtraValue.POPUP_ORDER, it)
) )
} }
if (showHintOrderDialog) { )
val setting = currentSubtype.getExtraValueOf(ExtraValue.HINT_ORDER) }
PopupOrderDialog( if (showHintOrderDialog) {
onDismissRequest = { showHintOrderDialog = false }, val setting = currentSubtype.getExtraValueOf(ExtraValue.HINT_ORDER)
initialValue = setting ?: prefs.getString(Settings.PREF_POPUP_KEYS_LABELS_ORDER, Defaults.PREF_POPUP_KEYS_LABELS_ORDER)!!, PopupOrderDialog(
title = stringResource(R.string.hint_source), onDismissRequest = { showHintOrderDialog = false },
showDefault = setting != null, initialValue = setting ?: prefs.getString(
onConfirmed = { Settings.PREF_POPUP_KEYS_LABELS_ORDER,
setCurrentSubtype( Defaults.PREF_POPUP_KEYS_LABELS_ORDER
if (it == null) currentSubtype.without(ExtraValue.HINT_ORDER) )!!,
else currentSubtype.with(ExtraValue.HINT_ORDER, it) title = stringResource(R.string.hint_source),
) showDefault = setting != null,
} onConfirmed = {
) setCurrentSubtype(
} if (it == null) currentSubtype.without(ExtraValue.HINT_ORDER)
if (showMorePopupsDialog) { else currentSubtype.with(ExtraValue.HINT_ORDER, it)
val items = listOf(POPUP_KEYS_NORMAL, POPUP_KEYS_MAIN, POPUP_KEYS_MORE, POPUP_KEYS_ALL) )
val explicitValue = currentSubtype.getExtraValueOf(ExtraValue.MORE_POPUPS) }
val value = explicitValue ?: prefs.getString(Settings.PREF_MORE_POPUP_KEYS, Defaults.PREF_MORE_POPUP_KEYS) )
ListPickerDialog( }
onDismissRequest = { showMorePopupsDialog = false }, if (showMorePopupsDialog) {
items = items, val items = listOf(POPUP_KEYS_NORMAL, POPUP_KEYS_MAIN, POPUP_KEYS_MORE, POPUP_KEYS_ALL)
getItemName = { stringResource(morePopupKeysResId(it)) }, val explicitValue = currentSubtype.getExtraValueOf(ExtraValue.MORE_POPUPS)
selectedItem = value, val value = explicitValue ?: prefs.getString(Settings.PREF_MORE_POPUP_KEYS, Defaults.PREF_MORE_POPUP_KEYS)
onItemSelected = { setCurrentSubtype(currentSubtype.with(ExtraValue.MORE_POPUPS, it)) } ListPickerDialog(
) onDismissRequest = { showMorePopupsDialog = false },
items = items,
getItemName = { stringResource(morePopupKeysResId(it)) },
selectedItem = value,
onItemSelected = { setCurrentSubtype(currentSubtype.with(ExtraValue.MORE_POPUPS, it)) }
)
}
} }
} }