Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,12 @@ final class KeyboardSettingsPaneViewModel: ObservableObject {
didSet { self.settings.isReversed = self.isReversed }
}

@Published var fadeDelay: Double {
didSet { self.settings.fadeDelay = CGFloat(self.fadeDelay) }
@Published var fadeDelay: TimeInterval {
didSet { self.settings.fadeDelay = self.fadeDelay }
}

@Published var fadeDuration: Double {
didSet { self.settings.fadeDuration = CGFloat(self.fadeDuration) }
@Published var fadeDuration: TimeInterval {
didSet { self.settings.fadeDuration = self.fadeDuration }
}

@Published var theme: KeyboardVisualizerTheme {
Expand Down Expand Up @@ -144,8 +144,8 @@ final class KeyboardSettingsPaneViewModel: ObservableObject {
self.anchor = settings.anchor
self.maxCount = settings.maxCount
self.isReversed = settings.isReversed
self.fadeDelay = Double(settings.fadeDelay)
self.fadeDuration = Double(settings.fadeDuration)
self.fadeDelay = settings.fadeDelay
self.fadeDuration = settings.fadeDuration
self.theme = settings.theme
self.legendColorMode = settings.legendColorMode
self.customLegendColor = settings.customLegendColor
Expand Down Expand Up @@ -212,8 +212,8 @@ final class KeyboardSettingsPaneViewModel: ObservableObject {
settings.anchor = self.anchor
settings.maxCount = self.maxCount
settings.isReversed = self.isReversed
settings.fadeDelay = CGFloat(self.fadeDelay)
settings.fadeDuration = CGFloat(self.fadeDuration)
settings.fadeDelay = self.fadeDelay
settings.fadeDuration = self.fadeDuration
settings.scale = Self.previewScale
settings.windowPadding = self.settings.windowPadding
settings.onlyShowModifiedKeystrokes = self.onlyShowModifiedKeystrokes
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,25 +23,20 @@ final class MouseSettingsPaneViewModel: ObservableObject {
Double(PointerRingSettingsKeys.thicknessRange.lowerBound)...Double(PointerRingSettingsKeys.thicknessRange.upperBound)
static let ringThicknessStep: Double = 1

static let ringDisplayDurationRange: ClosedRange<Double> =
Double(PointerRingSettingsKeys.displayDurationRange.lowerBound)...Double(PointerRingSettingsKeys.displayDurationRange.upperBound)
static let ringDisplayDurationStep: Double = 0.2
static let ringDisplayDurationRange = PointerRingSettingsKeys.displayDurationRange
static let ringDisplayDurationStep: TimeInterval = 0.2

static let ringFadeDurationRange: ClosedRange<Double> =
Double(PointerRingSettingsKeys.fadeDurationRange.lowerBound)...Double(PointerRingSettingsKeys.fadeDurationRange.upperBound)
static let ringFadeDurationStep: Double = 0.05
static let ringFadeDurationRange = PointerRingSettingsKeys.fadeDurationRange
static let ringFadeDurationStep: TimeInterval = 0.05

static let ripplesDurationRange: ClosedRange<Double> =
Double(PointerRipplesSettingsKeys.durationRange.lowerBound)...Double(PointerRipplesSettingsKeys.durationRange.upperBound)
static let ripplesDurationStep: Double = 0.1
static let ripplesDurationRange = PointerRipplesSettingsKeys.durationRange
static let ripplesDurationStep: TimeInterval = 0.1

static let iconClickDisplayDurationRange: ClosedRange<Double> =
Double(PointerIconSettingsKeys.clickDisplayDurationRange.lowerBound)...Double(PointerIconSettingsKeys.clickDisplayDurationRange.upperBound)
static let iconClickDisplayDurationStep: Double = 0.1
static let iconClickDisplayDurationRange = PointerIconSettingsKeys.clickDisplayDurationRange
static let iconClickDisplayDurationStep: TimeInterval = 0.1

static let iconScrollDisplayDurationRange: ClosedRange<Double> =
Double(PointerIconSettingsKeys.scrollDisplayDurationRange.lowerBound)...Double(PointerIconSettingsKeys.scrollDisplayDurationRange.upperBound)
static let iconScrollDisplayDurationStep: Double = 0.05
static let iconScrollDisplayDurationRange = PointerIconSettingsKeys.scrollDisplayDurationRange
static let iconScrollDisplayDurationStep: TimeInterval = 0.05

@Published var selectedSettingsTab = SettingsTab.ring

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,18 +67,18 @@ extension MouseSettingsPaneViewModel {
}
}

var clickDisplayDuration: Double {
var clickDisplayDuration: TimeInterval {
didSet {
let clamped = min(max(self.clickDisplayDuration, MouseSettingsPaneViewModel.iconClickDisplayDurationRange.lowerBound), MouseSettingsPaneViewModel.iconClickDisplayDurationRange.upperBound)
self.settings.clickDisplayDuration = CGFloat(clamped)
self.settings.clickDisplayDuration = clamped
self.onChange?()
}
}

var scrollDisplayDuration: Double {
var scrollDisplayDuration: TimeInterval {
didSet {
let clamped = min(max(self.scrollDisplayDuration, MouseSettingsPaneViewModel.iconScrollDisplayDurationRange.lowerBound), MouseSettingsPaneViewModel.iconScrollDisplayDurationRange.upperBound)
self.settings.scrollDisplayDuration = CGFloat(clamped)
self.settings.scrollDisplayDuration = clamped
self.onChange?()
}
}
Expand All @@ -92,8 +92,8 @@ extension MouseSettingsPaneViewModel {
self.sizeIndex = Double(settings.sizeIndex)
self.backgroundColor = settings.backgroundColor
self.tintColor = settings.tintColor
self.clickDisplayDuration = Double(settings.clickDisplayDuration)
self.scrollDisplayDuration = Double(settings.scrollDisplayDuration)
self.clickDisplayDuration = settings.clickDisplayDuration
self.scrollDisplayDuration = settings.scrollDisplayDuration
}

var backgroundColorSelectionID: String {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,18 +60,18 @@ extension MouseSettingsPaneViewModel {
}
}

var displayDuration: Double {
var displayDuration: TimeInterval {
didSet {
let clamped = min(max(self.displayDuration, MouseSettingsPaneViewModel.ringDisplayDurationRange.lowerBound), MouseSettingsPaneViewModel.ringDisplayDurationRange.upperBound)
self.settings.displayDuration = CGFloat(clamped)
self.settings.displayDuration = clamped
self.onChange?()
}
}

var fadeDuration: Double {
var fadeDuration: TimeInterval {
didSet {
let clamped = min(max(self.fadeDuration, MouseSettingsPaneViewModel.ringFadeDurationRange.lowerBound), MouseSettingsPaneViewModel.ringFadeDurationRange.upperBound)
self.settings.fadeDuration = CGFloat(clamped)
self.settings.fadeDuration = clamped
self.onChange?()
}
}
Expand All @@ -88,8 +88,8 @@ extension MouseSettingsPaneViewModel {
self.size = Double(settings.size)
self.thickness = Double(settings.thickness)
self.shape = settings.shape
self.displayDuration = Double(settings.displayDuration)
self.fadeDuration = Double(settings.fadeDuration)
self.displayDuration = settings.displayDuration
self.fadeDuration = settings.fadeDuration
}

var colorTitle: String {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,10 @@ extension MouseSettingsPaneViewModel {
}
}

var duration: Double {
var duration: TimeInterval {
didSet {
let clamped = min(max(self.duration, MouseSettingsPaneViewModel.ripplesDurationRange.lowerBound), MouseSettingsPaneViewModel.ripplesDurationRange.upperBound)
self.settings.duration = CGFloat(clamped)
self.settings.duration = clamped
self.onChange?()
}
}
Expand All @@ -72,7 +72,7 @@ extension MouseSettingsPaneViewModel {
self.size = Double(settings.size)
self.thickness = Double(settings.thickness)
self.shape = settings.shape
self.duration = Double(settings.duration)
self.duration = settings.duration
}

var colorSelectionID: String {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@ extension KeyboardVisualizerGroupView {

func scheduleFadeOut(onCompletion completion: @escaping () -> Void) {
self.fadeWorkItem?.cancel()
let delay = max(0.1, TimeInterval(self.settings.fadeDelay))
let duration = max(0, TimeInterval(self.settings.fadeDuration))
let delay = max(0.1, self.settings.fadeDelay)
let duration = max(0, self.settings.fadeDuration)
let workItem = DispatchWorkItem { [weak self] in
guard let self else { return }
NSAnimationContext.runAnimationGroup { context in
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ protocol KeyboardVisualizerSettingsProtocol: AnyObject {
var maxCount: Int { get set }
var isReversed: Bool { get set }

var fadeDelay: CGFloat { get set }
var fadeDuration: CGFloat { get set }
var fadeDelay: TimeInterval { get set }
var fadeDuration: TimeInterval { get set }

var theme: KeyboardVisualizerTheme { get set }
var legendColorMode: KeyboardLegendColorMode { get set }
Expand Down Expand Up @@ -177,18 +177,18 @@ final class KeyboardVisualizerSettings: KeyboardVisualizerSettingsProtocol, HasS
}
}

@Stored(.cgFloat(KeyboardVisualizerSettingsKeys.fadeDelay, default: 2.0))
private var storedFadeDelay: CGFloat
@Stored(.timeInterval(KeyboardVisualizerSettingsKeys.fadeDelay, default: 2.0))
private var storedFadeDelay: TimeInterval

var fadeDelay: CGFloat {
var fadeDelay: TimeInterval {
get { self.storedFadeDelay > 0 ? self.storedFadeDelay : 2.0 }
set { self.storedFadeDelay = newValue }
}

@Stored(.cgFloat(KeyboardVisualizerSettingsKeys.fadeDuration, default: 0.2))
private var storedFadeDuration: CGFloat
@Stored(.timeInterval(KeyboardVisualizerSettingsKeys.fadeDuration, default: 0.2))
private var storedFadeDuration: TimeInterval

var fadeDuration: CGFloat {
var fadeDuration: TimeInterval {
get { self.storedFadeDuration >= 0 ? self.storedFadeDuration : 0.2 }
set { self.storedFadeDuration = newValue }
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ final class PointerIconContentView: NSView {
self.resetWorkItem = nil

if Self.isMouseRelease(mouseEvent.type) {
self.scheduleReset(after: TimeInterval(self.settings.clickDisplayDuration))
self.scheduleReset(after: self.settings.clickDisplayDuration)
return
}

Expand All @@ -105,7 +105,7 @@ final class PointerIconContentView: NSView {
self.setTransientlyVisible(visualState.isTransientlyVisible)

if mouseEvent.type == .scrollWheel, MouseEventDisplayRenderer.scrollIcon(for: mouseEvent.kind) != nil {
self.scheduleReset(after: TimeInterval(self.settings.scrollDisplayDuration))
self.scheduleReset(after: self.settings.scrollDisplayDuration)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ protocol PointerIconSettingsProtocol: AnyObject {
var tintColor: NSColor { get set }
var sizeIndex: Int { get set }
var iconSize: NSSize { get }
var clickDisplayDuration: CGFloat { get set }
var scrollDisplayDuration: CGFloat { get set }
var clickDisplayDuration: TimeInterval { get set }
var scrollDisplayDuration: TimeInterval { get set }

func registerDefaults()
func resetToDefaults()
Expand Down Expand Up @@ -68,19 +68,19 @@ final class PointerIconSettings: PointerIconSettingsProtocol, ReactiveSettings,
@Stored(.int(PointerIconSettingsKeys.size, default: PointerIconSettingsKeys.defaultSizeIndex))
private var storedSizeIndex: Int

@Stored(.cgFloat(
@Stored(.timeInterval(
PointerIconSettingsKeys.clickDisplayDuration,
default: PointerIconSettingsKeys.defaultClickDisplayDuration,
clamp: PointerIconSettingsKeys.clickDisplayDurationRange
))
var clickDisplayDuration: CGFloat
var clickDisplayDuration: TimeInterval

@Stored(.cgFloat(
@Stored(.timeInterval(
PointerIconSettingsKeys.scrollDisplayDuration,
default: PointerIconSettingsKeys.defaultScrollDisplayDuration,
clamp: PointerIconSettingsKeys.scrollDisplayDurationRange
))
var scrollDisplayDuration: CGFloat
var scrollDisplayDuration: TimeInterval

var sizeIndex: Int {
get {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@ enum PointerIconSettingsKeys {
static let defaultBackgroundColor: NSColor = Color.Theme.Palette.black60
static let defaultTintColor: NSColor = Color.Theme.Palette.white
static let defaultSizeIndex: Int = 2
static let defaultClickDisplayDuration: CGFloat = 0
static let defaultScrollDisplayDuration: CGFloat = 0.35
static let clickDisplayDurationRange: ClosedRange<CGFloat> = 0...2
static let scrollDisplayDurationRange: ClosedRange<CGFloat> = 0.1...2
static let defaultClickDisplayDuration: TimeInterval = 0
static let defaultScrollDisplayDuration: TimeInterval = 0.35
static let clickDisplayDurationRange: ClosedRange<TimeInterval> = 0...2
static let scrollDisplayDurationRange: ClosedRange<TimeInterval> = 0.1...2

// 10 preset icon sizes (w×h), aspect ratio ~3:4
static let iconSizes: [NSSize] = [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ protocol PointerRingSettingsProtocol: AnyObject {
var size: CGFloat { get set }
var thickness: CGFloat { get set }
var shape: PointerRingShape { get set }
var displayDuration: CGFloat { get set }
var fadeDuration: CGFloat { get set }
var displayDuration: TimeInterval { get set }
var fadeDuration: TimeInterval { get set }

func registerDefaults()
func resetToDefaults()
Expand Down Expand Up @@ -78,19 +78,19 @@ final class PointerRingSettings: PointerRingSettingsProtocol, ReactiveSettings,
@Stored(.enum(PointerRingSettingsKeys.shape, default: PointerRingSettingsKeys.defaultShape))
var shape: PointerRingShape

@Stored(.cgFloat(
@Stored(.timeInterval(
PointerRingSettingsKeys.displayDuration,
default: PointerRingSettingsKeys.defaultDisplayDuration,
clamp: PointerRingSettingsKeys.displayDurationRange
))
var displayDuration: CGFloat
var displayDuration: TimeInterval

@Stored(.cgFloat(
@Stored(.timeInterval(
PointerRingSettingsKeys.fadeDuration,
default: PointerRingSettingsKeys.defaultFadeDuration,
clamp: PointerRingSettingsKeys.fadeDurationRange
))
var fadeDuration: CGFloat
var fadeDuration: TimeInterval

private var currentVisualSettingsSnapshot: VisualSettingsSnapshot {
VisualSettingsSnapshot(
Expand Down Expand Up @@ -131,7 +131,7 @@ private extension PointerRingSettings {
let size: CGFloat
let thickness: CGFloat
let shape: PointerRingShape
let displayDuration: CGFloat
let fadeDuration: CGFloat
let displayDuration: TimeInterval
let fadeDuration: TimeInterval
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,12 @@ enum PointerRingSettingsKeys {
static let defaultSize = CGFloat(75)
static let defaultThickness = CGFloat(5)
static let defaultShape = PointerRingShape.circle
static let defaultDisplayDuration = CGFloat(0)
static let defaultFadeDuration = CGFloat(0.25)
static let defaultDisplayDuration: TimeInterval = 0
static let defaultFadeDuration: TimeInterval = 0.25
static let sizeRange: ClosedRange<CGFloat> = 24...96
static let thicknessRange: ClosedRange<CGFloat> = 1...12
static let displayDurationRange: ClosedRange<CGFloat> = 0...2
static let fadeDurationRange: ClosedRange<CGFloat> = 0.2...1
static let displayDurationRange: ClosedRange<TimeInterval> = 0...2
static let fadeDurationRange: ClosedRange<TimeInterval> = 0.2...1

static var automaticVisualizerColor: NSColor {
return .controlAccentColor
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ public final class PointerRingVisualizerWindow: NSWindow {
private func fadeOut() {
guard self.interactionState.beginFade() else { return }

let duration = TimeInterval(self.settings.fadeDuration)
let duration = self.settings.fadeDuration
guard duration > 0 else {
self.setRingLayerState(
opacity: Float(PointerRingAnimation.hiddenOpacity),
Expand Down Expand Up @@ -178,7 +178,7 @@ public final class PointerRingVisualizerWindow: NSWindow {
}
self.fadeOutWorkItem = fadeOutWorkItem
DispatchQueue.main.asyncAfter(
deadline: .now() + TimeInterval(self.settings.displayDuration),
deadline: .now() + self.settings.displayDuration,
execute: fadeOutWorkItem
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ protocol PointerRipplesSettingsProtocol: AnyObject {
var size: CGFloat { get set }
var thickness: CGFloat { get set }
var shape: PointerRingShape { get set }
var duration: CGFloat { get set }
var duration: TimeInterval { get set }

func registerDefaults()
func resetToDefaults()
Expand Down Expand Up @@ -73,12 +73,12 @@ final class PointerRipplesSettings: PointerRipplesSettingsProtocol, ReactiveSett
@Stored(.enum(PointerRipplesSettingsKeys.shape, default: PointerRipplesSettingsKeys.defaultShape))
var shape: PointerRingShape

@Stored(.cgFloat(
@Stored(.timeInterval(
PointerRipplesSettingsKeys.duration,
default: PointerRipplesSettingsKeys.defaultDuration,
clamp: PointerRipplesSettingsKeys.durationRange
))
var duration: CGFloat
var duration: TimeInterval

private var currentVisualSettingsSnapshot: VisualSettingsSnapshot {
VisualSettingsSnapshot(
Expand Down Expand Up @@ -115,6 +115,6 @@ private extension PointerRipplesSettings {
let size: CGFloat
let thickness: CGFloat
let shape: PointerRingShape
let duration: CGFloat
let duration: TimeInterval
}
}
Loading
Loading