11package top.yukonga.miuix.kmp.basic
22
3- import androidx.compose.animation.AnimatedContent
4- import androidx.compose.animation.fadeIn
5- import androidx.compose.animation.fadeOut
6- import androidx.compose.animation.togetherWith
73import androidx.compose.foundation.background
8- import androidx.compose.foundation.layout.Arrangement
9- import androidx.compose.foundation.layout.Column
4+ import androidx.compose.foundation.gestures.detectTapGestures
5+ import androidx.compose.foundation.layout.Box
106import androidx.compose.foundation.layout.PaddingValues
11- import androidx.compose.foundation.layout.Row
127import androidx.compose.foundation.layout.WindowInsets
138import androidx.compose.foundation.layout.WindowInsetsSides
149import androidx.compose.foundation.layout.captionBar
1510import androidx.compose.foundation.layout.displayCutout
1611import androidx.compose.foundation.layout.navigationBars
1712import androidx.compose.foundation.layout.only
1813import androidx.compose.foundation.layout.padding
19- import androidx.compose.foundation.layout.size
2014import androidx.compose.foundation.layout.statusBars
2115import androidx.compose.foundation.layout.windowInsetsPadding
2216import androidx.compose.runtime.Composable
23- import androidx.compose.ui.Alignment
2417import androidx.compose.ui.Modifier
2518import androidx.compose.ui.draw.clip
2619import androidx.compose.ui.graphics.Color
27- import androidx.compose.ui.graphics.vector.ImageVector
20+ import androidx.compose.ui.input.pointer.pointerInput
2821import androidx.compose.ui.unit.Dp
2922import androidx.compose.ui.unit.dp
3023import top.yukonga.miuix.kmp.theme.MiuixTheme
@@ -34,32 +27,24 @@ import top.yukonga.miuix.kmp.utils.SmoothRoundedCornerShape
3427 * A [FloatingToolbar] that renders its content in a Card, arranged either horizontally or vertically.
3528 * The actual placement on screen is handled by the parent, typically Scaffold.
3629 *
37- * @param items The list of [NavigationItem]s to display in the toolbar.
38- * @param selected The index of the currently selected item.
39- * @param onClick The callback invoked when an item is clicked.
4030 * @param modifier The modifier to be applied to the [FloatingToolbar].
41- * @param targetState The orientation of the buttons inside the [FloatingToolbar] (Horizontal or Vertical).
42- * @param cornerRadius Corner radius of the [FloatingToolbar] background Card.
4331 * @param color Background color of the [FloatingToolbar].
44- * @param contentPadding Padding inside the [FloatingToolbar], around the buttons .
32+ * @param cornerRadius Corner radius of the [FloatingToolbar].
4533 * @param outSidePadding Padding outside the [FloatingToolbar].
34+ * @param showBorder Whether to show a border around the [FloatingToolbar].
4635 * @param defaultWindowInsetsPadding Whether to apply default window insets padding to the [FloatingToolbar].
4736 */
4837@Composable
4938fun FloatingToolbar (
50- items : List <FloatingToolbarItem >,
51- selected : Int ,
52- onClick : (Int ) -> Unit ,
5339 modifier : Modifier = Modifier ,
54- targetState : FloatingToolbarOrientation = FloatingToolbarDefaults .Orientation ,
55- cornerRadius : Dp = FloatingToolbarDefaults .CornerRadius ,
5640 color : Color = FloatingToolbarDefaults .DefaultColor (),
57- contentPadding : PaddingValues = FloatingToolbarDefaults .ContentPadding ,
41+ cornerRadius : Dp = FloatingToolbarDefaults .CornerRadius ,
5842 outSidePadding : PaddingValues = FloatingToolbarDefaults .OutSidePadding ,
5943 showBorder : Boolean = true,
6044 defaultWindowInsetsPadding : Boolean = true,
45+ content : @Composable () -> Unit
6146) {
62- Column (
47+ Box (
6348 modifier = Modifier
6449 .padding(outSidePadding)
6550 .then(
@@ -71,7 +56,6 @@ fun FloatingToolbar(
7156 .windowInsetsPadding(WindowInsets .navigationBars)
7257 } else Modifier
7358 )
74-
7559 .background(color = color)
7660 .then(
7761 if (showBorder) {
@@ -81,67 +65,18 @@ fun FloatingToolbar(
8165 } else Modifier
8266 )
8367 .clip(SmoothRoundedCornerShape (cornerRadius))
68+ .pointerInput(Unit ) { detectTapGestures { /* Do nothing to consume the click */ } }
8469 ) {
85- AnimatedContent (
86- modifier = modifier,
87- targetState = targetState,
88- transitionSpec = { fadeIn() togetherWith fadeOut() },
89- label = " toolbar-animation"
90- ) { targetOrientation ->
91- val layoutModifier = Modifier .padding(contentPadding)
92- val content = @Composable {
93- items.forEachIndexed { index, item ->
94- IconButton (
95- modifier = Modifier .size(48 .dp),
96- onClick = { onClick(index) }
97- ) {
98- Icon (
99- item.icon,
100- contentDescription = item.label,
101- tint = if (selected == index) {
102- MiuixTheme .colorScheme.onSurfaceContainer
103- } else {
104- MiuixTheme .colorScheme.onSurfaceContainerVariant
105- }
106- )
107- }
108- }
109- }
110- when (targetOrientation) {
111- FloatingToolbarOrientation .Horizontal -> {
112- Row (
113- horizontalArrangement = Arrangement .spacedBy(12 .dp),
114- verticalAlignment = Alignment .CenterVertically ,
115- modifier = layoutModifier
116- ) { content() }
117- }
118-
119- FloatingToolbarOrientation .Vertical -> {
120- Column (
121- verticalArrangement = Arrangement .spacedBy(12 .dp),
122- horizontalAlignment = Alignment .CenterHorizontally ,
123- modifier = layoutModifier
124- ) { content() }
125- }
126- }
70+ Box (
71+ modifier = modifier
72+ ) {
73+ content()
12774 }
12875 }
12976}
13077
131- /* *
132- * Represents the orientation of the FloatingToolbar's content.
133- */
134- enum class FloatingToolbarOrientation {
135- Horizontal , Vertical
136- }
137-
13878object FloatingToolbarDefaults {
13979
140- /* *
141- * Default orientation of the context of the [FloatingToolbar].
142- */
143- val Orientation = FloatingToolbarOrientation .Horizontal
144-
14580 /* *
14681 * Default corner radius of the [FloatingToolbar].
14782 */
@@ -153,25 +88,8 @@ object FloatingToolbarDefaults {
15388 @Composable
15489 fun DefaultColor () = MiuixTheme .colorScheme.surfaceContainer
15590
156- /* *
157- * Default padding inside the [FloatingToolbar].
158- */
159- val ContentPadding = PaddingValues (8 .dp)
160-
16191 /* *
16292 * Default padding outside the [FloatingToolbar].
16393 */
16494 val OutSidePadding = PaddingValues (12 .dp, 8 .dp)
16595}
166-
167-
168- /* *
169- * The data class for [FloatingToolbar].
170- *
171- * @param label The label of the item.
172- * @param icon The icon of the item.
173- */
174- data class FloatingToolbarItem (
175- val label : String ,
176- val icon : ImageVector
177- )
0 commit comments