Skip to content

Commit 0f420cc

Browse files
committed
refactor(Slider): Add another Slider fucntion that accepts SliderState
1 parent 062fd4e commit 0f420cc

File tree

4 files changed

+50
-52
lines changed

4 files changed

+50
-52
lines changed

demo/src/main/java/io/monstarlab/mosaic/features/SliderDemo.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import androidx.compose.ui.unit.dp
2121
import io.monstarlab.mosaic.slider.Slider
2222
import io.monstarlab.mosaic.slider.SliderColors
2323
import io.monstarlab.mosaic.slider.SliderValueDistribution
24+
import io.monstarlab.mosaic.slider.rememberSliderState
2425
import kotlin.math.roundToInt
2526
import androidx.compose.material3.Slider as MaterialSlider
2627

@@ -57,6 +58,17 @@ fun SliderDemo() = Scaffold(modifier = Modifier) {
5758
c = 1f,
5859
),
5960
)
61+
62+
Slider(
63+
state = rememberSliderState(value = 0.5f),
64+
colors = SliderColors(Color.Yellow),
65+
) {
66+
Box(
67+
modifier = Modifier
68+
.size(32.dp)
69+
.background(Color.Black),
70+
)
71+
}
6072
}
6173
}
6274

slider/src/main/java/io/monstarlab/mosaic/slider/Slider.kt

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,31 @@ public fun Slider(
4040
range: ClosedFloatingPointRange<Float> = 0f..1f,
4141
disabledRange: ClosedFloatingPointRange<Float> = EmptyRange,
4242
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
43-
thumb: @Composable () -> Unit = { DefaultSliderThumb(colors = colors) },
43+
thumb: @Composable (SliderState) -> Unit = { DefaultSliderThumb(colors = colors) },
4444
) {
45-
val state = rememberSliderState(value, valueDistribution, disabledRange)
46-
val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
45+
val state = rememberSliderState(value, range, valueDistribution, disabledRange)
4746

4847
state.onValueChange = onValueChange
4948
state.value = value
50-
state.range = range
51-
state.disabledRange = disabledRange
49+
50+
Slider(
51+
state = state,
52+
interactionSource = interactionSource,
53+
modifier = modifier,
54+
thumb = thumb,
55+
colors = colors,
56+
)
57+
}
58+
59+
@Composable
60+
public fun Slider(
61+
state: SliderState,
62+
colors: SliderColors,
63+
modifier: Modifier = Modifier,
64+
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
65+
thumb: @Composable (SliderState) -> Unit,
66+
) {
67+
val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
5268

5369
val tap = Modifier.pointerInput(state, interactionSource) {
5470
detectTapGestures(
@@ -79,8 +95,7 @@ public fun Slider(
7995
disabledRange = state.disabledRangeAsFractions,
8096
)
8197
},
82-
onDimensionsResolved = state::updateDimensions,
83-
value = state.valueAsFraction,
98+
state = state,
8499
)
85100
}
86101

Lines changed: 5 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,21 @@
11
package io.monstarlab.mosaic.slider
22

3-
import androidx.compose.foundation.background
43
import androidx.compose.foundation.layout.Box
5-
import androidx.compose.foundation.layout.fillMaxWidth
6-
import androidx.compose.foundation.layout.height
74
import androidx.compose.foundation.layout.requiredSizeIn
8-
import androidx.compose.foundation.layout.size
9-
import androidx.compose.foundation.shape.CircleShape
105
import androidx.compose.runtime.Composable
116
import androidx.compose.ui.Modifier
12-
import androidx.compose.ui.graphics.Color
137
import androidx.compose.ui.layout.Layout
148
import androidx.compose.ui.layout.layoutId
15-
import androidx.compose.ui.tooling.preview.Preview
16-
import androidx.compose.ui.unit.dp
179
import androidx.compose.ui.unit.offset
1810
import kotlin.math.max
1911
import kotlin.math.roundToInt
2012

