Skip to content

Commit 3f197aa

Browse files
committed
feat(ui): create themed SegmentedControl
Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent f8a177a commit 3f197aa

3 files changed

Lines changed: 78 additions & 0 deletions

File tree

ui/components/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ dependencies {
3737
debugApi(libs.compose.ui.tools)
3838
api(libs.compose.ui.tools.preview)
3939
implementation(libs.compose.material)
40+
api(libs.compose.material3)
4041
implementation(libs.compose.material.icons.extended)
4142
implementation(libs.compose.accompanist)
4243
implementation(libs.compose.paging)
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.getcode.ui.components
2+
3+
import androidx.compose.foundation.layout.PaddingValues
4+
import androidx.compose.material3.SegmentedButton
5+
import androidx.compose.material3.SegmentedButtonColors
6+
import androidx.compose.material3.SegmentedButtonDefaults
7+
import androidx.compose.material3.SingleChoiceSegmentedButtonRow
8+
import androidx.compose.material3.SingleChoiceSegmentedButtonRowScope
9+
import androidx.compose.runtime.Composable
10+
import androidx.compose.ui.Modifier
11+
import androidx.compose.ui.unit.Dp
12+
13+
@Composable
14+
fun <T> SegmentedControl(
15+
options: List<T>,
16+
selected: T?,
17+
colors: SegmentedButtonColors = SegmentedButtonDefaults.colors(),
18+
contentPadding: PaddingValues = SegmentedButtonDefaults.ContentPadding,
19+
mapper: @Composable SingleChoiceSegmentedButtonRowScope.(T) -> Unit,
20+
space: Dp = SegmentedButtonDefaults.BorderWidth,
21+
modifier: Modifier = Modifier,
22+
onSelectionChanged: (T) -> Unit,
23+
) {
24+
SingleChoiceSegmentedButtonRow(
25+
modifier = modifier,
26+
space = space,
27+
) {
28+
options.mapIndexed { index, item ->
29+
SegmentedButton(
30+
selected = item == selected,
31+
onClick = { onSelectionChanged(item) },
32+
colors = colors,
33+
shape = SegmentedButtonDefaults.itemShape(index, count = options.count()),
34+
contentPadding = contentPadding,
35+
icon = {},
36+
label = {
37+
mapper(item)
38+
},
39+
)
40+
}
41+
}
42+
}
43+
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.getcode.ui.theme
2+
3+
import androidx.compose.material3.SegmentedButtonDefaults
4+
import androidx.compose.material3.SingleChoiceSegmentedButtonRowScope
5+
import androidx.compose.runtime.Composable
6+
import androidx.compose.ui.Modifier
7+
import androidx.compose.ui.unit.dp
8+
import com.getcode.theme.White05
9+
import com.getcode.theme.White10
10+
import com.getcode.ui.components.SegmentedControl
11+
12+
@Composable
13+
fun <T> CodeSegmentedControl(
14+
options: List<T>,
15+
selected: T?,
16+
mapper: @Composable SingleChoiceSegmentedButtonRowScope.(T) -> Unit,
17+
modifier: Modifier = Modifier,
18+
onSelectionChanged: (T) -> Unit,
19+
) {
20+
SegmentedControl(
21+
options = options,
22+
selected = selected,
23+
mapper = mapper,
24+
space = 0.dp,
25+
modifier = modifier,
26+
colors = SegmentedButtonDefaults.colors(
27+
activeBorderColor = White10,
28+
activeContainerColor = White10,
29+
inactiveContainerColor = White05,
30+
inactiveBorderColor = White05,
31+
),
32+
onSelectionChanged = onSelectionChanged,
33+
)
34+
}

0 commit comments

Comments
 (0)