mirror of
https://github.com/Helium314/HeliBoard.git
synced 2025-04-20 14:19:08 +00:00
change subtype dialog to screen
mostly just moved the content and adjusted necessary calls still needs some minor tweaking
This commit is contained in:
parent
ac805a9286
commit
6bbce0b5ca
4 changed files with 145 additions and 135 deletions
|
@ -103,6 +103,7 @@ fun <T: Any?> SearchScreen(
|
||||||
title: @Composable () -> Unit,
|
title: @Composable () -> Unit,
|
||||||
filteredItems: (String) -> List<T>,
|
filteredItems: (String) -> List<T>,
|
||||||
itemContent: @Composable (T) -> Unit,
|
itemContent: @Composable (T) -> Unit,
|
||||||
|
icon: @Composable (() -> Unit)? = null,
|
||||||
menu: List<Pair<String, () -> Unit>>? = null,
|
menu: List<Pair<String, () -> Unit>>? = null,
|
||||||
content: @Composable (ColumnScope.() -> Unit)? = null,
|
content: @Composable (ColumnScope.() -> Unit)? = null,
|
||||||
) {
|
) {
|
||||||
|
@ -137,8 +138,10 @@ fun <T: Any?> SearchScreen(
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
actions = {
|
actions = {
|
||||||
IconButton(onClick = { setShowSearch(!showSearch) })
|
if (icon == null)
|
||||||
{ SearchIcon() }
|
IconButton(onClick = { setShowSearch(!showSearch) }) { SearchIcon() }
|
||||||
|
else
|
||||||
|
icon()
|
||||||
if (menu != null)
|
if (menu != null)
|
||||||
Box {
|
Box {
|
||||||
var showMenu by remember { mutableStateOf(false) }
|
var showMenu by remember { mutableStateOf(false) }
|
||||||
|
|
|
@ -16,6 +16,7 @@ import androidx.navigation.compose.NavHost
|
||||||
import androidx.navigation.compose.composable
|
import androidx.navigation.compose.composable
|
||||||
import androidx.navigation.compose.rememberNavController
|
import androidx.navigation.compose.rememberNavController
|
||||||
import helium314.keyboard.latin.common.LocaleUtils.constructLocale
|
import helium314.keyboard.latin.common.LocaleUtils.constructLocale
|
||||||
|
import helium314.keyboard.latin.settings.SettingsSubtype.Companion.toSettingsSubtype
|
||||||
import helium314.keyboard.settings.screens.AboutScreen
|
import helium314.keyboard.settings.screens.AboutScreen
|
||||||
import helium314.keyboard.settings.screens.AdvancedSettingsScreen
|
import helium314.keyboard.settings.screens.AdvancedSettingsScreen
|
||||||
import helium314.keyboard.settings.screens.AppearanceScreen
|
import helium314.keyboard.settings.screens.AppearanceScreen
|
||||||
|
@ -29,6 +30,7 @@ import helium314.keyboard.settings.screens.PersonalDictionariesScreen
|
||||||
import helium314.keyboard.settings.screens.PersonalDictionaryScreen
|
import helium314.keyboard.settings.screens.PersonalDictionaryScreen
|
||||||
import helium314.keyboard.settings.screens.PreferencesScreen
|
import helium314.keyboard.settings.screens.PreferencesScreen
|
||||||
import helium314.keyboard.settings.screens.SecondaryLayoutScreen
|
import helium314.keyboard.settings.screens.SecondaryLayoutScreen
|
||||||
|
import helium314.keyboard.settings.screens.SubtypeScreen
|
||||||
import helium314.keyboard.settings.screens.TextCorrectionScreen
|
import helium314.keyboard.settings.screens.TextCorrectionScreen
|
||||||
import helium314.keyboard.settings.screens.ToolbarScreen
|
import helium314.keyboard.settings.screens.ToolbarScreen
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
@ -126,6 +128,9 @@ fun SettingsNavHost(
|
||||||
composable(SettingsDestination.ColorsNight + "{theme}") {
|
composable(SettingsDestination.ColorsNight + "{theme}") {
|
||||||
ColorsScreen(isNight = true, theme = it.arguments?.getString("theme"), onClickBack = ::goBack)
|
ColorsScreen(isNight = true, theme = it.arguments?.getString("theme"), onClickBack = ::goBack)
|
||||||
}
|
}
|
||||||
|
composable(SettingsDestination.Subtype + "{subtype}") {
|
||||||
|
SubtypeScreen(initialSubtype = it.arguments?.getString("subtype")!!.toSettingsSubtype(), onClickBack = ::goBack)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (target.value != SettingsDestination.Settings/* && target.value != navController.currentBackStackEntry?.destination?.route*/)
|
if (target.value != SettingsDestination.Settings/* && target.value != navController.currentBackStackEntry?.destination?.route*/)
|
||||||
navController.navigate(route = target.value)
|
navController.navigate(route = target.value)
|
||||||
|
@ -146,6 +151,7 @@ object SettingsDestination {
|
||||||
const val PersonalDictionaries = "personal_dictionaries"
|
const val PersonalDictionaries = "personal_dictionaries"
|
||||||
const val PersonalDictionary = "personal_dictionary/"
|
const val PersonalDictionary = "personal_dictionary/"
|
||||||
const val Languages = "languages"
|
const val Languages = "languages"
|
||||||
|
const val Subtype = "subtype/"
|
||||||
const val Layouts = "layouts"
|
const val Layouts = "layouts"
|
||||||
const val Dictionaries = "dictionaries"
|
const val Dictionaries = "dictionaries"
|
||||||
val navTarget = MutableStateFlow(Settings)
|
val navTarget = MutableStateFlow(Settings)
|
||||||
|
|
|
@ -18,7 +18,6 @@ import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.saveable.rememberSaveable
|
|
||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
@ -39,15 +38,14 @@ import helium314.keyboard.latin.utils.Log
|
||||||
import helium314.keyboard.latin.utils.MissingDictionaryDialog
|
import helium314.keyboard.latin.utils.MissingDictionaryDialog
|
||||||
import helium314.keyboard.latin.utils.SubtypeLocaleUtils
|
import helium314.keyboard.latin.utils.SubtypeLocaleUtils
|
||||||
import helium314.keyboard.latin.utils.SubtypeSettings
|
import helium314.keyboard.latin.utils.SubtypeSettings
|
||||||
import helium314.keyboard.latin.utils.SubtypeUtilsAdditional
|
|
||||||
import helium314.keyboard.latin.utils.displayName
|
import helium314.keyboard.latin.utils.displayName
|
||||||
import helium314.keyboard.latin.utils.getActivity
|
import helium314.keyboard.latin.utils.getActivity
|
||||||
import helium314.keyboard.latin.utils.locale
|
import helium314.keyboard.latin.utils.locale
|
||||||
import helium314.keyboard.latin.utils.prefs
|
import helium314.keyboard.latin.utils.prefs
|
||||||
import helium314.keyboard.settings.SearchScreen
|
import helium314.keyboard.settings.SearchScreen
|
||||||
import helium314.keyboard.settings.SettingsActivity
|
import helium314.keyboard.settings.SettingsActivity
|
||||||
|
import helium314.keyboard.settings.SettingsDestination
|
||||||
import helium314.keyboard.settings.Theme
|
import helium314.keyboard.settings.Theme
|
||||||
import helium314.keyboard.settings.dialogs.SubtypeDialog
|
|
||||||
import helium314.keyboard.settings.initPreview
|
import helium314.keyboard.settings.initPreview
|
||||||
import helium314.keyboard.settings.previewDark
|
import helium314.keyboard.settings.previewDark
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
@ -57,12 +55,11 @@ fun LanguageScreen(
|
||||||
onClickBack: () -> Unit,
|
onClickBack: () -> Unit,
|
||||||
) {
|
) {
|
||||||
val ctx = LocalContext.current
|
val ctx = LocalContext.current
|
||||||
var sortedSubtypes by remember { mutableStateOf(getSortedSubtypes(ctx)) }
|
val sortedSubtypes by remember { mutableStateOf(getSortedSubtypes(ctx)) }
|
||||||
val prefs = ctx.prefs()
|
val prefs = ctx.prefs()
|
||||||
val b = (LocalContext.current.getActivity() as? SettingsActivity)?.prefChanged?.collectAsState()
|
val b = (LocalContext.current.getActivity() as? SettingsActivity)?.prefChanged?.collectAsState()
|
||||||
if ((b?.value ?: 0) < 0)
|
if ((b?.value ?: 0) < 0)
|
||||||
Log.v("irrelevant", "stupid way to trigger recomposition on preference change")
|
Log.v("irrelevant", "stupid way to trigger recomposition on preference change")
|
||||||
var selectedSubtype: String? by rememberSaveable { mutableStateOf(null) }
|
|
||||||
val enabledSubtypes = SubtypeSettings.getEnabledSubtypes()
|
val enabledSubtypes = SubtypeSettings.getEnabledSubtypes()
|
||||||
SearchScreen(
|
SearchScreen(
|
||||||
onClickBack = onClickBack,
|
onClickBack = onClickBack,
|
||||||
|
@ -87,7 +84,9 @@ fun LanguageScreen(
|
||||||
verticalAlignment = Alignment.CenterVertically,
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.clickable { selectedSubtype = item.toSettingsSubtype().toPref() }
|
.clickable {
|
||||||
|
SettingsDestination.navigateTo(SettingsDestination.Subtype + item.toSettingsSubtype().toPref())
|
||||||
|
}
|
||||||
.padding(vertical = 6.dp, horizontal = 16.dp)
|
.padding(vertical = 6.dp, horizontal = 16.dp)
|
||||||
) {
|
) {
|
||||||
var showNoDictDialog by remember { mutableStateOf(false) }
|
var showNoDictDialog by remember { mutableStateOf(false) }
|
||||||
|
@ -119,19 +118,6 @@ fun LanguageScreen(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
if (selectedSubtype != null) {
|
|
||||||
val oldSubtype = selectedSubtype!!.toSettingsSubtype()
|
|
||||||
SubtypeDialog(
|
|
||||||
onDismissRequest = {
|
|
||||||
selectedSubtype = null
|
|
||||||
sortedSubtypes = getSortedSubtypes(ctx)
|
|
||||||
},
|
|
||||||
onConfirmed = {
|
|
||||||
SubtypeUtilsAdditional.changeAdditionalSubtype(oldSubtype, it, ctx)
|
|
||||||
},
|
|
||||||
initialSubtype = oldSubtype
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun dictsAvailable(locale: Locale, context: Context): Boolean {
|
private fun dictsAvailable(locale: Locale, context: Context): Boolean {
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
// SPDX-License-Identifier: GPL-3.0-only
|
package helium314.keyboard.settings.screens
|
||||||
package helium314.keyboard.settings.dialogs
|
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import androidx.compose.foundation.clickable
|
import androidx.compose.foundation.clickable
|
||||||
|
@ -14,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.Surface
|
||||||
import androidx.compose.material3.Switch
|
import androidx.compose.material3.Switch
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.material3.TextButton
|
import androidx.compose.material3.TextButton
|
||||||
|
@ -68,22 +68,32 @@ import helium314.keyboard.latin.utils.getStringResourceOrName
|
||||||
import helium314.keyboard.latin.utils.mainLayoutName
|
import helium314.keyboard.latin.utils.mainLayoutName
|
||||||
import helium314.keyboard.latin.utils.prefs
|
import helium314.keyboard.latin.utils.prefs
|
||||||
import helium314.keyboard.settings.DefaultButton
|
import helium314.keyboard.settings.DefaultButton
|
||||||
|
import helium314.keyboard.settings.DeleteButton
|
||||||
import helium314.keyboard.settings.DropDownField
|
import helium314.keyboard.settings.DropDownField
|
||||||
|
import helium314.keyboard.settings.SearchScreen
|
||||||
import helium314.keyboard.settings.SettingsActivity
|
import helium314.keyboard.settings.SettingsActivity
|
||||||
import helium314.keyboard.settings.Theme
|
import helium314.keyboard.settings.Theme
|
||||||
import helium314.keyboard.settings.WithSmallTitle
|
import helium314.keyboard.settings.WithSmallTitle
|
||||||
|
import helium314.keyboard.settings.dialogs.ConfirmationDialog
|
||||||
|
import helium314.keyboard.settings.dialogs.LayoutEditDialog
|
||||||
|
import helium314.keyboard.settings.dialogs.ListPickerDialog
|
||||||
|
import helium314.keyboard.settings.dialogs.MultiListPickerDialog
|
||||||
|
import helium314.keyboard.settings.dialogs.ReorderDialog
|
||||||
import helium314.keyboard.settings.initPreview
|
import helium314.keyboard.settings.initPreview
|
||||||
import helium314.keyboard.settings.layoutFilePicker
|
import helium314.keyboard.settings.layoutFilePicker
|
||||||
import helium314.keyboard.settings.layoutIntent
|
import helium314.keyboard.settings.layoutIntent
|
||||||
import helium314.keyboard.settings.previewDark
|
import helium314.keyboard.settings.previewDark
|
||||||
import helium314.keyboard.settings.screens.GetIcon
|
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
|
||||||
|
// todo:
|
||||||
|
// dropdowns are weird
|
||||||
|
// at very least too wide and too high
|
||||||
|
// also too wide left (anchor should be icon)
|
||||||
|
// title shows only the layout name
|
||||||
@Composable
|
@Composable
|
||||||
fun SubtypeDialog(
|
fun SubtypeScreen(
|
||||||
onDismissRequest: () -> Unit,
|
|
||||||
initialSubtype: SettingsSubtype,
|
initialSubtype: SettingsSubtype,
|
||||||
onConfirmed: (SettingsSubtype) -> Unit,
|
onClickBack: () -> Unit,
|
||||||
) {
|
) {
|
||||||
val ctx = LocalContext.current
|
val ctx = LocalContext.current
|
||||||
val prefs = ctx.prefs()
|
val prefs = ctx.prefs()
|
||||||
|
@ -92,7 +102,10 @@ fun SubtypeDialog(
|
||||||
Log.v("irrelevant", "stupid way to trigger recomposition on preference change")
|
Log.v("irrelevant", "stupid way to trigger recomposition on preference change")
|
||||||
var currentSubtypeString by rememberSaveable { mutableStateOf(initialSubtype.toPref()) }
|
var currentSubtypeString by rememberSaveable { mutableStateOf(initialSubtype.toPref()) }
|
||||||
val currentSubtype = currentSubtypeString.toSettingsSubtype()
|
val currentSubtype = currentSubtypeString.toSettingsSubtype()
|
||||||
fun setCurrentSubtype(subtype: SettingsSubtype) { currentSubtypeString = subtype.toPref() }
|
fun setCurrentSubtype(subtype: SettingsSubtype) {
|
||||||
|
SubtypeUtilsAdditional.changeAdditionalSubtype(currentSubtype, subtype, ctx)
|
||||||
|
currentSubtypeString = subtype.toPref()
|
||||||
|
}
|
||||||
LaunchedEffect(currentSubtypeString) {
|
LaunchedEffect(currentSubtypeString) {
|
||||||
if (ScriptUtils.scriptSupportsUppercase(currentSubtype.locale)) return@LaunchedEffect
|
if (ScriptUtils.scriptSupportsUppercase(currentSubtype.locale)) return@LaunchedEffect
|
||||||
// update the noShiftKey extra value
|
// update the noShiftKey extra value
|
||||||
|
@ -120,120 +133,119 @@ fun SubtypeDialog(
|
||||||
var showMorePopupsDialog by remember { mutableStateOf(false) }
|
var showMorePopupsDialog by remember { mutableStateOf(false) }
|
||||||
val scrollState = rememberScrollState()
|
val scrollState = rememberScrollState()
|
||||||
val customMainLayouts = LayoutUtilsCustom.getLayoutFiles(LayoutType.MAIN, ctx, currentSubtype.locale).map { it.name }
|
val customMainLayouts = LayoutUtilsCustom.getLayoutFiles(LayoutType.MAIN, ctx, currentSubtype.locale).map { it.name }
|
||||||
ThreeButtonAlertDialog(
|
SearchScreen(
|
||||||
onDismissRequest = onDismissRequest,
|
onClickBack = onClickBack,
|
||||||
onConfirmed = { onConfirmed(currentSubtype) },
|
icon = { if (currentSubtype.isAdditionalSubtype(prefs)) DeleteButton {
|
||||||
neutralButtonText = if (initialSubtype.isAdditionalSubtype(prefs)) stringResource(R.string.delete) else null,
|
SubtypeUtilsAdditional.removeAdditionalSubtype(ctx, currentSubtype.toAdditionalSubtype())
|
||||||
onNeutral = {
|
SubtypeSettings.removeEnabledSubtype(ctx, currentSubtype.toAdditionalSubtype())
|
||||||
SubtypeUtilsAdditional.removeAdditionalSubtype(ctx, initialSubtype.toAdditionalSubtype())
|
onClickBack()
|
||||||
SubtypeSettings.removeEnabledSubtype(ctx, initialSubtype.toAdditionalSubtype())
|
} },
|
||||||
onDismissRequest()
|
|
||||||
},
|
|
||||||
title = {
|
title = {
|
||||||
val mainLayout = initialSubtype.mainLayoutName() ?: SubtypeLocaleUtils.QWERTY
|
val mainLayout = currentSubtype.mainLayoutName() ?: SubtypeLocaleUtils.QWERTY
|
||||||
Text(SubtypeLocaleUtils.getDisplayNameInSystemLocale(mainLayout, initialSubtype.locale))
|
Text(SubtypeLocaleUtils.getDisplayNameInSystemLocale(mainLayout, currentSubtype.locale))
|
||||||
},
|
},
|
||||||
content = {
|
itemContent = { },
|
||||||
Column(
|
filteredItems = { emptyList<String>() }
|
||||||
modifier = Modifier.verticalScroll(scrollState),
|
) {
|
||||||
verticalArrangement = Arrangement.spacedBy(8.dp),
|
Column(
|
||||||
) {
|
modifier = Modifier.verticalScroll(scrollState).padding(horizontal = 12.dp),
|
||||||
MainLayoutRow(initialSubtype, 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))
|
Row {
|
||||||
{ Text(stringResource(R.string.popup_order)) }
|
TextButton(onClick = { showKeyOrderDialog = true }, Modifier.weight(1f))
|
||||||
DefaultButton(currentSubtype.getExtraValueOf(ExtraValue.POPUP_ORDER) == null) {
|
{ Text(stringResource(R.string.popup_order)) }
|
||||||
setCurrentSubtype(currentSubtype.without(ExtraValue.POPUP_ORDER))
|
DefaultButton(currentSubtype.getExtraValueOf(ExtraValue.POPUP_ORDER) == null) {
|
||||||
}
|
setCurrentSubtype(currentSubtype.without(ExtraValue.POPUP_ORDER))
|
||||||
}
|
}
|
||||||
Row {
|
}
|
||||||
TextButton(onClick = { showHintOrderDialog = true }, Modifier.weight(1f))
|
Row {
|
||||||
{ Text(stringResource(R.string.hint_source)) }
|
TextButton(onClick = { showHintOrderDialog = true }, Modifier.weight(1f))
|
||||||
DefaultButton(currentSubtype.getExtraValueOf(ExtraValue.HINT_ORDER) == null) {
|
{ Text(stringResource(R.string.hint_source)) }
|
||||||
setCurrentSubtype(currentSubtype.without(ExtraValue.HINT_ORDER))
|
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)) {
|
if (currentSubtype.locale.script() == ScriptUtils.SCRIPT_LATIN) {
|
||||||
val explicitValue = currentSubtype.getExtraValueOf(ExtraValue.MORE_POPUPS)
|
WithSmallTitle(stringResource(R.string.show_popup_keys_title)) {
|
||||||
val value = explicitValue ?: prefs.getString(Settings.PREF_MORE_POPUP_KEYS, Defaults.PREF_MORE_POPUP_KEYS)!!
|
val explicitValue = currentSubtype.getExtraValueOf(ExtraValue.MORE_POPUPS)
|
||||||
Row {
|
val value = explicitValue ?: prefs.getString(Settings.PREF_MORE_POPUP_KEYS, Defaults.PREF_MORE_POPUP_KEYS)!!
|
||||||
TextButton(onClick = { showMorePopupsDialog = true }, Modifier.weight(1f))
|
Row {
|
||||||
{ Text(stringResource(morePopupKeysResId(value))) }
|
TextButton(onClick = { showMorePopupsDialog = true }, Modifier.weight(1f))
|
||||||
DefaultButton(explicitValue == null) {
|
{ Text(stringResource(morePopupKeysResId(value))) }
|
||||||
setCurrentSubtype(currentSubtype.without(ExtraValue.MORE_POPUPS))
|
DefaultButton(explicitValue == null) {
|
||||||
}
|
setCurrentSubtype(currentSubtype.without(ExtraValue.MORE_POPUPS))
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (hasLocalizedNumberRow(currentSubtype.locale, ctx)) {
|
|
||||||
Row(verticalAlignment = Alignment.CenterVertically) {
|
|
||||||
val checked = currentSubtype.getExtraValueOf(ExtraValue.LOCALIZED_NUMBER_ROW)?.toBoolean()
|
|
||||||
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))
|
|
||||||
} },
|
|
||||||
) {
|
|
||||||
val displayName = if (LayoutUtilsCustom.isCustomLayout(it)) LayoutUtilsCustom.getDisplayName(it)
|
|
||||||
else it.getStringResourceOrName("layout_", ctx)
|
|
||||||
var showLayoutEditDialog by remember { mutableStateOf(false) }
|
|
||||||
Row(
|
|
||||||
horizontalArrangement = Arrangement.SpaceBetween,
|
|
||||||
modifier = Modifier.fillMaxWidth()
|
|
||||||
) {
|
|
||||||
Text(displayName, Modifier.padding(end = 8.dp))
|
|
||||||
if (LayoutUtilsCustom.isCustomLayout(it))
|
|
||||||
Icon(painterResource(R.drawable.ic_edit), stringResource(R.string.edit_layout), Modifier.clickable { showLayoutEditDialog = true })
|
|
||||||
}
|
|
||||||
if (showLayoutEditDialog)
|
|
||||||
LayoutEditDialog(
|
|
||||||
onDismissRequest = { showLayoutEditDialog = false },
|
|
||||||
layoutType = type,
|
|
||||||
initialLayoutName = it,
|
|
||||||
isNameValid = null
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (hasLocalizedNumberRow(currentSubtype.locale, ctx)) {
|
||||||
|
Row(verticalAlignment = Alignment.CenterVertically) {
|
||||||
|
val checked = currentSubtype.getExtraValueOf(ExtraValue.LOCALIZED_NUMBER_ROW)?.toBoolean()
|
||||||
|
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))
|
||||||
|
} },
|
||||||
|
) {
|
||||||
|
val displayName = if (LayoutUtilsCustom.isCustomLayout(it)) LayoutUtilsCustom.getDisplayName(it)
|
||||||
|
else it.getStringResourceOrName("layout_", ctx)
|
||||||
|
var showLayoutEditDialog by remember { mutableStateOf(false) }
|
||||||
|
Row(
|
||||||
|
horizontalArrangement = Arrangement.SpaceBetween,
|
||||||
|
modifier = Modifier.fillMaxWidth()
|
||||||
|
) {
|
||||||
|
Text(displayName, Modifier.padding(end = 8.dp))
|
||||||
|
if (LayoutUtilsCustom.isCustomLayout(it))
|
||||||
|
Icon(painterResource(R.drawable.ic_edit), stringResource(R.string.edit_layout), Modifier.clickable { showLayoutEditDialog = true })
|
||||||
|
}
|
||||||
|
if (showLayoutEditDialog)
|
||||||
|
LayoutEditDialog(
|
||||||
|
onDismissRequest = { showLayoutEditDialog = false },
|
||||||
|
layoutType = type,
|
||||||
|
initialLayoutName = it,
|
||||||
|
isNameValid = null
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
)
|
}
|
||||||
if (showSecondaryLocaleDialog)
|
if (showSecondaryLocaleDialog)
|
||||||
MultiListPickerDialog(
|
MultiListPickerDialog(
|
||||||
onDismissRequest = { showSecondaryLocaleDialog = false },
|
onDismissRequest = { showSecondaryLocaleDialog = false },
|
||||||
|
@ -294,6 +306,7 @@ fun SubtypeDialog(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// from ReorderSwitchPreference
|
// from ReorderSwitchPreference
|
||||||
@Composable
|
@Composable
|
||||||
private fun PopupOrderDialog(
|
private fun PopupOrderDialog(
|
||||||
|
@ -336,7 +349,6 @@ private fun PopupOrderDialog(
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun MainLayoutRow(
|
private fun MainLayoutRow(
|
||||||
initialSubtype: SettingsSubtype,
|
|
||||||
currentSubtype: SettingsSubtype,
|
currentSubtype: SettingsSubtype,
|
||||||
customLayouts: List<String>,
|
customLayouts: List<String>,
|
||||||
setCurrentSubtype: (SettingsSubtype) -> Unit,
|
setCurrentSubtype: (SettingsSubtype) -> Unit,
|
||||||
|
@ -369,13 +381,13 @@ private fun MainLayoutRow(
|
||||||
Text(SubtypeLocaleUtils.getDisplayNameInSystemLocale(it, currentSubtype.locale))
|
Text(SubtypeLocaleUtils.getDisplayNameInSystemLocale(it, currentSubtype.locale))
|
||||||
Row (verticalAlignment = Alignment.CenterVertically) {
|
Row (verticalAlignment = Alignment.CenterVertically) {
|
||||||
Icon(painterResource(R.drawable.ic_edit), stringResource(R.string.edit_layout), Modifier.clickable { showLayoutEditDialog = it to null })
|
Icon(painterResource(R.drawable.ic_edit), stringResource(R.string.edit_layout), Modifier.clickable { showLayoutEditDialog = it to null })
|
||||||
if (it in customLayouts && initialSubtype.mainLayoutName() != it) // don't allow current main layout
|
if (it in customLayouts && currentSubtype.mainLayoutName() != it) // don't allow current main layout // todo: this was initialSubtype, maybe needs adjustment now
|
||||||
Icon(painterResource(R.drawable.ic_bin), stringResource(R.string.delete), Modifier.clickable { showLayoutDeleteDialog = true })
|
Icon(painterResource(R.drawable.ic_bin), stringResource(R.string.delete), Modifier.clickable { showLayoutDeleteDialog = true })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (showLayoutDeleteDialog) {
|
if (showLayoutDeleteDialog) {
|
||||||
val others = SubtypeSettings.getAdditionalSubtypes().filter { st -> st.mainLayoutName() == it }
|
val others = SubtypeSettings.getAdditionalSubtypes().filter { st -> st.mainLayoutName() == it }
|
||||||
.any { it.toSettingsSubtype() != initialSubtype }
|
.any { it.toSettingsSubtype() != currentSubtype } // todo: this was initialSubtype, maybe needs adjustment now
|
||||||
ConfirmationDialog(
|
ConfirmationDialog(
|
||||||
onDismissRequest = { showLayoutDeleteDialog = false },
|
onDismissRequest = { showLayoutDeleteDialog = false },
|
||||||
confirmButtonText = stringResource(R.string.delete),
|
confirmButtonText = stringResource(R.string.delete),
|
||||||
|
@ -442,11 +454,14 @@ private fun MainLayoutRow(
|
||||||
private fun getAvailableSecondaryLocales(context: Context, mainLocale: Locale): List<Locale> =
|
private fun getAvailableSecondaryLocales(context: Context, mainLocale: Locale): List<Locale> =
|
||||||
getDictionaryLocales(context).filter { it != mainLocale && it.script() == mainLocale.script() }
|
getDictionaryLocales(context).filter { it != mainLocale && it.script() == mainLocale.script() }
|
||||||
|
|
||||||
|
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
private fun Preview() {
|
private fun Preview() {
|
||||||
initPreview(LocalContext.current)
|
initPreview(LocalContext.current)
|
||||||
Theme(previewDark) {
|
Theme(previewDark) {
|
||||||
SubtypeDialog({}, SettingsSubtype(Locale.ENGLISH, "")) { }
|
Surface {
|
||||||
|
SubtypeScreen(SettingsSubtype(Locale.ENGLISH, "")) { }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Add table
Reference in a new issue