gioser

sergio/humanoid

HTML 44Markdown 1TOML 10 Definitions

⎇ e3dd167a16e071c181b3d4f3bc77664f9cf053ab keyboard/src/main/java/com/rizoma/trazo/ui/KeyboardScreen.kt 97 lines · 3.3 KB History raw

Trazo: teclado MessagEase remasterizado (IME v0.1) e3dd167a1 · sergio ·

1package com.rizoma.trazo.ui
2
3import androidx.compose.foundation.background
4import androidx.compose.foundation.clickable
5import androidx.compose.foundation.layout.Box
6import androidx.compose.foundation.layout.Column
7import androidx.compose.foundation.layout.Row
8import androidx.compose.foundation.layout.fillMaxHeight
9import androidx.compose.foundation.layout.fillMaxWidth
10import androidx.compose.foundation.layout.height
11import androidx.compose.foundation.layout.padding
12import androidx.compose.foundation.shape.RoundedCornerShape
13import androidx.compose.material3.Text
14import androidx.compose.runtime.Composable
15import androidx.compose.ui.Alignment
16import androidx.compose.ui.Modifier
17import androidx.compose.ui.draw.clip
18import androidx.compose.ui.graphics.Color
19import androidx.compose.ui.text.font.FontWeight
20import androidx.compose.ui.unit.dp
21import androidx.compose.ui.unit.sp
22import com.rizoma.trazo.ime.KeyboardController
23import com.rizoma.trazo.ime.Layer
24import com.rizoma.trazo.ime.ShiftState
25import com.rizoma.trazo.ui.theme.NeonCian
26import com.rizoma.trazo.ui.theme.NeonRosa
27import com.rizoma.trazo.ui.theme.NeonVerde
28import com.rizoma.trazo.ui.theme.Tecla
29import com.rizoma.trazo.ui.theme.Tenue
30import com.rizoma.trazo.ui.theme.Vacio
31
32@Composable
33fun KeyboardScreen(controller: KeyboardController) {
34    Column(
35        Modifier
36            .fillMaxWidth()
37            .background(Vacio)
38            .padding(4.dp),
39    ) {
40        val keys = controller.keys
41        // 3 filas × 3 teclas.
42        for (row in 0 until 3) {
43            Row(Modifier.fillMaxWidth().height(70.dp)) {
44                for (col in 0 until 3) {
45                    KeyCell(
46                        key = keys[row * 3 + col],
47                        shifted = controller.shifted,
48                        onChar = controller::onChar,
49                        modifier = Modifier.weight(1f).fillMaxHeight(),
50                    )
51                }
52            }
53        }
54
55        // Fila de funciones.
56        Row(Modifier.fillMaxWidth().height(52.dp)) {
57            val shiftAccent = when (controller.shift) {
58                ShiftState.OFF -> Tenue
59                ShiftState.ON -> NeonVerde
60                ShiftState.LOCK -> NeonRosa
61            }
62            FuncKey("⇧", shiftAccent, Modifier.weight(1f), onClick = controller::onShift)
63            FuncKey(
64                if (controller.layer == Layer.LETTERS) "?123" else "ABC",
65                NeonCian, Modifier.weight(1f), onClick = controller::toggleLayer,
66            )
67            FuncKey("espacio", Color.White, Modifier.weight(3f), onClick = controller::onSpace)
68            FuncKey("⌫", Color.White, Modifier.weight(1f), onClick = controller::onBackspace)
69            FuncKey("↵", NeonVerde, Modifier.weight(1f), onClick = controller::onEnter)
70        }
71    }
72}
73
74@Composable
75private fun FuncKey(
76    label: String,
77    accent: Color,
78    modifier: Modifier,
79    onClick: () -> Unit,
80) {
81    Box(
82        modifier
83            .fillMaxHeight()
84            .padding(3.dp)
85            .clip(RoundedCornerShape(14.dp))
86            .background(Tecla)
87            .clickable(onClick = onClick),
88        contentAlignment = Alignment.Center,
89    ) {
90        Text(
91            text = label,
92            color = accent,
93            fontSize = if (label.length > 2) 14.sp else 20.sp,
94            fontWeight = FontWeight.Medium,
95        )
96    }
97}