tawasuyu

sergio/humanoid

HTML 6TOML 10 Definitions

⎇ 5227fbf1abfb2a437968ebc63692560c3a929230 keyboard/src/main/java/com/rizoma/trazo/ui/EmojiGrid.kt 69 lines · 2.1 KB History raw

Trazo: pulido v0.4 — háptica, palabra siguiente, emojis y ajustes b021d6829 · sergio ·

1package com.rizoma.trazo.ui
2
3import androidx.compose.foundation.clickable
4import androidx.compose.foundation.layout.Box
5import androidx.compose.foundation.layout.fillMaxWidth
6import androidx.compose.foundation.layout.height
7import androidx.compose.foundation.layout.padding
8import androidx.compose.foundation.lazy.grid.GridCells
9import androidx.compose.foundation.lazy.grid.GridItemSpan
10import androidx.compose.foundation.lazy.grid.LazyGridScope
11import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
12import androidx.compose.foundation.lazy.grid.items
13import androidx.compose.material3.Text
14import androidx.compose.runtime.Composable
15import androidx.compose.ui.Alignment
16import androidx.compose.ui.Modifier
17import androidx.compose.ui.unit.dp
18import androidx.compose.ui.unit.sp
19import com.rizoma.trazo.model.Emojis
20import com.rizoma.trazo.ui.theme.Tenue
21
22/**
23 * Panel de emojis desplazable: primero "recientes" (si los hay), luego las categorías.
24 * Sustituye al grid 3x3 cuando la capa de emojis está activa.
25 */
26@Composable
27fun EmojiPad(
28    recents: List<String>,
29    onEmoji: (String) -> Unit,
30    modifier: Modifier = Modifier,
31) {
32    LazyVerticalGrid(
33        columns = GridCells.Fixed(8),
34        modifier = modifier.fillMaxWidth(),
35    ) {
36        if (recents.isNotEmpty()) {
37            header("recientes")
38            items(recents, key = { "r:$it" }) { EmojiCell(it, onEmoji) }
39        }
40        Emojis.categories.forEach { (name, list) ->
41            header(name)
42            items(list, key = { "$name:$it" }) { EmojiCell(it, onEmoji) }
43        }
44    }
45}
46
47private fun LazyGridScope.header(text: String) {
48    item(span = { GridItemSpan(maxLineSpan) }) {
49        Text(
50            text = text,
51            color = Tenue,
52            fontSize = 11.sp,
53            modifier = Modifier.padding(start = 10.dp, top = 10.dp, bottom = 2.dp),
54        )
55    }
56}
57
58@Composable
59private fun EmojiCell(emoji: String, onEmoji: (String) -> Unit) {
60    Box(
61        Modifier
62            .fillMaxWidth()
63            .height(42.dp)
64            .clickable { onEmoji(emoji) },
65        contentAlignment = Alignment.Center,
66    ) {
67        Text(text = emoji, fontSize = 24.sp)
68    }
69}