From 3560665e83bed08a956d3761b614aa506dbf3ec3 Mon Sep 17 00:00:00 2001 From: Bruno Deanoz Date: Sun, 21 Jun 2026 17:39:47 +0200 Subject: [PATCH] fix: mode pills are now multi-select toggles instead of single-select MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modes like Sampling, Bild, Suche can be combined — they're not mutually exclusive. Changed from single Int to Set with toggle logic. --- .../main/java/dev/kaizen/app/chat/ChatComponents.kt | 6 +++--- app/src/main/java/dev/kaizen/app/chat/ChatScreen.kt | 10 ++++++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/dev/kaizen/app/chat/ChatComponents.kt b/app/src/main/java/dev/kaizen/app/chat/ChatComponents.kt index bbe19bc..9e20ba4 100644 --- a/app/src/main/java/dev/kaizen/app/chat/ChatComponents.kt +++ b/app/src/main/java/dev/kaizen/app/chat/ChatComponents.kt @@ -144,7 +144,7 @@ fun EmptyHero(userName: String, onPick: (String) -> Unit, modifier: Modifier = M } @Composable -fun ModePillsRow(selected: Int, onSelect: (Int) -> Unit, modifier: Modifier = Modifier) { +fun ModePillsRow(selected: Set, onToggle: (Int) -> Unit, modifier: Modifier = Modifier) { val cs = MaterialTheme.colorScheme val isDark = isSystemInDarkTheme() @@ -162,7 +162,7 @@ fun ModePillsRow(selected: Int, onSelect: (Int) -> Unit, modifier: Modifier = Mo ) { chatModes.forEach { mode -> val label = stringResource(mode.labelRes) - val active = mode.labelRes == selected + val active = mode.labelRes in selected val backgroundFill = if (active) { if (isDark) cs.surface.copy(alpha = 0.8f) else cs.surface.copy(alpha = 0.88f) } else { @@ -174,7 +174,7 @@ fun ModePillsRow(selected: Int, onSelect: (Int) -> Unit, modifier: Modifier = Mo .clip(KaizenShapes.pill) .background(backgroundFill) .border(1.2.dp, glassBorder, KaizenShapes.pill) - .clickable { onSelect(mode.labelRes) } + .clickable { onToggle(mode.labelRes) } .padding(horizontal = 13.dp, vertical = 8.dp), verticalAlignment = Alignment.CenterVertically, ) { diff --git a/app/src/main/java/dev/kaizen/app/chat/ChatScreen.kt b/app/src/main/java/dev/kaizen/app/chat/ChatScreen.kt index d4f5d08..6579fdc 100644 --- a/app/src/main/java/dev/kaizen/app/chat/ChatScreen.kt +++ b/app/src/main/java/dev/kaizen/app/chat/ChatScreen.kt @@ -94,7 +94,7 @@ fun ChatScreen( var input by remember { mutableStateOf("") } var isStreaming by remember { mutableStateOf(false) } 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 var currentScreen by remember { mutableStateOf(AppScreen.Chat) } @@ -513,7 +513,13 @@ fun ChatScreen( .then(if (isTablet) Modifier.widthIn(max = 720.dp) else Modifier) ) { 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)) ChatInput( value = input,