diff --git a/Clocker/Panel/PanelController.swift b/Clocker/Panel/PanelController.swift index 866d480..d84ad5a 100644 --- a/Clocker/Panel/PanelController.swift +++ b/Clocker/Panel/PanelController.swift @@ -25,6 +25,8 @@ class PanelController: ParentPanelController { window?.title = "Clocker Panel" window?.setAccessibilityIdentifier("Clocker Panel") + // Otherwise, the panel can be dragged around while we try to scroll through the modern slider + window?.isMovableByWindowBackground = false futureSlider.isContinuous = true @@ -82,7 +84,7 @@ class PanelController: ParentPanelController { if DataStore.shared().timezones().isEmpty || DataStore.shared().shouldDisplay(.futureSlider) == false { futureSliderView.isHidden = true modernContainerView.isHidden = true - } else if let value = DataStore.shared().retrieve(key: CLDisplayFutureSliderKey) as? NSNumber { + } else if let value = DataStore.shared().retrieve(key: CLDisplayFutureSliderKey) as? NSNumber, modernContainerView != nil { if value.intValue == 1 { futureSliderView.isHidden = false modernContainerView.isHidden = true @@ -95,9 +97,12 @@ class PanelController: ParentPanelController { // Reset future slider value to zero futureSlider.integerValue = 0 sliderDatePicker.dateValue = Date() - closestQuarterTimeRepresentation = setModernLabel() - let indexPaths: Set = Set([IndexPath(item: modernSlider.numberOfItems(inSection: 0) / 2, section: 0)]) - modernSlider.scrollToItems(at: indexPaths, scrollPosition: .centeredHorizontally) + closestQuarterTimeRepresentation = setModernSliderLabel() + + if modernSlider != nil { + let indexPaths: Set = Set([IndexPath(item: modernSlider.numberOfItems(inSection: 0) / 2, section: 0)]) + modernSlider.scrollToItems(at: indexPaths, scrollPosition: .centeredHorizontally) + } setTimezoneDatasourceSlider(sliderValue: 0) diff --git a/Clocker/Panel/ParentPanelController+ModernSlider.swift b/Clocker/Panel/ParentPanelController+ModernSlider.swift index 110bc98..d41b033 100644 --- a/Clocker/Panel/ParentPanelController+ModernSlider.swift +++ b/Clocker/Panel/ParentPanelController+ModernSlider.swift @@ -53,7 +53,7 @@ extension ParentPanelController { } @discardableResult - public func setModernLabel(_ shouldUpdate: Bool = false) -> Date { + public func setModernSliderLabel(_ shouldUpdate: Bool = false) -> Date { let defaultParameters = minuteFromCalendar() let hourQuarterDate = Calendar.current.nextDate(after: defaultParameters.0, matching: DateComponents(minute: defaultParameters.1), @@ -85,7 +85,7 @@ extension ParentPanelController { modernSliderLabel.stringValue = timezoneFormattedStringRepresentation(previousDate) return previousDate.minutes(from: Date()) } else { - setModernLabel(true) + setModernSliderLabel(true) return 0 } } diff --git a/Clocker/Panel/ParentPanelController.swift b/Clocker/Panel/ParentPanelController.swift index 5d4ad0d..a3ccb8b 100644 --- a/Clocker/Panel/ParentPanelController.swift +++ b/Clocker/Panel/ParentPanelController.swift @@ -207,7 +207,7 @@ class ParentPanelController: NSWindowController { selector: #selector(collectionViewDidScroll(_:)), name: NSView.boundsDidChangeNotification, object: modernSlider.superview) - closestQuarterTimeRepresentation = setModernLabel() + closestQuarterTimeRepresentation = setModernSliderLabel() let indexPaths: Set = Set([IndexPath(item: modernSlider.numberOfItems(inSection: 0) / 2, section: 0)]) modernSlider.scrollToItems(at: indexPaths, scrollPosition: .centeredHorizontally) } @@ -583,6 +583,12 @@ class ParentPanelController: NSWindowController { let preferences = store.timezones() + if modernSlider != nil, modernSlider.isHidden == false, modernContainerView.currentlyInFocus == false { + setModernSliderLabel() + let indexPaths: Set = Set([IndexPath(item: modernSlider.numberOfItems(inSection: 0) / 2, section: 0)]) + modernSlider.animator().scrollToItems(at: indexPaths, scrollPosition: .centeredHorizontally) + } + stride(from: 0, to: preferences.count, by: 1).forEach { let current = preferences[$0] @@ -612,7 +618,6 @@ class ParentPanelController: NSWindowController { } cellView.layout(with: model) updateDatePicker() - setModernLabel() } } } diff --git a/Clocker/Panel/Rate Controller/UpcomingEventView.swift b/Clocker/Panel/Rate Controller/UpcomingEventView.swift index 281c846..36aba0d 100644 --- a/Clocker/Panel/Rate Controller/UpcomingEventView.swift +++ b/Clocker/Panel/Rate Controller/UpcomingEventView.swift @@ -62,11 +62,26 @@ class ModernSliderContainerView: NSView { } class ThinScroller: NSScroller { + private var trackingArea: NSTrackingArea? + override class func scrollerWidth(for _: NSControl.ControlSize, scrollerStyle _: NSScroller.Style) -> CGFloat { return 15 } + override class func awakeFromNib() { + super.awakeFromNib() + } + override func drawKnobSlot(in _: NSRect, highlight _: Bool) { // Leaving this empty to prevent background drawing } + + override func drawKnob() { + let knobRect = rect(for: .knob) + let knobDimensions: CGFloat = 10.0 + let newRect = NSMakeRect(knobRect.origin.x, knobRect.origin.y + 5, knobDimensions, knobDimensions) + let path = NSBezierPath(ovalIn: newRect) + NSColor.lightGray.set() + path.fill() + } } diff --git a/Clocker/Panel/UI/FloatingWindow.xib b/Clocker/Panel/UI/FloatingWindow.xib index 567fc3a..5ead502 100644 --- a/Clocker/Panel/UI/FloatingWindow.xib +++ b/Clocker/Panel/UI/FloatingWindow.xib @@ -42,7 +42,7 @@ - + @@ -281,7 +281,7 @@ -