From b4f3732cde8ca4f1552e9dcde963e4c571fe88d8 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sun, 2 Mar 2025 10:36:05 +0100 Subject: [PATCH] better details for dictionaries --- .../java/helium314/keyboard/settings/Icons.kt | 17 +++- .../java/helium314/keyboard/settings/Misc.kt | 16 +--- .../settings/dialogs/DictionaryDialog.kt | 78 +++++++++++++------ app/src/main/res/values/strings.xml | 2 +- 4 files changed, 71 insertions(+), 42 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/settings/Icons.kt b/app/src/main/java/helium314/keyboard/settings/Icons.kt index 3040b7748..676af9aa1 100644 --- a/app/src/main/java/helium314/keyboard/settings/Icons.kt +++ b/app/src/main/java/helium314/keyboard/settings/Icons.kt @@ -9,6 +9,7 @@ import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.rotate import androidx.compose.ui.draw.scale import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -47,6 +48,17 @@ fun DefaultButton(isDefault: Boolean, onClick: () -> Unit) { } } +@Composable +fun ExpandButton(enabled: Boolean = true, onClick: () -> Unit) { + IconButton(onClick = onClick, enabled = enabled) { + Icon( + painterResource(R.drawable.ic_arrow_left), + "expand", + Modifier.rotate(-90f) + ) + } +} + @Preview @Composable private fun Preview() { @@ -56,9 +68,10 @@ private fun Preview() { NextScreenIcon() SearchIcon() CloseIcon(R.string.dialog_close) - EditButton { } - DeleteButton { } + EditButton { } + DeleteButton { } DefaultButton(false) { } + ExpandButton { } } } } diff --git a/app/src/main/java/helium314/keyboard/settings/Misc.kt b/app/src/main/java/helium314/keyboard/settings/Misc.kt index 2926c05fd..bc1ccd2b0 100644 --- a/app/src/main/java/helium314/keyboard/settings/Misc.kt +++ b/app/src/main/java/helium314/keyboard/settings/Misc.kt @@ -7,8 +7,6 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.padding import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -18,10 +16,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.rotate -import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp -import helium314.keyboard.latin.R @Composable @@ -54,16 +49,7 @@ fun DropDownField( Box(Modifier.weight(1f)) { itemContent(selectedItem) } - IconButton( - onClick = { expanded = !expanded }, - enabled = items.size > 1 - ) { - Icon( - painterResource(R.drawable.ic_arrow_left), - "show dropdown", - Modifier.rotate(-90f) - ) - } + ExpandButton(items.size > 1) { expanded = !expanded } if (extraButton != null) extraButton() } diff --git a/app/src/main/java/helium314/keyboard/settings/dialogs/DictionaryDialog.kt b/app/src/main/java/helium314/keyboard/settings/dialogs/DictionaryDialog.kt index 5010a3c7c..7cbc5e942 100644 --- a/app/src/main/java/helium314/keyboard/settings/dialogs/DictionaryDialog.kt +++ b/app/src/main/java/helium314/keyboard/settings/dialogs/DictionaryDialog.kt @@ -2,6 +2,12 @@ package helium314.keyboard.settings.dialogs import android.content.Intent +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.EnterTransition +import androidx.compose.animation.expandVertically +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.slideInVertically import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -10,6 +16,8 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.LocalTextStyle import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text @@ -20,7 +28,9 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.rotate import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -32,10 +42,13 @@ import helium314.keyboard.latin.common.LocaleUtils.localizedDisplayName import helium314.keyboard.latin.utils.DictionaryInfoUtils import helium314.keyboard.latin.utils.createDictionaryTextAnnotated import helium314.keyboard.settings.DeleteButton +import helium314.keyboard.settings.ExpandButton import helium314.keyboard.settings.Theme import helium314.keyboard.settings.dictionaryFilePicker +import helium314.keyboard.settings.preferences.PreferenceCategory import helium314.keyboard.settings.previewDark import helium314.keyboard.settings.screens.getUserAndInternalDictionaries +import java.io.File import java.util.Locale @Composable @@ -45,6 +58,8 @@ fun DictionaryDialog( ) { val ctx = LocalContext.current val (dictionaries, hasInternal) = getUserAndInternalDictionaries(ctx, locale) + val mainDict = dictionaries.firstOrNull { it.name == Dictionary.TYPE_MAIN + "_" + DictionaryInfoUtils.USER_DICTIONARY_SUFFIX } + val addonDicts = dictionaries.filterNot { it == mainDict } val picker = dictionaryFilePicker(locale) ThreeButtonAlertDialog( onDismissRequest = onDismissRequest, @@ -56,33 +71,15 @@ fun DictionaryDialog( val state = rememberScrollState() Column(Modifier.verticalScroll(state)) { if (hasInternal) { - val color = if (dictionaries.none { it.startsWith(Dictionary.TYPE_MAIN + ":") }) MaterialTheme.colorScheme.onSurface + val color = if (mainDict == null) MaterialTheme.colorScheme.onSurface else MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f) // for disabled look Text(stringResource(R.string.internal_dictionary_summary), color = color, modifier = Modifier.fillMaxWidth()) } - dictionaries.forEach { - val header = DictionaryInfoUtils.getDictionaryFileHeaderOrNull(it) - val type = header?.mIdString?.substringBefore(":") - var showDeleteDialog by remember { mutableStateOf(false) } - if (header != null) { - HorizontalDivider() - Row( - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.fillMaxWidth().padding(vertical = 8.dp) - ) { - Column { - Text(header.info(LocalContext.current.resources.configuration.locale()), style = MaterialTheme.typography.bodyMedium) - } - DeleteButton { showDeleteDialog = true } - } - } - if (showDeleteDialog) - ConfirmationDialog( - onDismissRequest = { showDeleteDialog = false }, - onConfirmed = { it.delete() }, - content = { Text(stringResource(R.string.remove_dictionary_message, type ?: ""))} - ) + if (mainDict != null) + DictionaryDetails(mainDict) + if (addonDicts.isNotEmpty()) { + PreferenceCategory(stringResource(R.string.dictionary_settings_title)) + addonDicts.forEach { DictionaryDetails(it) } } val dictString = createDictionaryTextAnnotated(locale) if (dictString.isNotEmpty()) { @@ -101,6 +98,39 @@ fun DictionaryDialog( ) } +@Composable +private fun DictionaryDetails(dict: File) { + val header = DictionaryInfoUtils.getDictionaryFileHeaderOrNull(dict) ?: return + val type = header.mIdString.substringBefore(":") + var showDeleteDialog by remember { mutableStateOf(false) } + var showDetails by remember { mutableStateOf(false) } + val title = if (type != DictionaryInfoUtils.DEFAULT_MAIN_DICT) type + else stringResource(R.string.main_dictionary) + Row( + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.fillMaxWidth() + ) { + Text(title, style = MaterialTheme.typography.titleSmall, modifier = Modifier.weight(1f)) + DeleteButton { showDeleteDialog = true } + ExpandButton { showDetails = !showDetails } + } + AnimatedVisibility(showDetails, enter = fadeIn(), exit = fadeOut()) { // default animation looks better, but makes the dialog flash + Text( + header.info(LocalContext.current.resources.configuration.locale()), + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.padding(horizontal = 10.dp) + ) + } + if (showDeleteDialog) + ConfirmationDialog( + onDismissRequest = { showDeleteDialog = false }, + confirmButtonText = stringResource(R.string.remove), + onConfirmed = { dict.delete() }, + content = { Text(stringResource(R.string.remove_dictionary_message, type))} + ) +} + @Preview @Composable private fun Preview() { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 566196b34..903b3cbd7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -634,7 +634,7 @@ disposition rather than other common dispositions for Latin languages. --> Display application icon in the launcher - Add-on dictionaries + Add-on dictionaries Dictionaries