added publishers/cancellables

Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
Matt Bruce 2024-03-27 15:24:40 -05:00
parent 6380026eaa
commit c64caa7a9f

View File

@ -100,25 +100,99 @@ open class CarouselScrollbar: View {
setNeedsUpdate()
}
}
/// Allows a unique id to be passed into the thumb and track of the thumb(scrubber).
open var scrubberId: Int? { didSet { setNeedsUpdate() } }
/// A callback when the scrubber position changes. Passes parameters (position).
open var onScrubberDrag: ((Int) -> Void)?
open var onScrubberDrag: ((Int) -> Void)? {
get { nil }
set {
onScrubberDragCancellable?.cancel()
if let newValue {
onScrubberDragCancellable = onScrubberDragPublisher
.sink { c in
newValue(c)
}
}
}
}
/// A publisher for when the scrubber position changes. Passes parameters (position).
open var onScrubberDragPublisher = PassthroughSubject<Int, Never>()
private var onScrubberDragCancellable: AnyCancellable?
/// A callback when the thumb move forward. Passes parameters (position).
open var onMoveForward: ((Int) -> Void)?
open var onMoveForward: ((Int) -> Void)? {
get { nil }
set {
onMoveForwardCancellable?.cancel()
if let newValue {
onMoveForwardCancellable = onMoveForwardPublisher
.sink { c in
newValue(c)
}
}
}
}
/// A publisher for when the thumb move forward. Passes parameters (position).
open var onMoveForwardPublisher = PassthroughSubject<Int, Never>()
private var onMoveForwardCancellable: AnyCancellable?
/// A callback when the thumb move backward. Passes parameters (position).
open var onMoveBackward: ((Int) -> Void)?
open var onMoveBackward: ((Int) -> Void)? {
get { nil }
set {
onMoveBackwardCancellable?.cancel()
if let newValue {
onMoveBackwardCancellable = onMoveBackwardPublisher
.sink { c in
newValue(c)
}
}
}
}
/// A publisher for when the thumb move backward. Passes parameters (position).
open var onMoveBackwardPublisher = PassthroughSubject<Int, Never>()
private var onMoveBackwardCancellable: AnyCancellable?
/// A callback when the thumb touch start. Passes parameters (position).
open var onThumbTouchStart: ((Int) -> Void)?
open var onThumbTouchStart: ((Int) -> Void)? {
get { nil }
set {
onThumbTouchStartCancellable?.cancel()
if let newValue {
onThumbTouchStartCancellable = onThumbTouchStartPublisher
.sink { c in
newValue(c)
}
}
}
}
/// A publisher for when the thumb touch start. Passes parameters (position).
open var onThumbTouchStartPublisher = PassthroughSubject<Int, Never>()
private var onThumbTouchStartCancellable: AnyCancellable?
/// A callback when the thumb touch end. Passes parameters (position).
open var onThumbTouchEnd: ((Int) -> Void)?
open var onThumbTouchEnd: ((Int) -> Void)? {
get { nil }
set {
onThumbTouchEndCancellable?.cancel()
if let newValue {
onThumbTouchEndCancellable = onThumbTouchEndPublisher
.sink { c in
newValue(c)
}
}
}
}
/// A publisher for when the thumb touch end. Passes parameters (position).
open var onThumbTouchEndPublisher = PassthroughSubject<Int, Never>()
private var onThumbTouchEndCancellable: AnyCancellable?
//--------------------------------------------------
// MARK: - Private Properties
@ -250,13 +324,13 @@ open class CarouselScrollbar: View {
func movePositionBackward() {
position = position - 1
scrollThumbToPosition(position)
self.onMoveBackward?(position)
onMoveBackwardPublisher.send(position)
}
func movePositionForward() {
position = position + 1
scrollThumbToPosition(position)
self.onMoveForward?(position)
onMoveForwardPublisher.send(position)
}
// Compute track width and should maintain minimum thumb width if needed
@ -298,12 +372,13 @@ open class CarouselScrollbar: View {
}
private func scrollThumbToPosition(_ position: Int) {
self.setThumb(at: position)
self.onScrubberDrag?(position)
setThumb(at: position)
onScrubberDragPublisher.send(position)
}
private func setThumb(at position: Int) {
UIView.animate(withDuration: 0.1, delay: 0.0, options: .curveLinear, animations: {
UIView.animate(withDuration: 0.1, delay: 0.0, options: .curveLinear, animations: { [weak self] in
guard let self else { return }
self.thumbView.frame.origin.x = CGFloat(Float((position) - 1) * self.computedWidth) + self.trackView.frame.origin.x
self.updateActiveOverlays()
})
@ -318,7 +393,7 @@ open class CarouselScrollbar: View {
let translation = sender.translation(in: thumbView)
if sender.state == UIGestureRecognizer.State.began {
trayOriginalCenter = thumbView.center
self.onThumbTouchStart?(position)
onThumbTouchStartPublisher.send(position)
} else if sender.state == UIGestureRecognizer.State.changed {
let draggedPositions = Int (ceil (Double(translation.x) / Double(computedWidth)))
setThumb(at: position + draggedPositions)
@ -327,7 +402,7 @@ open class CarouselScrollbar: View {
let draggedPositions = Int (ceil (Double(translation.x) / Double(computedWidth)))
position = ((position + draggedPositions) < 1) ? 1 : (position + draggedPositions)
if sender.state == UIGestureRecognizer.State.ended {
self.onThumbTouchEnd?(position)
onThumbTouchEndPublisher.send(position)
}
}
}