Skip to content

Commit

Permalink
Merge pull request #53 from jacobp100/master
Browse files Browse the repository at this point in the history
Call editing changed callback before updating binding values
  • Loading branch information
ay42 committed May 21, 2022
2 parents 538e16b + b1fcb5f commit 5ba8614
Show file tree
Hide file tree
Showing 11 changed files with 73 additions and 70 deletions.
2 changes: 1 addition & 1 deletion Sources/Sliders/Base/DefaultHorizontalValueView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import SwiftUI
public struct DefaultHorizontalValueView: View {
public var body: some View {
Capsule()
.foregroundColor(.accentColor)
.foregroundColor(Color.accentColor)
.frame(height: 3)
}
}
2 changes: 1 addition & 1 deletion Sources/Sliders/Base/DefaultVerticalValueView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import SwiftUI
public struct DefaultVerticalValueView: View {
public var body: some View {
Capsule()
.foregroundColor(.accentColor)
.foregroundColor(Color.accentColor)
.frame(width: 3)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,16 @@ public struct RectangularPointSliderStyle<Track: View, Thumb: View>: PointSlider
yBounds: configuration.yBounds,
yStep: configuration.yStep
))
.accentColor(.accentColor)
.accentColor(Color.accentColor)

return GeometryReader { geometry in
ZStack {
if self.options.contains(.interactiveTrack) {
track.gesture(
DragGesture(minimumDistance: 0)
.onChanged { gestureValue in
configuration.onEditingChanged(true)

let computedValueX = valueFrom(
distance: gestureValue.location.x,
availableDistance: geometry.size.width,
Expand All @@ -33,7 +35,7 @@ public struct RectangularPointSliderStyle<Track: View, Thumb: View>: PointSlider
leadingOffset: self.thumbSize.width / 2,
trailingOffset: self.thumbSize.width / 2
)

let computedValueY = configuration.yBounds.upperBound - valueFrom(
distance: gestureValue.location.y,
availableDistance: geometry.size.height,
Expand All @@ -42,10 +44,9 @@ public struct RectangularPointSliderStyle<Track: View, Thumb: View>: PointSlider
leadingOffset: self.thumbSize.height / 2,
trailingOffset: self.thumbSize.height / 2
)

configuration.x.wrappedValue = computedValueX
configuration.y.wrappedValue = computedValueY
configuration.onEditingChanged(true)
}
.onEnded { _ in
configuration.onEditingChanged(false)
Expand All @@ -54,7 +55,7 @@ public struct RectangularPointSliderStyle<Track: View, Thumb: View>: PointSlider
} else {
track
}

ZStack {
self.thumb
.frame(width: self.thumbSize.width, height: self.thumbSize.height)
Expand All @@ -80,6 +81,8 @@ public struct RectangularPointSliderStyle<Track: View, Thumb: View>: PointSlider
.gesture(
DragGesture()
.onChanged { gestureValue in
configuration.onEditingChanged(true)

if configuration.dragOffset.wrappedValue == nil {
let gragOffsetX = gestureValue.startLocation.x - distanceFrom(
value: configuration.x.wrappedValue,
Expand All @@ -88,18 +91,18 @@ public struct RectangularPointSliderStyle<Track: View, Thumb: View>: PointSlider
leadingOffset: self.thumbSize.width / 2,
trailingOffset: self.thumbSize.width / 2
)

let dragOffsetY = gestureValue.startLocation.y - (geometry.size.height - distanceFrom(
value: configuration.y.wrappedValue,
availableDistance: geometry.size.height,
bounds: configuration.yBounds,
leadingOffset: self.thumbSize.height / 2,
trailingOffset: self.thumbSize.height / 2
))

configuration.dragOffset.wrappedValue = CGPoint(x: gragOffsetX, y: dragOffsetY)
}

let computedValueX = valueFrom(
distance: gestureValue.location.x - (configuration.dragOffset.wrappedValue?.x ?? 0),
availableDistance: geometry.size.width,
Expand All @@ -108,7 +111,7 @@ public struct RectangularPointSliderStyle<Track: View, Thumb: View>: PointSlider
leadingOffset: self.thumbSize.width / 2,
trailingOffset: self.thumbSize.width / 2
)

let computedValueY = valueFrom(
distance: geometry.size.height - (gestureValue.location.y - (configuration.dragOffset.wrappedValue?.y ?? 0)),
availableDistance: geometry.size.height,
Expand All @@ -117,23 +120,22 @@ public struct RectangularPointSliderStyle<Track: View, Thumb: View>: PointSlider
leadingOffset: self.thumbSize.height / 2,
trailingOffset: self.thumbSize.height / 2
)

configuration.x.wrappedValue = computedValueX
configuration.y.wrappedValue = computedValueY
configuration.onEditingChanged(true)
}
.onEnded { _ in
configuration.dragOffset.wrappedValue = nil
configuration.onEditingChanged(false)
}
)

}
.frame(width: geometry.size.width, height: geometry.size.height)
}
.frame(minWidth: self.thumbInteractiveSize.width, minHeight: self.thumbInteractiveSize.height)
}

public init(track: Track, thumb: Thumb, thumbSize: CGSize = CGSize(width: 27, height: 27), thumbInteractiveSize: CGSize = CGSize(width: 44, height: 44), options: PointSliderOptions = .defaultOptions) {
self.track = track
self.thumb = thumb
Expand Down Expand Up @@ -176,6 +178,6 @@ extension RectangularPointSliderStyle where Thumb == DefaultThumb, Track == Defa
public struct DefaultRectangularPointTrack: View {
public var body: some View {
Rectangle()
.foregroundColor(.accentColor)
.foregroundColor(Color.accentColor)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ public struct HorizontalRangeSliderStyle<Track: View, LowerThumb: View, UpperThu

let lowerThumbSize: CGSize
let upperThumbSize: CGSize

let lowerThumbInteractiveSize: CGSize
let upperThumbInteractiveSize: CGSize

private let options: RangeSliderOptions

let onSelectLower: () -> Void
let onSelectUpper: () -> Void

Expand All @@ -28,8 +28,8 @@ public struct HorizontalRangeSliderStyle<Track: View, LowerThumb: View, UpperThu
upperLeadingOffset: self.lowerThumbSize.width + self.upperThumbSize.width / 2,
upperTrailingOffset: self.upperThumbSize.width / 2
))
.accentColor(.accentColor)
.accentColor(Color.accentColor)

ZStack {
self.lowerThumb
.frame(width: self.lowerThumbSize.width, height: self.lowerThumbSize.height)
Expand All @@ -51,9 +51,10 @@ public struct HorizontalRangeSliderStyle<Track: View, LowerThumb: View, UpperThu
.gesture(
DragGesture()
.onChanged { gestureValue in

configuration.onEditingChanged(true)

self.onSelectLower()

if configuration.dragOffset.wrappedValue == nil {
configuration.dragOffset.wrappedValue = gestureValue.startLocation.x - distanceFrom(
value: configuration.range.wrappedValue.lowerBound,
Expand All @@ -63,7 +64,7 @@ public struct HorizontalRangeSliderStyle<Track: View, LowerThumb: View, UpperThu
trailingOffset: self.lowerThumbSize.width / 2
)
}

let computedLowerBound = valueFrom(
distance: gestureValue.location.x - (configuration.dragOffset.wrappedValue ?? 0),
availableDistance: geometry.size.width - self.upperThumbSize.width,
Expand All @@ -72,23 +73,21 @@ public struct HorizontalRangeSliderStyle<Track: View, LowerThumb: View, UpperThu
leadingOffset: self.lowerThumbSize.width / 2,
trailingOffset: self.lowerThumbSize.width / 2
)

if self.options.contains(.forceAdjacentValue) {
let computedUpperBound = max(computedLowerBound, configuration.range.wrappedValue.upperBound)
configuration.range.wrappedValue = computedLowerBound...computedUpperBound
} else {
let computedLowerBound = min(computedLowerBound, configuration.range.wrappedValue.upperBound)
configuration.range.wrappedValue = computedLowerBound...configuration.range.wrappedValue.upperBound
}

configuration.onEditingChanged(true)
}
.onEnded { _ in
configuration.dragOffset.wrappedValue = nil
configuration.onEditingChanged(false)
}
)

ZStack {
self.upperThumb
.frame(width: self.upperThumbSize.width, height: self.upperThumbSize.height)
Expand All @@ -110,7 +109,8 @@ public struct HorizontalRangeSliderStyle<Track: View, LowerThumb: View, UpperThu
.gesture(
DragGesture()
.onChanged { gestureValue in

configuration.onEditingChanged(true)

self.onSelectUpper()

if configuration.dragOffset.wrappedValue == nil {
Expand All @@ -122,7 +122,7 @@ public struct HorizontalRangeSliderStyle<Track: View, LowerThumb: View, UpperThu
trailingOffset: self.upperThumbSize.width / 2
)
}

let computedUpperBound = valueFrom(
distance: gestureValue.location.x - (configuration.dragOffset.wrappedValue ?? 0),
availableDistance: geometry.size.width,
Expand All @@ -131,7 +131,7 @@ public struct HorizontalRangeSliderStyle<Track: View, LowerThumb: View, UpperThu
leadingOffset: self.lowerThumbSize.width + self.upperThumbSize.width / 2,
trailingOffset: self.upperThumbSize.width / 2
)

if self.options.contains(.forceAdjacentValue) {
let computedLowerBound = min(computedUpperBound, configuration.range.wrappedValue.lowerBound)
configuration.range.wrappedValue = computedLowerBound...computedUpperBound
Expand All @@ -140,7 +140,6 @@ public struct HorizontalRangeSliderStyle<Track: View, LowerThumb: View, UpperThu
configuration.range.wrappedValue = configuration.range.wrappedValue.lowerBound...computedUpperBound
}

configuration.onEditingChanged(true)
}
.onEnded { _ in
configuration.dragOffset.wrappedValue = nil
Expand All @@ -153,7 +152,7 @@ public struct HorizontalRangeSliderStyle<Track: View, LowerThumb: View, UpperThu
}
.frame(minHeight: max(self.lowerThumbInteractiveSize.height, self.upperThumbInteractiveSize.height))
}

public init(track: Track, lowerThumb: LowerThumb, upperThumb: UpperThumb, lowerThumbSize: CGSize = CGSize(width: 27, height: 27), upperThumbSize: CGSize = CGSize(width: 27, height: 27), lowerThumbInteractiveSize: CGSize = CGSize(width: 44, height: 44), upperThumbInteractiveSize: CGSize = CGSize(width: 44, height: 44), options: RangeSliderOptions = .defaultOptions,
onSelectLower: @escaping () -> Void = {},
onSelectUpper: @escaping () -> Void = {}) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ public struct VerticalRangeSliderStyle<Track: View, LowerThumb: View, UpperThumb

let lowerThumbSize: CGSize
let upperThumbSize: CGSize

let lowerThumbInteractiveSize: CGSize
let upperThumbInteractiveSize: CGSize

private let options: RangeSliderOptions

public func makeBody(configuration: Self.Configuration) -> some View {
Expand All @@ -25,8 +25,8 @@ public struct VerticalRangeSliderStyle<Track: View, LowerThumb: View, UpperThumb
upperLeadingOffset: self.lowerThumbSize.height + self.upperThumbSize.height / 2,
upperTrailingOffset: self.upperThumbSize.height / 2
))
.accentColor(.accentColor)
.accentColor(Color.accentColor)

ZStack {
self.lowerThumb
.frame(width: self.lowerThumbSize.width, height: self.lowerThumbSize.height)
Expand All @@ -45,6 +45,8 @@ public struct VerticalRangeSliderStyle<Track: View, LowerThumb: View, UpperThumb
.gesture(
DragGesture()
.onChanged { gestureValue in
configuration.onEditingChanged(true)

if configuration.dragOffset.wrappedValue == nil {
configuration.dragOffset.wrappedValue = gestureValue.startLocation.y - (geometry.size.height - distanceFrom(
value: configuration.range.wrappedValue.lowerBound,
Expand All @@ -54,7 +56,7 @@ public struct VerticalRangeSliderStyle<Track: View, LowerThumb: View, UpperThumb
trailingOffset: self.lowerThumbSize.height / 2
))
}

let computedLowerBound = valueFrom(
distance: geometry.size.height - (gestureValue.location.y - (configuration.dragOffset.wrappedValue ?? 0)),
availableDistance: geometry.size.height - self.upperThumbSize.height,
Expand All @@ -63,16 +65,14 @@ public struct VerticalRangeSliderStyle<Track: View, LowerThumb: View, UpperThumb
leadingOffset: self.lowerThumbSize.height / 2,
trailingOffset: self.lowerThumbSize.height / 2
)

if self.options.contains(.forceAdjacentValue) {
let computedUpperBound = max(computedLowerBound, configuration.range.wrappedValue.upperBound)
configuration.range.wrappedValue = computedLowerBound...computedUpperBound
} else {
let computedLowerBound = min(computedLowerBound, configuration.range.wrappedValue.upperBound)
configuration.range.wrappedValue = computedLowerBound...configuration.range.wrappedValue.upperBound
}

configuration.onEditingChanged(true)
}
.onEnded { _ in
configuration.dragOffset.wrappedValue = nil
Expand All @@ -98,6 +98,8 @@ public struct VerticalRangeSliderStyle<Track: View, LowerThumb: View, UpperThumb
.gesture(
DragGesture()
.onChanged { gestureValue in
configuration.onEditingChanged(true)

if configuration.dragOffset.wrappedValue == nil {
configuration.dragOffset.wrappedValue = gestureValue.startLocation.y - (geometry.size.height - distanceFrom(
value: configuration.range.wrappedValue.upperBound,
Expand All @@ -107,7 +109,7 @@ public struct VerticalRangeSliderStyle<Track: View, LowerThumb: View, UpperThumb
trailingOffset: self.upperThumbSize.height / 2
))
}

let computedUpperBound = valueFrom(
distance: geometry.size.height - (gestureValue.location.y - (configuration.dragOffset.wrappedValue ?? 0)),
availableDistance: geometry.size.height,
Expand All @@ -116,29 +118,27 @@ public struct VerticalRangeSliderStyle<Track: View, LowerThumb: View, UpperThumb
leadingOffset: self.lowerThumbSize.height + self.upperThumbSize.height / 2,
trailingOffset: self.upperThumbSize.height / 2
)

if self.options.contains(.forceAdjacentValue) {
let computedLowerBound = min(computedUpperBound, configuration.range.wrappedValue.lowerBound)
configuration.range.wrappedValue = computedLowerBound...computedUpperBound
} else {
let computedUpperBound = max(computedUpperBound, configuration.range.wrappedValue.lowerBound)
configuration.range.wrappedValue = configuration.range.wrappedValue.lowerBound...computedUpperBound
}

configuration.onEditingChanged(true)
}
.onEnded { _ in
configuration.dragOffset.wrappedValue = nil
configuration.onEditingChanged(false)
}
)

}
.frame(width: geometry.size.width)
}
.frame(minWidth: max(self.lowerThumbInteractiveSize.width, self.upperThumbInteractiveSize.width))
}

public init(track: Track, lowerThumb: LowerThumb, upperThumb: UpperThumb, lowerThumbSize: CGSize = CGSize(width: 27, height: 27), upperThumbSize: CGSize = CGSize(width: 27, height: 27), lowerThumbInteractiveSize: CGSize = CGSize(width: 44, height: 44), upperThumbInteractiveSize: CGSize = CGSize(width: 44, height: 44), options: RangeSliderOptions = .defaultOptions) {
self.track = track
self.lowerThumb = lowerThumb
Expand Down
Loading

0 comments on commit 5ba8614

Please sign in to comment.