1313 * See the License for the specific language governing permissions and
1414 * limitations under the License.
1515 */
16+ @file:OptIn(ExperimentalMaterial3ExpressiveApi ::class )
17+
1618package com.android.developers.androidify.customize
1719
20+ import androidx.compose.foundation.background
1821import androidx.compose.foundation.border
22+ import androidx.compose.foundation.layout.Box
1923import androidx.compose.foundation.layout.Spacer
20- import androidx.compose.foundation.layout.padding
21- import androidx.compose.foundation.layout.width
24+ import androidx.compose.foundation.layout.size
2225import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
2326import androidx.compose.material3.FloatingToolbarColors
2427import androidx.compose.material3.HorizontalFloatingToolbar
@@ -33,8 +36,8 @@ import androidx.compose.ui.res.painterResource
3336import androidx.compose.ui.tooling.preview.Preview
3437import androidx.compose.ui.unit.dp
3538import com.android.developers.androidify.theme.AndroidifyTheme
39+ import com.android.developers.androidify.theme.Primary
3640
37- @OptIn(ExperimentalMaterial3ExpressiveApi ::class )
3841@Composable
3942fun ToolSelector (
4043 tools : List <CustomizeTool >,
@@ -43,103 +46,106 @@ fun ToolSelector(
4346 horizontal : Boolean ,
4447 modifier : Modifier = Modifier ,
4548) {
49+ val buttons = @Composable {
50+ tools.forEachIndexed { index, tool ->
51+ ToolSelectorToggleButton (
52+ modifier = Modifier ,
53+ tool = tool,
54+ checked = selectedOption == tool,
55+ onCheckedChange = { onToolSelected(tool) },
56+ )
57+ if (index != tools.size - 1 ) {
58+ Spacer (Modifier .size(8 .dp))
59+ }
60+ }
61+ }
62+ val toolbarColors = FloatingToolbarColors (
63+ toolbarContainerColor = MaterialTheme .colorScheme.surface,
64+ toolbarContentColor = MaterialTheme .colorScheme.onSurfaceVariant,
65+ fabContainerColor = MaterialTheme .colorScheme.tertiary,
66+ fabContentColor = MaterialTheme .colorScheme.onTertiary,
67+ )
68+
4669 if (horizontal) {
4770 HorizontalFloatingToolbar (
48- modifier = modifier.border(
49- 2 .dp,
50- color = MaterialTheme .colorScheme.outline,
51- shape = MaterialTheme .shapes.large,
52- ).padding(2 .dp),
53- colors = FloatingToolbarColors (
54- toolbarContainerColor = MaterialTheme .colorScheme.surface,
55- toolbarContentColor = MaterialTheme .colorScheme.onSurfaceVariant,
56- fabContainerColor = MaterialTheme .colorScheme.tertiary,
57- fabContentColor = MaterialTheme .colorScheme.onTertiary,
58- ),
71+ modifier = modifier.toolbarBorder(),
72+ shape = MaterialTheme .shapes.large,
73+ colors = toolbarColors,
5974 expanded = true ,
6075 ) {
61- tools.forEachIndexed { index, tool ->
62- ToggleButton (
63- modifier = Modifier ,
64- checked = selectedOption == tool,
65- onCheckedChange = { onToolSelected(tool) },
66- shapes = ToggleButtonDefaults .shapes(checkedShape = MaterialTheme .shapes.large),
67- colors = ToggleButtonDefaults .toggleButtonColors(
68- checkedContainerColor = MaterialTheme .colorScheme.onSurface,
69- containerColor = MaterialTheme .colorScheme.surface,
70- ),
71- ) {
72- Icon (
73- painterResource(tool.icon),
74- contentDescription = tool.displayName,
75- )
76- }
77- if (index != tools.size - 1 ) {
78- Spacer (Modifier .width(8 .dp))
79- }
80- }
76+ buttons()
8177 }
8278 } else {
8379 VerticalFloatingToolbar (
84- modifier = modifier.border(
85- 2 .dp,
86- color = MaterialTheme .colorScheme.outline,
87- shape = MaterialTheme .shapes.large,
88- ).padding(2 .dp),
89- colors = FloatingToolbarColors (
90- toolbarContainerColor = MaterialTheme .colorScheme.surface,
91- toolbarContentColor = MaterialTheme .colorScheme.onSurfaceVariant,
92- fabContainerColor = MaterialTheme .colorScheme.tertiary,
93- fabContentColor = MaterialTheme .colorScheme.onTertiary,
94- ),
80+ modifier = modifier.toolbarBorder(),
81+ shape = MaterialTheme .shapes.large,
82+ colors = toolbarColors,
9583 expanded = true ,
9684 ) {
97- tools.forEachIndexed { index, tool ->
98- ToggleButton (
99- modifier = Modifier ,
100- checked = selectedOption == tool,
101- onCheckedChange = { onToolSelected(tool) },
102- shapes = ToggleButtonDefaults .shapes(checkedShape = MaterialTheme .shapes.large),
103- colors = ToggleButtonDefaults .toggleButtonColors(
104- checkedContainerColor = MaterialTheme .colorScheme.onSurface,
105- containerColor = MaterialTheme .colorScheme.surface,
106- ),
107- ) {
108- Icon (
109- painterResource(tool.icon),
110- contentDescription = tool.displayName,
111- )
112- }
113- if (index != tools.size - 1 ) {
114- Spacer (Modifier .width(8 .dp))
115- }
116- }
85+ buttons()
11786 }
11887 }
11988}
12089
90+ @Composable
91+ private fun ToolSelectorToggleButton (
92+ tool : CustomizeTool ,
93+ checked : Boolean ,
94+ onCheckedChange : (Boolean ) -> Unit ,
95+ modifier : Modifier = Modifier ,
96+ ) {
97+ ToggleButton (
98+ modifier = modifier,
99+ checked = checked,
100+ onCheckedChange = onCheckedChange,
101+ shapes = ToggleButtonDefaults .shapes(
102+ checkedShape = MaterialTheme .shapes.large,
103+ ),
104+ colors = ToggleButtonDefaults .toggleButtonColors(
105+ checkedContainerColor = MaterialTheme .colorScheme.onSurface,
106+ containerColor = MaterialTheme .colorScheme.surface,
107+ ),
108+ ) {
109+ Icon (
110+ painterResource(tool.icon),
111+ contentDescription = tool.displayName,
112+ )
113+ }
114+ }
115+
116+ @Composable
117+ private fun Modifier.toolbarBorder () = this .border(
118+ 2 .dp,
119+ color = MaterialTheme .colorScheme.outline,
120+ shape = MaterialTheme .shapes.large,
121+ )
122+
121123@Preview
122124@Composable
123125private fun ToolsPreviewHorizontal () {
124126 AndroidifyTheme {
125- ToolSelector (
126- tools = listOf (CustomizeTool .Size , CustomizeTool .Background ),
127- selectedOption = CustomizeTool .Size ,
128- horizontal = true ,
129- onToolSelected = {},
130- )
127+ Box (Modifier .background(Primary )) {
128+ ToolSelector (
129+ tools = listOf (CustomizeTool .Size , CustomizeTool .Background ),
130+ selectedOption = CustomizeTool .Size ,
131+ horizontal = true ,
132+ onToolSelected = {},
133+ )
134+ }
131135 }
132136}
133137
134138@Preview
135139@Composable
136140private fun ToolsPreviewVertical () {
137141 AndroidifyTheme {
138- ToolSelector (
139- tools = listOf (CustomizeTool .Size , CustomizeTool .Background ),
140- selectedOption = CustomizeTool .Size ,
141- horizontal = false ,
142- onToolSelected = {},
143- )
142+ Box (Modifier .background(Primary )) {
143+ ToolSelector (
144+ tools = listOf (CustomizeTool .Size , CustomizeTool .Background ),
145+ selectedOption = CustomizeTool .Size ,
146+ horizontal = false ,
147+ onToolSelected = {},
148+ )
149+ }
144150 }
145151}
0 commit comments