Skip to content

Commit 062fd4e

Browse files
committed
refactor(Slider): Add extension function to interpolate the range
1 parent a8d0a1c commit 062fd4e

File tree

2 files changed

+28
-12
lines changed

2 files changed

+28
-12
lines changed

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

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -93,19 +93,24 @@ public class SliderState(
9393
subrange: ClosedFloatingPointRange<Float>,
9494
): ClosedFloatingPointRange<Float> {
9595
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)
96+
val interpolatedRange = valueDistribution.interpolate(range)
97+
val interpolatedSubrange = valueDistribution.interpolate(subrange)
98+
return calcFraction(
99+
interpolatedRange.start,
100+
interpolatedRange.endInclusive,
101+
interpolatedSubrange.start,
102+
)..calcFraction(
103+
interpolatedRange.start,
104+
interpolatedRange.endInclusive,
105+
interpolatedSubrange.endInclusive,
106+
)
101107
}
102108

103109
private fun scaleToUserValue(offset: Float): Float {
104-
val rangeStart = valueDistribution.interpolate(range.start)
105-
val rangeEnd = valueDistribution.interpolate(range.endInclusive)
106-
val scaledUserValue = scale(0f, totalWidth, offset, rangeStart, rangeEnd)
110+
val range = valueDistribution.interpolate(range)
111+
val scaledUserValue = scale(0f, totalWidth, offset, range.start, range.endInclusive)
107112
return valueDistribution.inverse(scaledUserValue)
108-
.coerceIn(range)
113+
.coerceIn(this.range)
109114
.coerceIntoDisabledRange()
110115
}
111116

@@ -121,10 +126,15 @@ public class SliderState(
121126

122127
private fun scaleToOffset(value: Float): Float {
123128
val coerced = value.coerceIn(range).coerceIntoDisabledRange()
124-
val rangeStart = valueDistribution.interpolate(range.start)
125-
val rangeEnd = valueDistribution.interpolate(range.endInclusive)
129+
val interpolatedRange = valueDistribution.interpolate(range)
126130
val interpolated = valueDistribution.interpolate(coerced)
127-
return scale(rangeStart, rangeEnd, interpolated, 0f, totalWidth)
131+
return scale(
132+
interpolatedRange.start,
133+
interpolatedRange.endInclusive,
134+
interpolated,
135+
0f,
136+
totalWidth,
137+
)
128138
}
129139
}
130140

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ public interface SliderValueDistribution {
5555
}
5656
}
5757

58+
internal fun SliderValueDistribution.interpolate(
59+
range: ClosedFloatingPointRange<Float>,
60+
): ClosedFloatingPointRange<Float> {
61+
return interpolate(range.start)..interpolate(range.endInclusive)
62+
}
63+
5864
/**
5965
* Represents a parabolic distribution strategy for slider values.
6066
*

0 commit comments

Comments
 (0)