From af62b25077432a9df1c5f5a23bf15de9dd4c93fc Mon Sep 17 00:00:00 2001 From: Bing ZHEUNG Date: Tue, 2 Jul 2024 10:44:54 +0800 Subject: [PATCH] Improve LeftKey and RightKey --- .../jyutping/JyutpingInputMethodService.kt | 5 +- .../jyutping/extensions/StringExtensions.kt | 3 ++ .../org/jyutping/jyutping/keyboard/LeftKey.kt | 48 ++++++++++++++++--- .../jyutping/jyutping/keyboard/RightKey.kt | 48 ++++++++++++++++--- 4 files changed, 88 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/org/jyutping/jyutping/JyutpingInputMethodService.kt b/app/src/main/java/org/jyutping/jyutping/JyutpingInputMethodService.kt index aa21000..9adcb20 100644 --- a/app/src/main/java/org/jyutping/jyutping/JyutpingInputMethodService.kt +++ b/app/src/main/java/org/jyutping/jyutping/JyutpingInputMethodService.kt @@ -16,6 +16,7 @@ import androidx.savedstate.SavedStateRegistryController import androidx.savedstate.SavedStateRegistryOwner import androidx.savedstate.setViewTreeSavedStateRegistryOwner import org.jyutping.jyutping.extensions.keyboardLightBackground +import org.jyutping.jyutping.extensions.separator import org.jyutping.jyutping.extensions.space import org.jyutping.jyutping.keyboard.Candidate import org.jyutping.jyutping.keyboard.InputMethodMode @@ -167,7 +168,7 @@ class JyutpingInputMethodService: LifecycleInputMethodService(), } fun leftKey() { if (isBuffering.value) { - // TODO: Separator + bufferText += String.separator } else { val text: String = when (inputMethodMode.value) { InputMethodMode.Cantonese -> "," @@ -178,7 +179,7 @@ class JyutpingInputMethodService: LifecycleInputMethodService(), } fun rightKey() { if (isBuffering.value) { - // TODO: Separator + bufferText += String.separator } else { val text: String = when (inputMethodMode.value) { InputMethodMode.Cantonese -> "。" diff --git a/app/src/main/java/org/jyutping/jyutping/extensions/StringExtensions.kt b/app/src/main/java/org/jyutping/jyutping/extensions/StringExtensions.kt index 4c5fa98..6879624 100644 --- a/app/src/main/java/org/jyutping/jyutping/extensions/StringExtensions.kt +++ b/app/src/main/java/org/jyutping/jyutping/extensions/StringExtensions.kt @@ -8,6 +8,9 @@ fun String.convertedT2S(): String = Transliterator.getInstance("Traditional-Simp val String.Companion.space: String get() = " " +val String.Companion.separator: String + get() = "'" + fun String.charcode(): Int? { if (this.length >= 10) return null val codes = this.mapNotNull { it.intercode() } diff --git a/app/src/main/java/org/jyutping/jyutping/keyboard/LeftKey.kt b/app/src/main/java/org/jyutping/jyutping/keyboard/LeftKey.kt index ac59e56..f60d9c3 100644 --- a/app/src/main/java/org/jyutping/jyutping/keyboard/LeftKey.kt +++ b/app/src/main/java/org/jyutping/jyutping/keyboard/LeftKey.kt @@ -4,7 +4,9 @@ import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.interaction.collectIsPressedAsState +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding @@ -14,6 +16,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext @@ -22,6 +25,7 @@ import androidx.compose.ui.unit.sp import org.jyutping.jyutping.JyutpingInputMethodService import org.jyutping.jyutping.extensions.keyLight import org.jyutping.jyutping.extensions.keyLightEmphatic +import org.jyutping.jyutping.extensions.separator @Composable fun LeftKey(modifier: Modifier) { @@ -29,9 +33,10 @@ fun LeftKey(modifier: Modifier) { val isPressed = interactionSource.collectIsPressedAsState() val context = LocalContext.current as JyutpingInputMethodService val inputMethodMode = remember { context.inputMethodMode } - val keyText: String = when (inputMethodMode.value) { - InputMethodMode.Cantonese -> "," - InputMethodMode.ABC -> "," + val isBuffering = remember { context.isBuffering } + val keyForm: LeftKeyForm = when (inputMethodMode.value) { + InputMethodMode.Cantonese -> if (isBuffering.value) LeftKeyForm.Buffering else LeftKeyForm.Cantonese + InputMethodMode.ABC -> LeftKeyForm.ABC } Box( modifier = modifier @@ -49,10 +54,39 @@ fun LeftKey(modifier: Modifier) { .fillMaxHeight(), contentAlignment = Alignment.Center ) { - Text( - text = keyText, - fontSize = 20.sp - ) + if (keyForm.isBuffering()) { + Column( + verticalArrangement = Arrangement.spacedBy(0.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text( + text = keyForm.keyText(), + fontSize = 20.sp + ) + Text( + text = "分隔", + modifier =Modifier.alpha(0.85f), + fontSize = 10.sp + ) + } + } else { + Text( + text = keyForm.keyText(), + fontSize = 20.sp + ) + } } } } + +private enum class LeftKeyForm { + Cantonese, + Buffering, + ABC +} +private fun LeftKeyForm.isBuffering(): Boolean = (this == LeftKeyForm.Buffering) +private fun LeftKeyForm.keyText(): String = when (this) { + LeftKeyForm.Cantonese -> "," + LeftKeyForm.Buffering -> String.separator + LeftKeyForm.ABC -> "," +} diff --git a/app/src/main/java/org/jyutping/jyutping/keyboard/RightKey.kt b/app/src/main/java/org/jyutping/jyutping/keyboard/RightKey.kt index a2bfed0..0e8a645 100644 --- a/app/src/main/java/org/jyutping/jyutping/keyboard/RightKey.kt +++ b/app/src/main/java/org/jyutping/jyutping/keyboard/RightKey.kt @@ -4,7 +4,9 @@ import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.interaction.collectIsPressedAsState +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding @@ -14,6 +16,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext @@ -22,6 +25,7 @@ import androidx.compose.ui.unit.sp import org.jyutping.jyutping.JyutpingInputMethodService import org.jyutping.jyutping.extensions.keyLight import org.jyutping.jyutping.extensions.keyLightEmphatic +import org.jyutping.jyutping.extensions.separator @Composable fun RightKey(modifier: Modifier) { @@ -29,9 +33,10 @@ fun RightKey(modifier: Modifier) { val isPressed = interactionSource.collectIsPressedAsState() val context = LocalContext.current as JyutpingInputMethodService val inputMethodMode = remember { context.inputMethodMode } - val keyText: String = when (inputMethodMode.value) { - InputMethodMode.Cantonese -> "。" - InputMethodMode.ABC -> "." + val isBuffering = remember { context.isBuffering } + val keyForm: RightKeyForm = when (inputMethodMode.value) { + InputMethodMode.Cantonese -> if (isBuffering.value) RightKeyForm.Buffering else RightKeyForm.Cantonese + InputMethodMode.ABC -> RightKeyForm.ABC } Box( modifier = modifier @@ -49,10 +54,39 @@ fun RightKey(modifier: Modifier) { .fillMaxHeight(), contentAlignment = Alignment.Center ) { - Text( - text = keyText, - fontSize = 20.sp - ) + if (keyForm.isBuffering()) { + Column( + verticalArrangement = Arrangement.spacedBy(0.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text( + text = keyForm.keyText(), + fontSize = 20.sp + ) + Text( + text = "分隔", + modifier =Modifier.alpha(0.85f), + fontSize = 10.sp + ) + } + } else { + Text( + text = keyForm.keyText(), + fontSize = 20.sp + ) + } } } } + +private enum class RightKeyForm { + Cantonese, + Buffering, + ABC +} +private fun RightKeyForm.isBuffering(): Boolean = (this == RightKeyForm.Buffering) +private fun RightKeyForm.keyText(): String = when (this) { + RightKeyForm.Cantonese -> "。" + RightKeyForm.Buffering -> String.separator + RightKeyForm.ABC -> "." +}