diff --git a/DynamicIsland/DynamicIslandApp.swift b/DynamicIsland/DynamicIslandApp.swift index 59981a7..0640878 100644 --- a/DynamicIsland/DynamicIslandApp.swift +++ b/DynamicIsland/DynamicIslandApp.swift @@ -345,6 +345,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { Defaults.Keys.migrateProgressBarStyle() Defaults.Keys.migrateMusicAuxControls() Defaults.Keys.migrateMusicControlSlots() + Defaults.Keys.migrateCapsLockTintMode() // Initialize idle animations (load bundled + built-in face) idleAnimationManager.initializeDefaultAnimations() diff --git a/DynamicIsland/Localizable.xcstrings b/DynamicIsland/Localizable.xcstrings index 84fc92e..0f8860d 100644 --- a/DynamicIsland/Localizable.xcstrings +++ b/DynamicIsland/Localizable.xcstrings @@ -4628,6 +4628,9 @@ }, "Caps Lock" : { + }, + "Caps Lock color" : { + }, "Caps Lock Indicator" : { diff --git a/DynamicIsland/components/Live activities/InlineHUD.swift b/DynamicIsland/components/Live activities/InlineHUD.swift index 217b465..310ec35 100644 --- a/DynamicIsland/components/Live activities/InlineHUD.swift +++ b/DynamicIsland/components/Live activities/InlineHUD.swift @@ -26,6 +26,7 @@ struct InlineHUD: View { @Default(.showBluetoothDeviceNameMarquee) var showBluetoothDeviceNameMarquee @Default(.enableMinimalisticUI) var enableMinimalisticUI @Default(.showCapsLockLabel) var showCapsLockLabel + @Default(.capsLockIndicatorTintMode) var capsLockTintMode @ObservedObject var bluetoothManager = BluetoothAudioManager.shared @State private var displayName: String = "" @@ -33,7 +34,7 @@ struct InlineHUD: View { var body: some View { let useCircularIndicator = useCircularBluetoothBatteryIndicator let hasBatteryLevel = value > 0 - let capsLockAccentColor: Color = Defaults[.capsLockIndicatorUseGreenColor] ? .green : .white + let capsLockAccentColor = capsLockTintMode.color let baseInfoWidth: CGFloat = { if type == .bluetoothAudio { diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index 34d406b..546eefd 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -2538,6 +2538,7 @@ struct LiveActivitiesSettings: View { @Default(.enableScreenRecordingDetection) var enableScreenRecordingDetection @Default(.enableDoNotDisturbDetection) var enableDoNotDisturbDetection @Default(.focusIndicatorNonPersistent) var focusIndicatorNonPersistent + @Default(.capsLockIndicatorTintMode) var capsLockTintMode private func highlightID(_ title: String) -> String { SettingsTab.liveActivities.highlightID(for: title) @@ -2647,9 +2648,14 @@ struct LiveActivitiesSettings: View { .disabled(!Defaults[.enableCapsLockIndicator]) .settingsHighlight(id: highlightID("Show Caps Lock label")) - Defaults.Toggle("Use green color for Caps Lock text", key: .capsLockIndicatorUseGreenColor) - .disabled(!Defaults[.enableCapsLockIndicator]) - .settingsHighlight(id: highlightID("Use green color for Caps Lock text")) + Picker("Caps Lock color", selection: $capsLockTintMode) { + ForEach(CapsLockIndicatorTintMode.allCases) { mode in + Text(mode.displayName).tag(mode) + } + } + .pickerStyle(.segmented) + .disabled(!Defaults[.enableCapsLockIndicator]) + .settingsHighlight(id: highlightID("Caps Lock color")) } header: { Text("Caps Lock Indicator") } footer: { diff --git a/DynamicIsland/models/Constants.swift b/DynamicIsland/models/Constants.swift index b54873d..39e655d 100644 --- a/DynamicIsland/models/Constants.swift +++ b/DynamicIsland/models/Constants.swift @@ -191,6 +191,36 @@ enum SneakPeekStyle: String, CaseIterable, Identifiable, Defaults.Serializable { var id: String { self.rawValue } } +enum CapsLockIndicatorTintMode: String, CaseIterable, Identifiable, Defaults.Serializable { + case green + case accent + case white + + var id: String { rawValue } + + var displayName: String { + switch self { + case .green: + return "Green" + case .accent: + return "Accent" + case .white: + return "White" + } + } + + var color: Color { + switch self { + case .green: + return .green + case .accent: + return .accentColor + case .white: + return .white + } + } +} + enum ProgressBarStyle: String, CaseIterable, Identifiable, Defaults.Serializable { case hierarchical = "Hierarchical" case gradient = "Gradient" @@ -740,7 +770,9 @@ extension Defaults.Keys { // MARK: Caps Lock Indicator static let enableCapsLockIndicator = Key("enableCapsLockIndicator", default: true) - static let capsLockIndicatorUseGreenColor = Key("capsLockIndicatorUseGreenColor", default: false) + static let capsLockIndicatorUseGreenColor = Key("capsLockIndicatorUseGreenColor", default: false) // Legacy toggle + static let capsLockIndicatorTintMode = Key("capsLockIndicatorTintMode", default: .white) + static let didMigrateCapsLockTintMode = Key("didMigrateCapsLockTintMode", default: false) static let showCapsLockLabel = Key("showCapsLockLabel", default: true) // MARK: ImageService @@ -793,6 +825,14 @@ extension Defaults.Keys { normalizeMusicAuxControls() } + static func migrateCapsLockTintMode() { + guard Defaults[.didMigrateCapsLockTintMode] == false else { return } + + let legacyGreen = Defaults[.capsLockIndicatorUseGreenColor] + Defaults[.capsLockIndicatorTintMode] = legacyGreen ? .green : .white + Defaults[.didMigrateCapsLockTintMode] = true + } + static func migrateMusicControlSlots() { guard Defaults[.didMigrateMusicControlSlots] == false else { return }