@@ -19,32 +19,37 @@ import kotlinx.coroutines.coroutineScope
19
19
*/
20
20
public class SliderState (
21
21
value : Float ,
22
+ disabledRange : ClosedFloatingPointRange <Float >,
22
23
private val valueDistribution : SliderValueDistribution ,
23
24
) : DraggableState {
24
25
25
26
internal var range: ClosedFloatingPointRange <Float > = 0f .. 1f
27
+ internal var disabledRange by mutableStateOf(disabledRange)
26
28
internal var onValueChange: ((Float ) -> Unit )? = null
27
29
internal var isDragging by mutableStateOf(false )
28
30
private set
29
-
30
31
private var totalWidth by mutableFloatStateOf(0f )
31
32
private var thumbWidth by mutableFloatStateOf(0f )
32
33
33
34
private var rawOffset by mutableFloatStateOf(scaleToOffset(value))
34
35
private val scrollMutex = MutatorMutex ()
35
36
36
- internal val valueAsFraction: Float get() {
37
- return calcFraction(0f , totalWidth, rawOffset)
38
- }
37
+ internal val valueAsFraction: Float
38
+ get() {
39
+ return calcFraction(0f , totalWidth, rawOffset)
40
+ }
41
+
42
+ internal val disabledRangeAsFractions: ClosedFloatingPointRange <Float >
43
+ get() = coerceRange(disabledRange)
39
44
40
45
/* *
41
46
* Current value of the slider
42
47
* If value of the slider is out of the [range] it will be coerced into it
43
48
*/
44
49
public var value: Float
45
- get() = scaleToUserValue(rawOffset).coerceIn(range)
50
+ get() = scaleToUserValue(rawOffset)
46
51
set(value) {
47
- rawOffset = scaleToOffset(value.coerceIn(range) )
52
+ rawOffset = scaleToOffset(value)
48
53
}
49
54
50
55
private val dragScope: DragScope = object : DragScope {
@@ -67,7 +72,6 @@ public class SliderState(
67
72
}
68
73
69
74
internal fun handlePress (offset : Offset ) {
70
- println (offset)
71
75
val userValue = scaleToUserValue(offset.x)
72
76
handleValueUpdate(userValue, offset.x)
73
77
}
@@ -85,17 +89,41 @@ public class SliderState(
85
89
}
86
90
}
87
91
92
+ private fun coerceRange (
93
+ subrange : ClosedFloatingPointRange <Float >,
94
+ ): ClosedFloatingPointRange <Float > {
95
+ if (subrange.isEmpty()) return subrange
96
+ val start = valueDistribution.interpolate(range.start)
97
+ val end = valueDistribution.interpolate(range.endInclusive)
98
+ val subStart = valueDistribution.interpolate(subrange.start)
99
+ val subEnd = valueDistribution.interpolate(subrange.endInclusive)
100
+ return calcFraction(start, end, subStart).. calcFraction(start, end, subEnd)
101
+ }
102
+
88
103
private fun scaleToUserValue (offset : Float ): Float {
89
104
val rangeStart = valueDistribution.interpolate(range.start)
90
105
val rangeEnd = valueDistribution.interpolate(range.endInclusive)
91
106
val scaledUserValue = scale(0f , totalWidth, offset, rangeStart, rangeEnd)
92
107
return valueDistribution.inverse(scaledUserValue)
108
+ .coerceIn(range)
109
+ .coerceIntoDisabledRange()
110
+ }
111
+
112
+ private fun Float.coerceIntoDisabledRange (): Float {
113
+ if (disabledRange.isEmpty()) return this
114
+ // check if disabled range is on the left or right
115
+ return if (disabledRange.start == range.start) {
116
+ coerceAtLeast(disabledRange.endInclusive)
117
+ } else {
118
+ coerceAtMost(disabledRange.start)
119
+ }
93
120
}
94
121
95
122
private fun scaleToOffset (value : Float ): Float {
123
+ val coerced = value.coerceIn(range).coerceIntoDisabledRange()
96
124
val rangeStart = valueDistribution.interpolate(range.start)
97
125
val rangeEnd = valueDistribution.interpolate(range.endInclusive)
98
- val interpolated = valueDistribution.interpolate(value )
126
+ val interpolated = valueDistribution.interpolate(coerced )
99
127
return scale(rangeStart, rangeEnd, interpolated, 0f , totalWidth)
100
128
}
101
129
}
@@ -104,6 +132,7 @@ public class SliderState(
104
132
public fun rememberSliderState (
105
133
value : Float ,
106
134
valueDistribution : SliderValueDistribution = SliderValueDistribution .Linear ,
135
+ disabledRange : ClosedFloatingPointRange <Float > = EmptyRange ,
107
136
): SliderState {
108
- return remember { SliderState (value, valueDistribution) }
137
+ return remember { SliderState (value, disabledRange, valueDistribution) }
109
138
}
0 commit comments