@@ -34,17 +34,21 @@ import androidx.compose.runtime.remember
34
34
import androidx.compose.runtime.rememberUpdatedState
35
35
import androidx.compose.ui.Alignment
36
36
import androidx.compose.ui.Modifier
37
+ import androidx.compose.ui.draw.paint
37
38
import androidx.compose.ui.draw.shadow
38
39
import androidx.compose.ui.geometry.Offset
39
40
import androidx.compose.ui.graphics.Color
41
+ import androidx.compose.ui.graphics.ColorFilter
40
42
import androidx.compose.ui.graphics.StrokeCap
41
43
import androidx.compose.ui.graphics.drawscope.DrawScope
44
+ import androidx.compose.ui.graphics.painter.Painter
42
45
import androidx.compose.ui.platform.LocalDensity
43
46
import androidx.compose.ui.platform.LocalLayoutDirection
44
47
import androidx.compose.ui.semantics.Role
45
48
import androidx.compose.ui.unit.IntOffset
46
49
import androidx.compose.ui.unit.LayoutDirection
47
50
import androidx.compose.ui.unit.dp
51
+ import kiwi.orbit.compose.icons.Icons
48
52
import kiwi.orbit.compose.ui.OrbitTheme
49
53
import kiwi.orbit.compose.ui.controls.internal.OrbitPreviews
50
54
import kiwi.orbit.compose.ui.controls.internal.Preview
@@ -60,6 +64,25 @@ public fun Switch(
60
64
modifier : Modifier = Modifier ,
61
65
enabled : Boolean = true,
62
66
interactionSource : MutableInteractionSource = remember { MutableInteractionSource () },
67
+ ) {
68
+ Switch (
69
+ checked = checked,
70
+ onCheckedChange = onCheckedChange,
71
+ modifier = modifier,
72
+ icon = null ,
73
+ enabled = enabled,
74
+ interactionSource = interactionSource,
75
+ )
76
+ }
77
+
78
+ @Composable
79
+ public fun Switch (
80
+ checked : Boolean ,
81
+ onCheckedChange : ((Boolean ) -> Unit )? ,
82
+ icon : Painter ? ,
83
+ modifier : Modifier = Modifier ,
84
+ enabled : Boolean = true,
85
+ interactionSource : MutableInteractionSource = remember { MutableInteractionSource () },
63
86
) {
64
87
val density = LocalDensity .current
65
88
val toggleableModifier =
@@ -107,6 +130,7 @@ public fun Switch(
107
130
SwitchImpl (
108
131
checked = checked,
109
132
enabled = enabled,
133
+ icon = icon,
110
134
state = swipeableState,
111
135
interactionSource = interactionSource,
112
136
)
@@ -117,6 +141,7 @@ public fun Switch(
117
141
private fun BoxScope.SwitchImpl (
118
142
checked : Boolean ,
119
143
enabled : Boolean ,
144
+ icon : Painter ? ,
120
145
state : SwipeableV2State <Boolean >,
121
146
interactionSource : InteractionSource ,
122
147
) {
@@ -186,7 +211,15 @@ private fun BoxScope.SwitchImpl(
186
211
)
187
212
.background(OrbitTheme .colors.surface.main, CircleShape )
188
213
.padding((ThumbDiameter - ThumbInnerDiameter - ThumbStrokeWidth * 2 ) / 2 )
189
- .background(mainColor, CircleShape ),
214
+ .then(
215
+ if (icon != null ) {
216
+ Modifier .paint(painter = icon, colorFilter = ColorFilter .tint(mainColor))
217
+ } else {
218
+ Modifier
219
+ .padding(ThumbInnerPadding )
220
+ .background(mainColor, CircleShape )
221
+ },
222
+ ),
190
223
)
191
224
}
192
225
@@ -235,7 +268,8 @@ private val TrackWidth = SwitchWidth - SwitchPadding * 2
235
268
private val TrackStrokeWidth = SwitchHeight - SwitchPadding * 2
236
269
private val ThumbDiameter = SwitchHeight
237
270
private val ThumbStrokeWidth = 0.5 .dp
238
- private val ThumbInnerDiameter = 10 .dp
271
+ private val ThumbInnerDiameter = 16 .dp
272
+ private val ThumbInnerPadding = 3 .dp
239
273
private val ThumbRippleRadius = 24 .dp
240
274
241
275
private val AnimationSpec = TweenSpec <Float >(durationMillis = 100 )
@@ -255,6 +289,7 @@ internal fun SwitchPreview() {
255
289
Switch (
256
290
checked = true ,
257
291
onCheckedChange = {},
292
+ icon = Icons .Circle ,
258
293
)
259
294
Switch (
260
295
checked = false ,
0 commit comments