fix: mode pills are now multi-select toggles instead of single-select

Modes like Sampling, Bild, Suche can be combined — they're not mutually
exclusive. Changed from single Int to Set<Int> with toggle logic.
This commit is contained in:
Bruno Deanoz 2026-06-21 17:39:47 +02:00
parent 78f03ada99
commit 3560665e83
2 changed files with 11 additions and 5 deletions

View file

@ -144,7 +144,7 @@ fun EmptyHero(userName: String, onPick: (String) -> Unit, modifier: Modifier = M
} }
@Composable @Composable
fun ModePillsRow(selected: Int, onSelect: (Int) -> Unit, modifier: Modifier = Modifier) { fun ModePillsRow(selected: Set<Int>, onToggle: (Int) -> Unit, modifier: Modifier = Modifier) {
val cs = MaterialTheme.colorScheme val cs = MaterialTheme.colorScheme
val isDark = isSystemInDarkTheme() val isDark = isSystemInDarkTheme()
@ -162,7 +162,7 @@ fun ModePillsRow(selected: Int, onSelect: (Int) -> Unit, modifier: Modifier = Mo
) { ) {
chatModes.forEach { mode -> chatModes.forEach { mode ->
val label = stringResource(mode.labelRes) val label = stringResource(mode.labelRes)
val active = mode.labelRes == selected val active = mode.labelRes in selected
val backgroundFill = if (active) { val backgroundFill = if (active) {
if (isDark) cs.surface.copy(alpha = 0.8f) else cs.surface.copy(alpha = 0.88f) if (isDark) cs.surface.copy(alpha = 0.8f) else cs.surface.copy(alpha = 0.88f)
} else { } else {
@ -174,7 +174,7 @@ fun ModePillsRow(selected: Int, onSelect: (Int) -> Unit, modifier: Modifier = Mo
.clip(KaizenShapes.pill) .clip(KaizenShapes.pill)
.background(backgroundFill) .background(backgroundFill)
.border(1.2.dp, glassBorder, KaizenShapes.pill) .border(1.2.dp, glassBorder, KaizenShapes.pill)
.clickable { onSelect(mode.labelRes) } .clickable { onToggle(mode.labelRes) }
.padding(horizontal = 13.dp, vertical = 8.dp), .padding(horizontal = 13.dp, vertical = 8.dp),
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
) { ) {

View file

@ -94,7 +94,7 @@ fun ChatScreen(
var input by remember { mutableStateOf("") } var input by remember { mutableStateOf("") }
var isStreaming by remember { mutableStateOf(false) } var isStreaming by remember { mutableStateOf(false) }
var nextId by remember { mutableStateOf(0L) } var nextId by remember { mutableStateOf(0L) }
var selectedMode by remember { mutableStateOf(R.string.mode_standard) } var selectedModes by remember { mutableStateOf(setOf(R.string.mode_standard)) }
// Navigation State // Navigation State
var currentScreen by remember { mutableStateOf(AppScreen.Chat) } var currentScreen by remember { mutableStateOf(AppScreen.Chat) }
@ -513,7 +513,13 @@ fun ChatScreen(
.then(if (isTablet) Modifier.widthIn(max = 720.dp) else Modifier) .then(if (isTablet) Modifier.widthIn(max = 720.dp) else Modifier)
) { ) {
Spacer(Modifier.height(24.dp)) Spacer(Modifier.height(24.dp))
ModePillsRow(selected = selectedMode, onSelect = { selectedMode = it; haptics.tick() }) ModePillsRow(
selected = selectedModes,
onToggle = { mode ->
selectedModes = if (mode in selectedModes) selectedModes - mode else selectedModes + mode
haptics.tick()
},
)
Spacer(Modifier.height(10.dp)) Spacer(Modifier.height(10.dp))
ChatInput( ChatInput(
value = input, value = input,