@@ -82,6 +82,7 @@ struct RNCRangedSliderContent: View {
8282
8383 /// Which end of the range a thumb drags.
8484 private enum Thumb {
85+ case single
8586 case left
8687 case right
8788 }
@@ -96,7 +97,7 @@ struct RNCRangedSliderContent: View {
9697 // inside the view, so it is short of the width by one thumb.
9798 let travel = max ( geometry. size. width - ( model. ranged ? diameter : 0 ) , 0 )
9899
99- let leftOffset = offset ( of: model. valueLeft, in: range, travel: travel)
100+ let leftOffset = offset ( of: model. ranged ? model . valueLeft : model . value , in: range, travel: travel)
100101 let rightOffset = offset ( of: model. valueRight, in: range, travel: travel)
101102
102103 let trackFillWidth = model. ranged ? max ( rightOffset - leftOffset, 0 ) : leftOffset
@@ -114,14 +115,12 @@ struct RNCRangedSliderContent: View {
114115 . frame ( width: trackFillWidth, height: Self . trackHeight)
115116 . offset ( x: trackFillStartPoint)
116117
117- thumb ( . left, diameter: diameter, offset: leftOffset, range: range, travel: travel)
118- // Both thumbs pinned to the upper bound overlap exactly, and the right
119- // one has nowhere left to go - so the left one has to take the touches
120- // or the pair is stuck there.
121- . zIndex ( model. valueLeft >= range. upperBound ? 1 : 0 )
122-
123118 if model. ranged {
124119 thumb ( . right, diameter: diameter, offset: rightOffset, range: range, travel: travel)
120+ thumb ( . left, diameter: diameter, offset: leftOffset, range: range, travel: travel)
121+ . zIndex ( model. valueLeft >= range. upperBound ? 1 : 0 )
122+ } else {
123+ thumb ( . single, diameter: diameter, offset: leftOffset, range: range, travel: travel)
125124 }
126125 }
127126 . frame ( width: geometry. size. width, height: geometry. size. height)
@@ -180,6 +179,7 @@ struct RNCRangedSliderContent: View {
180179
181180 private func value( of thumb: Thumb ) -> Double {
182181 switch thumb {
182+ case . single: return model. value
183183 case . left: return model. valueLeft
184184 case . right: return model. valueRight
185185 }
@@ -189,6 +189,11 @@ struct RNCRangedSliderContent: View {
189189 /// other thumb, and reports it to JS. The two thumbs cannot swap places.
190190 private func set( _ newValue: Double , of thumb: Thumb , in range: ClosedRange < Double > ) {
191191 switch thumb {
192+ case . single:
193+ let clamped = newValue. clamped ( to: range)
194+ guard clamped != model. value else { return }
195+ model. value = clamped
196+ model. onValueChange ? ( clamped)
192197 case . left:
193198 let clamped = newValue. clamped (
194199 to: range. lowerBound... model. valueRight. clamped ( to: range)
@@ -208,13 +213,15 @@ struct RNCRangedSliderContent: View {
208213
209214 private func dragOrigin( of thumb: Thumb ) -> Double ? {
210215 switch thumb {
216+ case . single: return model. leftDragOrigin
211217 case . left: return model. leftDragOrigin
212218 case . right: return model. rightDragOrigin
213219 }
214220 }
215221
216222 private func setDragOrigin( _ origin: Double ? , of thumb: Thumb ) {
217223 switch thumb {
224+ case . single: model. leftDragOrigin = origin
218225 case . left: model. leftDragOrigin = origin
219226 case . right: model. rightDragOrigin = origin
220227 }
0 commit comments