diff --git a/compose-settings-ui/src/commonMain/kotlin/com/alorma/compose/settings/ui/SettingsRadioButton.kt b/compose-settings-ui/src/commonMain/kotlin/com/alorma/compose/settings/ui/SettingsRadioButton.kt new file mode 100644 index 00000000..a3d39e40 --- /dev/null +++ b/compose-settings-ui/src/commonMain/kotlin/com/alorma/compose/settings/ui/SettingsRadioButton.kt @@ -0,0 +1,51 @@ +package com.alorma.compose.settings.ui + +import androidx.compose.foundation.selection.toggleable +import androidx.compose.material3.ListItemColors +import androidx.compose.material3.ListItemDefaults +import androidx.compose.material3.RadioButton +import androidx.compose.material3.RadioButtonColors +import androidx.compose.material3.RadioButtonDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.semantics.Role +import androidx.compose.ui.unit.Dp +import com.alorma.compose.settings.ui.internal.SettingsTileScaffold + +@Composable +fun SettingsRadioButton( + state: Boolean, + title: @Composable () -> Unit, + modifier: Modifier = Modifier, + enabled: Boolean = true, + icon: @Composable (() -> Unit)? = null, + subtitle: @Composable (() -> Unit)? = null, + checkboxColors: RadioButtonColors = RadioButtonDefaults.colors(), + colors: ListItemColors = ListItemDefaults.colors(), + tonalElevation: Dp = ListItemDefaults.Elevation, + shadowElevation: Dp = ListItemDefaults.Elevation, + onClick: () -> Unit, +) { + SettingsTileScaffold( + modifier = Modifier.toggleable( + enabled = enabled, + value = state, + role = Role.RadioButton, + onValueChange = { onClick() }, + ).then(modifier), + enabled = enabled, + title = title, + subtitle = subtitle, + icon = icon, + colors = colors, + tonalElevation = tonalElevation, + shadowElevation = shadowElevation, + ) { + RadioButton( + enabled = enabled, + selected = state, + onClick = onClick, + colors = checkboxColors, + ) + } +} diff --git a/composeApp/src/commonMain/kotlin/com.alorma.compose.settings.sample.shared/SettingsScreen.kt b/composeApp/src/commonMain/kotlin/com.alorma.compose.settings.sample.shared/SettingsScreen.kt index a955997a..85fa18dd 100644 --- a/composeApp/src/commonMain/kotlin/com.alorma.compose.settings.sample.shared/SettingsScreen.kt +++ b/composeApp/src/commonMain/kotlin/com.alorma.compose.settings.sample.shared/SettingsScreen.kt @@ -34,6 +34,7 @@ import com.alorma.compose.settings.storage.memory.rememberMemoryIntSettingState import com.alorma.compose.settings.storage.memory.rememberMemoryTriStateSettingState import com.alorma.compose.settings.ui.SettingsCheckbox import com.alorma.compose.settings.ui.SettingsMenuLink +import com.alorma.compose.settings.ui.SettingsRadioButton import com.alorma.compose.settings.ui.SettingsSlider import com.alorma.compose.settings.ui.SettingsSwitch import com.alorma.compose.settings.ui.SettingsTriStateCheckbox @@ -58,6 +59,7 @@ fun SettingsScreen(settings: Settings) { SettingsSwitchSampleSection(settings, iconState.value) SettingsCheckboxSampleSection(settings, iconState.value) SettingsTriStateCheckboxSampleSection(settings, iconState.value) + SettingsRadioButtonSampleSection(settings, iconState.value) SettingsMenuLinkSectionSample(iconState.value) SettingsSliderSectionSample(settings, iconState.value) SettingsSelectorsSample(settings, iconState.value) @@ -115,6 +117,25 @@ private fun SettingsCheckboxSampleSection(settings: Settings, showIcon: Boolean) } } +@Composable +private fun SettingsRadioButtonSampleSection(settings: Settings, showIcon: Boolean) { + SampleSection(title = "SettingsRadioButton Tile") { + val radioButtonDiskState = rememberStringSettingState( + key = "radioButtonDiskState", + settings = settings, + ) + SampleData.items.forEach { sampleItem -> + SettingsRadioButton( + state = radioButtonDiskState.value == sampleItem.key, + title = { Text(text = "Checkbox") }, + subtitle = { Text(text = "Disk state") }, + icon = iconSampleOrNull(showIcon), + onClick = { radioButtonDiskState.value = sampleItem.key }, + ) + } + } +} + @Composable private fun SettingsTriStateCheckboxSampleSection(settings: Settings, showIcon: Boolean) { SampleSection(title = "SettingsTriStateCheckbox Tile") {