Skip to content

Commit 468a1e4

Browse files
author
Alexander Matečný
committed
Add option to define custom switch icons
1 parent 3acd6dc commit 468a1e4

File tree

1 file changed

+37
-2
lines changed
  • ui/src/androidMain/kotlin/kiwi/orbit/compose/ui/controls

1 file changed

+37
-2
lines changed

ui/src/androidMain/kotlin/kiwi/orbit/compose/ui/controls/Switch.kt

+37-2
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,21 @@ import androidx.compose.runtime.remember
3434
import androidx.compose.runtime.rememberUpdatedState
3535
import androidx.compose.ui.Alignment
3636
import androidx.compose.ui.Modifier
37+
import androidx.compose.ui.draw.paint
3738
import androidx.compose.ui.draw.shadow
3839
import androidx.compose.ui.geometry.Offset
3940
import androidx.compose.ui.graphics.Color
41+
import androidx.compose.ui.graphics.ColorFilter
4042
import androidx.compose.ui.graphics.StrokeCap
4143
import androidx.compose.ui.graphics.drawscope.DrawScope
44+
import androidx.compose.ui.graphics.painter.Painter
4245
import androidx.compose.ui.platform.LocalDensity
4346
import androidx.compose.ui.platform.LocalLayoutDirection
4447
import androidx.compose.ui.semantics.Role
4548
import androidx.compose.ui.unit.IntOffset
4649
import androidx.compose.ui.unit.LayoutDirection
4750
import androidx.compose.ui.unit.dp
51+
import kiwi.orbit.compose.icons.Icons
4852
import kiwi.orbit.compose.ui.OrbitTheme
4953
import kiwi.orbit.compose.ui.controls.internal.OrbitPreviews
5054
import kiwi.orbit.compose.ui.controls.internal.Preview
@@ -60,6 +64,25 @@ public fun Switch(
6064
modifier: Modifier = Modifier,
6165
enabled: Boolean = true,
6266
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() },
6386
) {
6487
val density = LocalDensity.current
6588
val toggleableModifier =
@@ -109,6 +132,7 @@ public fun Switch(
109132
enabled = enabled,
110133
state = swipeableState,
111134
interactionSource = interactionSource,
135+
icon = icon,
112136
)
113137
}
114138
}
@@ -117,6 +141,7 @@ public fun Switch(
117141
private fun BoxScope.SwitchImpl(
118142
checked: Boolean,
119143
enabled: Boolean,
144+
icon: Painter?,
120145
state: SwipeableV2State<Boolean>,
121146
interactionSource: InteractionSource,
122147
) {
@@ -186,7 +211,15 @@ private fun BoxScope.SwitchImpl(
186211
)
187212
.background(OrbitTheme.colors.surface.main, CircleShape)
188213
.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+
),
190223
)
191224
}
192225

@@ -235,7 +268,8 @@ private val TrackWidth = SwitchWidth - SwitchPadding * 2
235268
private val TrackStrokeWidth = SwitchHeight - SwitchPadding * 2
236269
private val ThumbDiameter = SwitchHeight
237270
private val ThumbStrokeWidth = 0.5.dp
238-
private val ThumbInnerDiameter = 10.dp
271+
private val ThumbInnerDiameter = 16.dp
272+
private val ThumbInnerPadding = 3.dp
239273
private val ThumbRippleRadius = 24.dp
240274

241275
private val AnimationSpec = TweenSpec<Float>(durationMillis = 100)
@@ -255,6 +289,7 @@ internal fun SwitchPreview() {
255289
Switch(
256290
checked = true,
257291
onCheckedChange = {},
292+
icon = Icons.Circle,
258293
)
259294
Switch(
260295
checked = false,

0 commit comments

Comments
 (0)