2113
@Composable
2214
public fun SliderLayout(
23-
value: Float,
24-
onDimensionsResolved: (Float, Float) -> Unit,
15+
state: SliderState,
2516
modifier: Modifier = Modifier,
2617
track: @Composable () -> Unit,
27-
thumb: @Composable () -> Unit,
18+
thumb: @Composable (SliderState) -> Unit,
2819
) {
2920
Layout(
3021
modifier = modifier.requiredSizeIn(SliderDefaults.HandleWidth, SliderDefaults.HandleHeight),
@@ -33,7 +24,7 @@ public fun SliderLayout(
3324
track()
3425
}
3526
Box(modifier = Modifier.layoutId(SliderLayoutElements.Thumb)) {
36-
thumb()
27+
thumb(state)
3728
}
3829
},
3930
) { mesuarables, constraints ->
@@ -52,10 +43,10 @@ public fun SliderLayout(
5243

5344
val sliderHeight = max(thumbPlaceable.height, trackPlaceable.height)
5445
val sliderWidth = trackPlaceable.width + thumbPlaceable.width
55-
onDimensionsResolved(sliderWidth.toFloat(), thumbPlaceable.width.toFloat())
46+
state.updateDimensions(sliderWidth.toFloat(), thumbPlaceable.width.toFloat())
5647

5748
val trackOffsetX = thumbPlaceable.width / 2
58-
val thumbOffsetX = ((trackPlaceable.width) * value).roundToInt()
49+
val thumbOffsetX = ((trackPlaceable.width) * state.valueAsFraction).roundToInt()
5950
val trackOffsetY = (sliderHeight - trackPlaceable.height) / 2
6051
val thumbOffsetY = (sliderHeight - thumbPlaceable.height) / 2
6152

@@ -76,30 +67,3 @@ internal enum class SliderLayoutElements {
7667
Track,
7768
Thumb,
7869
}
79-
80-
@Preview
81-
@Composable
82-
private fun PreviewSliderLayout() {
83-
Box(modifier = Modifier.background(Color.Red)) {
84-
SliderLayout(
85-
onDimensionsResolved = { _, _ -> },
86-
modifier = Modifier.fillMaxWidth(0.5f),
87-
value = 1f,
88-
track = {
89-
Box(
90-
modifier = Modifier
91-
.background(Color.Yellow)
92-
.height(12.dp)
93-
.fillMaxWidth(),
94-
)
95-
},
96-
thumb = {
97-
Box(
98-
modifier = Modifier
99-
.size(32.dp)
100-
.background(Color.Black, shape = CircleShape),
101-
)
102-
},
103-
)
104-
}
105-
}

slider/src/main/java/io/monstarlab/mosaic/slider/SliderState.kt

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,11 @@ import kotlinx.coroutines.coroutineScope
1919
*/
2020
public class SliderState(
2121
value: Float,
22-
disabledRange: ClosedFloatingPointRange<Float>,
22+
private val range: ClosedFloatingPointRange<Float>,
23+
private val disabledRange: ClosedFloatingPointRange<Float>,
2324
private val valueDistribution: SliderValueDistribution,
2425
) : DraggableState {
2526

26-
internal var range: ClosedFloatingPointRange<Float> = 0f..1f
27-
internal var disabledRange by mutableStateOf(disabledRange)
2827
internal var onValueChange: ((Float) -> Unit)? = null
2928
internal var isDragging by mutableStateOf(false)
3029
private set
@@ -141,8 +140,16 @@ public class SliderState(
141140
@Composable
142141
public fun rememberSliderState(
143142
value: Float,
143+
range: ClosedFloatingPointRange<Float> = 0f..1f,
144144
valueDistribution: SliderValueDistribution = SliderValueDistribution.Linear,
145145
disabledRange: ClosedFloatingPointRange<Float> = EmptyRange,
146146
): SliderState {
147-
return remember { SliderState(value, disabledRange, valueDistribution) }
147+
return remember(range, valueDistribution, disabledRange) {
148+
SliderState(
149+
value = value,
150+
range = range,
151+
disabledRange = disabledRange,
152+
valueDistribution = valueDistribution,
153+
)
154+
}
148155
}

0 commit comments

Comments
 (0)