From a3d0698ae71400cdc90886b7688df5356c2ca33d Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Mon, 9 Mar 2026 16:11:03 -0300 Subject: [PATCH] Add select/deselect all functionality to multi-event home screens Introduce a `TriStateCheckbox` in both `IntentMultiEventHomeScreen` and `BunkerMultiEventHomeScreen` to allow users to toggle the selection state of all items simultaneously. The checkbox reflects the current selection state (On, Off, or Indeterminate) and updates all individual item checkboxes when clicked. --- .../components/BunkerMultiEventHomeScreen.kt | 26 +++++++++++++++++++ .../components/IntentMultiEventHomeScreen.kt | 26 +++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/BunkerMultiEventHomeScreen.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/BunkerMultiEventHomeScreen.kt index dd800f07..0a79e4a5 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/BunkerMultiEventHomeScreen.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/BunkerMultiEventHomeScreen.kt @@ -18,6 +18,7 @@ import androidx.compose.material3.Checkbox import androidx.compose.material3.CheckboxDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text +import androidx.compose.material3.TriStateCheckbox import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue @@ -29,6 +30,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource +import androidx.compose.ui.state.ToggleableState import androidx.compose.ui.text.capitalize import androidx.compose.ui.text.intl.Locale import androidx.compose.ui.text.toLowerCase @@ -113,6 +115,30 @@ fun BunkerMultiEventHomeScreen( SigningAs(accountParam) + val allCheckedState = when { + bunkerRequests.all { it.checked.value } -> ToggleableState.On + bunkerRequests.none { it.checked.value } -> ToggleableState.Off + else -> ToggleableState.Indeterminate + } + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .fillMaxWidth() + .clickable { + val newValue = allCheckedState != ToggleableState.On + bunkerRequests.forEach { it.checked.value = newValue } + }, + ) { + TriStateCheckbox( + state = allCheckedState, + onClick = { + val newValue = allCheckedState != ToggleableState.On + bunkerRequests.forEach { it.checked.value = newValue } + }, + ) + Text(stringResource(R.string.select_deselect_all)) + } + Column( Modifier .weight(1f) diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/IntentMultiEventHomeScreen.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/IntentMultiEventHomeScreen.kt index 719f48c7..a707e1be 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/IntentMultiEventHomeScreen.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/IntentMultiEventHomeScreen.kt @@ -20,6 +20,7 @@ import androidx.compose.material3.Checkbox import androidx.compose.material3.CheckboxDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text +import androidx.compose.material3.TriStateCheckbox import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue @@ -31,6 +32,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource +import androidx.compose.ui.state.ToggleableState import androidx.compose.ui.text.capitalize import androidx.compose.ui.text.intl.Locale import androidx.compose.ui.text.toLowerCase @@ -121,6 +123,30 @@ fun IntentMultiEventHomeScreen( SigningAs(accountParam) + val allCheckedState = when { + intents.all { it.checked.value } -> ToggleableState.On + intents.none { it.checked.value } -> ToggleableState.Off + else -> ToggleableState.Indeterminate + } + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .fillMaxWidth() + .clickable { + val newValue = allCheckedState != ToggleableState.On + intents.forEach { it.checked.value = newValue } + }, + ) { + TriStateCheckbox( + state = allCheckedState, + onClick = { + val newValue = allCheckedState != ToggleableState.On + intents.forEach { it.checked.value = newValue } + }, + ) + Text(stringResource(R.string.select_deselect_all)) + } + Column( Modifier .weight(1f)