mirror of
https://github.com/FBukovina/Atoll.git
synced 2026-10-27 15:14:33 +00:00
Update stuff
This commit is contained in:
parent
0ff09f7524
commit
6cdce7a785
2 changed files with 82 additions and 160 deletions
|
|
@ -2710,10 +2710,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"1 s" : {
|
|
||||||
"comment" : "A description of a 1-second update interval.",
|
|
||||||
"isCommentAutoGenerated" : true
|
|
||||||
},
|
|
||||||
"1. Open Spotify in a browser and log in" : {
|
"1. Open Spotify in a browser and log in" : {
|
||||||
"comment" : "A step in the process of getting the Spotify cookie.",
|
"comment" : "A step in the process of getting the Spotify cookie.",
|
||||||
"isCommentAutoGenerated" : true
|
"isCommentAutoGenerated" : true
|
||||||
|
|
@ -2813,10 +2809,6 @@
|
||||||
"comment" : "A step to copy the Spotify cookie from the developer tools.",
|
"comment" : "A step to copy the Spotify cookie from the developer tools.",
|
||||||
"isCommentAutoGenerated" : true
|
"isCommentAutoGenerated" : true
|
||||||
},
|
},
|
||||||
"3 hours" : {
|
|
||||||
"comment" : "\"3 hours\" is a placeholder for a longer, more natural name for 3 hours.",
|
|
||||||
"isCommentAutoGenerated" : true
|
|
||||||
},
|
|
||||||
"3 items" : {
|
"3 items" : {
|
||||||
"comment" : "merge:ko:alt='항목 3개'",
|
"comment" : "merge:ko:alt='항목 3개'",
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
|
|
@ -2862,10 +2854,6 @@
|
||||||
"comment" : "A step in the process of getting the Spotify cookie.",
|
"comment" : "A step in the process of getting the Spotify cookie.",
|
||||||
"isCommentAutoGenerated" : true
|
"isCommentAutoGenerated" : true
|
||||||
},
|
},
|
||||||
"3D" : {
|
|
||||||
"comment" : "A title for a 3D Bluetooth HUD icon style.",
|
|
||||||
"isCommentAutoGenerated" : true
|
|
||||||
},
|
|
||||||
"5 colors" : {
|
"5 colors" : {
|
||||||
"comment" : "merge:ko:alt='5가지 색상'",
|
"comment" : "merge:ko:alt='5가지 색상'",
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
|
|
@ -3004,10 +2992,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"6 hours" : {
|
|
||||||
"comment" : "\"6 hours\" is a calendar time range.",
|
|
||||||
"isCommentAutoGenerated" : true
|
|
||||||
},
|
|
||||||
"7 items" : {
|
"7 items" : {
|
||||||
"comment" : "merge:ko:alt='항목 7개'",
|
"comment" : "merge:ko:alt='항목 7개'",
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
|
|
@ -3159,10 +3143,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"12 hours" : {
|
|
||||||
"comment" : "\"12 hours\" is a placeholder for a time period of 12 hours.",
|
|
||||||
"isCommentAutoGenerated" : true
|
|
||||||
},
|
|
||||||
"15 colors" : {
|
"15 colors" : {
|
||||||
"comment" : "merge:ko:alt='15가지 색상'",
|
"comment" : "merge:ko:alt='15가지 색상'",
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
|
|
@ -3417,10 +3397,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"60 s (1 min)" : {
|
|
||||||
"comment" : "A description of a 60-second update interval.",
|
|
||||||
"isCommentAutoGenerated" : true
|
|
||||||
},
|
|
||||||
"100" : {
|
"100" : {
|
||||||
"comment" : "The text displayed below a 100% battery level in the lock screen.",
|
"comment" : "The text displayed below a 100% battery level in the lock screen.",
|
||||||
"isCommentAutoGenerated" : true,
|
"isCommentAutoGenerated" : true,
|
||||||
|
|
@ -5643,10 +5619,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"All time" : {
|
|
||||||
"comment" : "Calendar option to show all events for the current day.",
|
|
||||||
"isCommentAutoGenerated" : true
|
|
||||||
},
|
|
||||||
"All-day" : {
|
"All-day" : {
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
"ar" : {
|
"ar" : {
|
||||||
|
|
@ -8562,14 +8534,6 @@
|
||||||
},
|
},
|
||||||
"shouldTranslate" : false
|
"shouldTranslate" : false
|
||||||
},
|
},
|
||||||
"BetterDisplay is installed but not currently running. Launch BetterDisplay to enable integration." : {
|
|
||||||
"comment" : "A description of the status of the BetterDisplay integration.",
|
|
||||||
"isCommentAutoGenerated" : true
|
|
||||||
},
|
|
||||||
"BetterDisplay OSD events will be routed through Atoll's active HUD style. Brightness is always routed; volume is routed when external volume control listener is enabled below. Make sure BetterDisplay's OSD integration is enabled in Settings › Application › Integration." : {
|
|
||||||
"comment" : "A description of how BetterDisplay is integrated with Atoll.",
|
|
||||||
"isCommentAutoGenerated" : true
|
|
||||||
},
|
|
||||||
"Blue dashed box shows actual size in Atoll" : {
|
"Blue dashed box shows actual size in Atoll" : {
|
||||||
"extractionState" : "stale",
|
"extractionState" : "stale",
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
|
|
@ -9986,6 +9950,7 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Center" : {
|
"Center" : {
|
||||||
|
"extractionState" : "stale",
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
"de" : {
|
"de" : {
|
||||||
"stringUnit" : {
|
"stringUnit" : {
|
||||||
|
|
@ -13290,10 +13255,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Connected to Lunar's DDC socket. Brightness and contrast adjustments are shown through Atoll's HUD; volume follows when external volume control listener is enabled below." : {
|
|
||||||
"comment" : "A description of the connection status of the external display.",
|
|
||||||
"isCommentAutoGenerated" : true
|
|
||||||
},
|
|
||||||
"Connects directly to the Apple Music app." : {
|
"Connects directly to the Apple Music app." : {
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
"ko" : {
|
"ko" : {
|
||||||
|
|
@ -17155,9 +17116,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"Display Overlay" : {
|
|
||||||
|
|
||||||
},
|
},
|
||||||
"Display Style" : {
|
"Display Style" : {
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
|
|
@ -25680,14 +25638,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Install [BetterDisplay](https://betterdisplay.pro) to control external display brightness (and optional volume) through Atoll's HUD." : {
|
|
||||||
"comment" : "A description of the status of the BetterDisplay integration.",
|
|
||||||
"isCommentAutoGenerated" : true
|
|
||||||
},
|
|
||||||
"Install [Lunar](https://lunar.fyi) to control external display brightness, contrast, and optional volume through Atoll's HUD via DDC." : {
|
|
||||||
"comment" : "A description of how to enable external display control via Lunar.",
|
|
||||||
"isCommentAutoGenerated" : true
|
|
||||||
},
|
|
||||||
"Install updates automatically" : {
|
"Install updates automatically" : {
|
||||||
"comment" : "merge:ko:alt='자동으로 업데이트 설치'",
|
"comment" : "merge:ko:alt='자동으로 업데이트 설치'",
|
||||||
"extractionState" : "stale",
|
"extractionState" : "stale",
|
||||||
|
|
@ -28071,14 +28021,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Lunar is installed but not currently running. Launch Lunar to enable integration." : {
|
|
||||||
"comment" : "A description of the state of the Lunar display integration.",
|
|
||||||
"isCommentAutoGenerated" : true
|
|
||||||
},
|
|
||||||
"Lunar is running but the socket connection is not yet established. It will connect automatically." : {
|
|
||||||
"comment" : "A description of the current state of the Lunar DDC socket connection.",
|
|
||||||
"isCommentAutoGenerated" : true
|
|
||||||
},
|
|
||||||
"Lyrics" : {
|
"Lyrics" : {
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
"ko" : {
|
"ko" : {
|
||||||
|
|
@ -33431,10 +33373,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Not detected" : {
|
|
||||||
"comment" : "A description of a display provider that is not detected.",
|
|
||||||
"isCommentAutoGenerated" : true
|
|
||||||
},
|
|
||||||
"Not Determined" : {
|
"Not Determined" : {
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
"ko" : {
|
"ko" : {
|
||||||
|
|
@ -38678,10 +38616,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Rest of the day" : {
|
|
||||||
"comment" : "Title for the calendar view option that shows the entire day.",
|
|
||||||
"isCommentAutoGenerated" : true
|
|
||||||
},
|
|
||||||
"Restart" : {
|
"Restart" : {
|
||||||
"extractionState" : "stale",
|
"extractionState" : "stale",
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
|
|
@ -46660,10 +46594,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Symbol" : {
|
|
||||||
"comment" : "A title for a Bluetooth HUD icon style.",
|
|
||||||
"isCommentAutoGenerated" : true
|
|
||||||
},
|
|
||||||
"System" : {
|
"System" : {
|
||||||
"comment" : "A label displayed above the system, load average, and uptime information.",
|
"comment" : "A label displayed above the system, load average, and uptime information.",
|
||||||
"isCommentAutoGenerated" : true,
|
"isCommentAutoGenerated" : true,
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,6 @@ private enum SettingsTab: String, CaseIterable, Identifiable {
|
||||||
case timer
|
case timer
|
||||||
case calendar
|
case calendar
|
||||||
case hudAndOSD
|
case hudAndOSD
|
||||||
case systemControls
|
|
||||||
case battery
|
case battery
|
||||||
case stats
|
case stats
|
||||||
case clipboard
|
case clipboard
|
||||||
|
|
@ -76,7 +75,7 @@ private enum SettingsTab: String, CaseIterable, Identifiable {
|
||||||
switch self {
|
switch self {
|
||||||
case .general, .appearance: return .core
|
case .general, .appearance: return .core
|
||||||
case .media, .liveActivities, .lockScreen, .devices: return .mediaAndDisplay
|
case .media, .liveActivities, .lockScreen, .devices: return .mediaAndDisplay
|
||||||
case .systemControls, .hudAndOSD, .battery: return .system
|
case .hudAndOSD, .battery: return .system
|
||||||
case .timer, .calendar, .notes: return .productivity
|
case .timer, .calendar, .notes: return .productivity
|
||||||
case .clipboard, .screenAssistant, .colorPicker, .shelf,
|
case .clipboard, .screenAssistant, .colorPicker, .shelf,
|
||||||
.downloads, .shortcuts: return .utilities
|
.downloads, .shortcuts: return .utilities
|
||||||
|
|
@ -97,8 +96,7 @@ private enum SettingsTab: String, CaseIterable, Identifiable {
|
||||||
case .extensions: return String(localized: "Extensions")
|
case .extensions: return String(localized: "Extensions")
|
||||||
case .timer: return String(localized: "Timer")
|
case .timer: return String(localized: "Timer")
|
||||||
case .calendar: return String(localized: "Calendar")
|
case .calendar: return String(localized: "Calendar")
|
||||||
case .hudAndOSD: return String(localized: "Display Overlay")
|
case .hudAndOSD: return String(localized: "Controls")
|
||||||
case .systemControls: return String(localized: "Controls")
|
|
||||||
case .battery: return String(localized: "Battery")
|
case .battery: return String(localized: "Battery")
|
||||||
case .stats: return String(localized: "Stats")
|
case .stats: return String(localized: "Stats")
|
||||||
case .clipboard: return String(localized: "Clipboard")
|
case .clipboard: return String(localized: "Clipboard")
|
||||||
|
|
@ -124,8 +122,7 @@ private enum SettingsTab: String, CaseIterable, Identifiable {
|
||||||
case .extensions: return "puzzlepiece.extension"
|
case .extensions: return "puzzlepiece.extension"
|
||||||
case .timer: return "timer"
|
case .timer: return "timer"
|
||||||
case .calendar: return "calendar"
|
case .calendar: return "calendar"
|
||||||
case .hudAndOSD: return "rectangle.inset.filled.on.rectangle"
|
case .hudAndOSD: return "dial.medium.fill"
|
||||||
case .systemControls: return "dial.medium.fill"
|
|
||||||
case .battery: return "battery.100.bolt"
|
case .battery: return "battery.100.bolt"
|
||||||
case .stats: return "chart.xyaxis.line"
|
case .stats: return "chart.xyaxis.line"
|
||||||
case .clipboard: return "clipboard"
|
case .clipboard: return "clipboard"
|
||||||
|
|
@ -151,8 +148,7 @@ private enum SettingsTab: String, CaseIterable, Identifiable {
|
||||||
case .extensions: return Color(red: 0.557, green: 0.353, blue: 0.957)
|
case .extensions: return Color(red: 0.557, green: 0.353, blue: 0.957)
|
||||||
case .timer: return .red
|
case .timer: return .red
|
||||||
case .calendar: return .cyan
|
case .calendar: return .cyan
|
||||||
case .hudAndOSD: return .orange
|
case .hudAndOSD: return .indigo
|
||||||
case .systemControls: return .indigo
|
|
||||||
case .battery: return Color(red: 0.202, green: 0.783, blue: 0.348, opacity: 1.000)
|
case .battery: return Color(red: 0.202, green: 0.783, blue: 0.348, opacity: 1.000)
|
||||||
case .stats: return .teal
|
case .stats: return .teal
|
||||||
case .clipboard: return .mint
|
case .clipboard: return .mint
|
||||||
|
|
@ -495,7 +491,6 @@ struct SettingsView: View {
|
||||||
.lockScreen,
|
.lockScreen,
|
||||||
.devices,
|
.devices,
|
||||||
// System
|
// System
|
||||||
.systemControls,
|
|
||||||
.hudAndOSD,
|
.hudAndOSD,
|
||||||
.battery,
|
.battery,
|
||||||
// Productivity
|
// Productivity
|
||||||
|
|
@ -632,10 +627,10 @@ struct SettingsView: View {
|
||||||
}
|
}
|
||||||
|
|
||||||
VStack(alignment: .leading, spacing: 2) {
|
VStack(alignment: .leading, spacing: 2) {
|
||||||
Text(LocalizedStringKey(suggestion.title))
|
Text(suggestion.title)
|
||||||
.font(.system(size: 13, weight: .semibold))
|
.font(.system(size: 13, weight: .semibold))
|
||||||
.foregroundStyle(Color.primary)
|
.foregroundStyle(Color.primary)
|
||||||
Text(LocalizedStringKey(suggestion.tab.title))
|
Text(suggestion.tab.title)
|
||||||
.font(.system(size: 11))
|
.font(.system(size: 11))
|
||||||
.foregroundStyle(Color.secondary)
|
.foregroundStyle(Color.secondary)
|
||||||
}
|
}
|
||||||
|
|
@ -750,12 +745,6 @@ struct SettingsView: View {
|
||||||
SettingsSearchEntry(tab: .battery, title: "Full battery style", keywords: ["battery", "style", "compact", "standard"], highlightID: SettingsTab.battery.highlightID(for: "Full battery style")),
|
SettingsSearchEntry(tab: .battery, title: "Full battery style", keywords: ["battery", "style", "compact", "standard"], highlightID: SettingsTab.battery.highlightID(for: "Full battery style")),
|
||||||
SettingsSearchEntry(tab: .battery, title: "Full charge threshold", keywords: ["battery", "threshold", "full"], highlightID: SettingsTab.battery.highlightID(for: "Full charge threshold")),
|
SettingsSearchEntry(tab: .battery, title: "Full charge threshold", keywords: ["battery", "threshold", "full"], highlightID: SettingsTab.battery.highlightID(for: "Full charge threshold")),
|
||||||
|
|
||||||
// System Controls
|
|
||||||
SettingsSearchEntry(tab: .systemControls, title: "Step size", keywords: ["brightness", "volume", "step",], highlightID: SettingsTab.systemControls.highlightID(for: "Step size")),
|
|
||||||
SettingsSearchEntry(tab: .systemControls, title: "Third-party DDC app integration", keywords: ["ddc", "third party", "external", "display", "betterdisplay", "lunar"], highlightID: SettingsTab.systemControls.highlightID(for: "Third-party DDC app integration")),
|
|
||||||
SettingsSearchEntry(tab: .systemControls, title: "Third-party DDC provider", keywords: ["provider", "betterdisplay", "lunar", "integration", "refresh detection"], highlightID: SettingsTab.systemControls.highlightID(for: "Third-party DDC provider")),
|
|
||||||
SettingsSearchEntry(tab: .systemControls, title: "Enable external volume control listener", keywords: ["external volume", "ddc volume", "betterdisplay volume", "lunar volume", "disable native volume"], highlightID: SettingsTab.systemControls.highlightID(for: "Enable external volume control listener")),
|
|
||||||
|
|
||||||
// HUDs
|
// HUDs
|
||||||
SettingsSearchEntry(tab: .devices, title: "Show Bluetooth device connections", keywords: ["bluetooth", "hud"], highlightID: SettingsTab.devices.highlightID(for: "Show Bluetooth device connections")),
|
SettingsSearchEntry(tab: .devices, title: "Show Bluetooth device connections", keywords: ["bluetooth", "hud"], highlightID: SettingsTab.devices.highlightID(for: "Show Bluetooth device connections")),
|
||||||
SettingsSearchEntry(tab: .devices, title: "Use circular battery indicator", keywords: ["battery", "circular"], highlightID: SettingsTab.devices.highlightID(for: "Use circular battery indicator")),
|
SettingsSearchEntry(tab: .devices, title: "Use circular battery indicator", keywords: ["battery", "circular"], highlightID: SettingsTab.devices.highlightID(for: "Use circular battery indicator")),
|
||||||
|
|
@ -778,6 +767,13 @@ struct SettingsView: View {
|
||||||
SettingsSearchEntry(tab: .hudAndOSD, title: "Keyboard Backlight OSD", keywords: ["keyboard", "backlight", "osd"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Keyboard Backlight OSD")),
|
SettingsSearchEntry(tab: .hudAndOSD, title: "Keyboard Backlight OSD", keywords: ["keyboard", "backlight", "osd"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Keyboard Backlight OSD")),
|
||||||
SettingsSearchEntry(tab: .hudAndOSD, title: "Material", keywords: ["material", "frosted", "liquid", "glass", "solid", "osd"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Material")),
|
SettingsSearchEntry(tab: .hudAndOSD, title: "Material", keywords: ["material", "frosted", "liquid", "glass", "solid", "osd"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Material")),
|
||||||
SettingsSearchEntry(tab: .hudAndOSD, title: "Icon & Progress Color", keywords: ["color", "icon", "white", "black", "gray", "osd"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Icon & Progress Color")),
|
SettingsSearchEntry(tab: .hudAndOSD, title: "Icon & Progress Color", keywords: ["color", "icon", "white", "black", "gray", "osd"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Icon & Progress Color")),
|
||||||
|
SettingsSearchEntry(tab: .hudAndOSD, title: "Volume step", keywords: ["volume", "step", "percent"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Volume step")),
|
||||||
|
SettingsSearchEntry(tab: .hudAndOSD, title: "Volume fine step", keywords: ["volume", "fine", "step", "percent"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Volume fine step")),
|
||||||
|
SettingsSearchEntry(tab: .hudAndOSD, title: "Brightness step", keywords: ["brightness", "step", "percent"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Brightness step")),
|
||||||
|
SettingsSearchEntry(tab: .hudAndOSD, title: "Brightness fine step", keywords: ["brightness", "fine", "step", "percent"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Brightness fine step")),
|
||||||
|
SettingsSearchEntry(tab: .hudAndOSD, title: "Third-party DDC app integration", keywords: ["ddc", "third party", "external", "display", "betterdisplay", "lunar"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Third-party DDC app integration")),
|
||||||
|
SettingsSearchEntry(tab: .hudAndOSD, title: "Third-party DDC provider", keywords: ["provider", "betterdisplay", "lunar", "integration", "refresh detection"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Third-party DDC provider")),
|
||||||
|
SettingsSearchEntry(tab: .hudAndOSD, title: "Enable external volume control listener", keywords: ["external volume", "ddc volume", "betterdisplay volume", "lunar volume", "disable native volume"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Enable external volume control listener")),
|
||||||
|
|
||||||
// Media
|
// Media
|
||||||
SettingsSearchEntry(tab: .media, title: "Music Source", keywords: ["media source", "controller"], highlightID: SettingsTab.media.highlightID(for: "Music Source")),
|
SettingsSearchEntry(tab: .media, title: "Music Source", keywords: ["media source", "controller"], highlightID: SettingsTab.media.highlightID(for: "Music Source")),
|
||||||
|
|
@ -984,10 +980,6 @@ struct SettingsView: View {
|
||||||
SettingsForm(tab: .hudAndOSD) {
|
SettingsForm(tab: .hudAndOSD) {
|
||||||
HUDAndOSDSettingsView()
|
HUDAndOSDSettingsView()
|
||||||
}
|
}
|
||||||
case .systemControls:
|
|
||||||
SettingsForm(tab: .systemControls) {
|
|
||||||
SystemControlsView()
|
|
||||||
}
|
|
||||||
case .battery:
|
case .battery:
|
||||||
SettingsForm(tab: .battery) {
|
SettingsForm(tab: .battery) {
|
||||||
Charge()
|
Charge()
|
||||||
|
|
@ -2204,22 +2196,25 @@ private struct HUDAndOSDSettingsView: View {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Third-party display integrations (shared across all HUD variants)
|
||||||
|
ExternalDisplayIntegrationsSection()
|
||||||
}
|
}
|
||||||
|
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top)
|
||||||
|
.background(paneBackgroundColor)
|
||||||
|
.navigationTitle("Controls")
|
||||||
.onAppear {
|
.onAppear {
|
||||||
if #unavailable(macOS 26.0), verticalHUDMaterial == .liquid {
|
if #unavailable(macOS 26.0), verticalHUDMaterial == .liquid {
|
||||||
verticalHUDMaterial = .frosted
|
verticalHUDMaterial = .frosted
|
||||||
verticalHUDLiquidGlassCustomizationMode = .standard
|
verticalHUDLiquidGlassCustomizationMode = .standard
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top)
|
|
||||||
.navigationTitle("Display Overlay")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - External Display Integrations Settings Section
|
// MARK: - External Display Integrations Settings Section
|
||||||
|
|
||||||
private struct SystemControlsView: View {
|
private struct ExternalDisplayIntegrationsSection: View {
|
||||||
@Default(.enableThirdPartyDDCIntegration) var enableThirdPartyDDCIntegration
|
@Default(.enableThirdPartyDDCIntegration) var enableThirdPartyDDCIntegration
|
||||||
@Default(.thirdPartyDDCProvider) var thirdPartyDDCProvider
|
@Default(.thirdPartyDDCProvider) var thirdPartyDDCProvider
|
||||||
@Default(.enableExternalVolumeControlListener) var enableExternalVolumeControlListener
|
@Default(.enableExternalVolumeControlListener) var enableExternalVolumeControlListener
|
||||||
|
|
@ -2239,12 +2234,12 @@ private struct SystemControlsView: View {
|
||||||
case .betterDisplay:
|
case .betterDisplay:
|
||||||
if betterDisplayManager.isRunning { return "Running" }
|
if betterDisplayManager.isRunning { return "Running" }
|
||||||
if betterDisplayManager.isDetected { return "Not running" }
|
if betterDisplayManager.isDetected { return "Not running" }
|
||||||
return String(localized: "Not detected")
|
return "Not detected"
|
||||||
case .lunar:
|
case .lunar:
|
||||||
if lunarManager.isConnected { return "Connected" }
|
if lunarManager.isConnected { return "Connected" }
|
||||||
if lunarManager.isRunning { return "Running" }
|
if lunarManager.isRunning { return "Running" }
|
||||||
if lunarManager.isDetected { return "Not running" }
|
if lunarManager.isDetected { return "Not running" }
|
||||||
return String(localized: "Not detected")
|
return "Not detected"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2266,23 +2261,23 @@ private struct SystemControlsView: View {
|
||||||
switch thirdPartyDDCProvider {
|
switch thirdPartyDDCProvider {
|
||||||
case .betterDisplay:
|
case .betterDisplay:
|
||||||
if !betterDisplayManager.isDetected {
|
if !betterDisplayManager.isDetected {
|
||||||
return String(localized: "Install [BetterDisplay](https://betterdisplay.pro) to control external display brightness (and optional volume) through Atoll's HUD.")
|
return "Install [BetterDisplay](https://betterdisplay.pro) to control external display brightness (and optional volume) through Atoll's HUD."
|
||||||
}
|
}
|
||||||
if !betterDisplayManager.isRunning {
|
if !betterDisplayManager.isRunning {
|
||||||
return String(localized: "BetterDisplay is installed but not currently running. Launch BetterDisplay to enable integration.")
|
return "BetterDisplay is installed but not currently running. Launch BetterDisplay to enable integration."
|
||||||
}
|
}
|
||||||
return String(localized: "BetterDisplay OSD events will be routed through Atoll's active HUD style. Brightness is always routed; volume is routed when external volume control listener is enabled below. Make sure BetterDisplay's OSD integration is enabled in Settings › Application › Integration.")
|
return "BetterDisplay OSD events will be routed through Atoll's active HUD style. Brightness is always routed; volume is routed when external volume control listener is enabled below. Make sure BetterDisplay's OSD integration is enabled in Settings › Application › Integration."
|
||||||
case .lunar:
|
case .lunar:
|
||||||
if !lunarManager.isDetected {
|
if !lunarManager.isDetected {
|
||||||
return String(localized: "Install [Lunar](https://lunar.fyi) to control external display brightness, contrast, and optional volume through Atoll's HUD via DDC.")
|
return "Install [Lunar](https://lunar.fyi) to control external display brightness, contrast, and optional volume through Atoll's HUD via DDC."
|
||||||
}
|
}
|
||||||
if !lunarManager.isRunning {
|
if !lunarManager.isRunning {
|
||||||
return String(localized: "Lunar is installed but not currently running. Launch Lunar to enable integration.")
|
return "Lunar is installed but not currently running. Launch Lunar to enable integration."
|
||||||
}
|
}
|
||||||
if lunarManager.isConnected {
|
if lunarManager.isConnected {
|
||||||
return String(localized: "Connected to Lunar's DDC socket. Brightness and contrast adjustments are shown through Atoll's HUD; volume follows when external volume control listener is enabled below.")
|
return "Connected to Lunar's DDC socket. Brightness and contrast adjustments are shown through Atoll's HUD; volume follows when external volume control listener is enabled below."
|
||||||
}
|
}
|
||||||
return String(localized: "Lunar is running but the socket connection is not yet established. It will connect automatically.")
|
return "Lunar is running but the socket connection is not yet established. It will connect automatically."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2327,6 +2322,7 @@ private struct SystemControlsView: View {
|
||||||
.font(.caption)
|
.font(.caption)
|
||||||
.foregroundStyle(.secondary)
|
.foregroundStyle(.secondary)
|
||||||
}
|
}
|
||||||
|
|
||||||
Stepper(value: $brightnessStepPercent, in: 1...25) {
|
Stepper(value: $brightnessStepPercent, in: 1...25) {
|
||||||
HStack {
|
HStack {
|
||||||
Text("Brightness step")
|
Text("Brightness step")
|
||||||
|
|
@ -2367,9 +2363,6 @@ private struct SystemControlsView: View {
|
||||||
Section {
|
Section {
|
||||||
Toggle("Enable third-party DDC app integration", isOn: $enableThirdPartyDDCIntegration)
|
Toggle("Enable third-party DDC app integration", isOn: $enableThirdPartyDDCIntegration)
|
||||||
.settingsHighlight(id: highlightID("Third-party DDC app integration"))
|
.settingsHighlight(id: highlightID("Third-party DDC app integration"))
|
||||||
.onChange(of: enableThirdPartyDDCIntegration) { _, _ in
|
|
||||||
enableExternalVolumeControlListener = false
|
|
||||||
}
|
|
||||||
|
|
||||||
if enableThirdPartyDDCIntegration {
|
if enableThirdPartyDDCIntegration {
|
||||||
Picker("Provider", selection: $thirdPartyDDCProvider) {
|
Picker("Provider", selection: $thirdPartyDDCProvider) {
|
||||||
|
|
@ -2430,8 +2423,6 @@ private struct SystemControlsView: View {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top)
|
|
||||||
.navigationTitle("Controls")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2587,7 +2578,6 @@ struct HUD: View {
|
||||||
@Default(.enableBrightnessHUD) var enableBrightnessHUD
|
@Default(.enableBrightnessHUD) var enableBrightnessHUD
|
||||||
@Default(.enableKeyboardBacklightHUD) var enableKeyboardBacklightHUD
|
@Default(.enableKeyboardBacklightHUD) var enableKeyboardBacklightHUD
|
||||||
@Default(.enableThirdPartyDDCIntegration) var enableThirdPartyDDCIntegration
|
@Default(.enableThirdPartyDDCIntegration) var enableThirdPartyDDCIntegration
|
||||||
@Default(.enableExternalVolumeControlListener) var enableExternalVolumeControlListener
|
|
||||||
@Default(.systemHUDSensitivity) var systemHUDSensitivity
|
@Default(.systemHUDSensitivity) var systemHUDSensitivity
|
||||||
@ObservedObject var coordinator = DynamicIslandViewCoordinator.shared
|
@ObservedObject var coordinator = DynamicIslandViewCoordinator.shared
|
||||||
@ObservedObject private var accessibilityPermission = AccessibilityPermissionStore.shared
|
@ObservedObject private var accessibilityPermission = AccessibilityPermissionStore.shared
|
||||||
|
|
@ -2725,6 +2715,7 @@ struct HUD: View {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.navigationTitle("Controls")
|
||||||
.onAppear {
|
.onAppear {
|
||||||
accessibilityPermission.refreshStatus()
|
accessibilityPermission.refreshStatus()
|
||||||
}
|
}
|
||||||
|
|
@ -3125,14 +3116,14 @@ struct CalendarSettings: View {
|
||||||
|
|
||||||
var title: String {
|
var title: String {
|
||||||
switch self {
|
switch self {
|
||||||
case .mins15: return String(localized: "15 mins")
|
case .mins15: return "15 mins"
|
||||||
case .mins30: return String(localized: "30 mins")
|
case .mins30: return "30 mins"
|
||||||
case .hour1: return String(localized: "1 hour")
|
case .hour1: return "1 hour"
|
||||||
case .hours3: return String(localized: "3 hours")
|
case .hours3: return "3 hours"
|
||||||
case .hours6: return String(localized: "6 hours")
|
case .hours6: return "6 hours"
|
||||||
case .hours12: return String(localized: "12 hours")
|
case .hours12: return "12 hours"
|
||||||
case .restOfDay: return String(localized: "Rest of the day")
|
case .restOfDay: return "Rest of the day"
|
||||||
case .allTime: return String(localized: "All time")
|
case .allTime: return "All time"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -3623,9 +3614,9 @@ private extension DevicesSettingsView {
|
||||||
var title: String {
|
var title: String {
|
||||||
switch self {
|
switch self {
|
||||||
case .symbol:
|
case .symbol:
|
||||||
return String(localized: "Symbol")
|
return "Symbol"
|
||||||
case .threeD:
|
case .threeD:
|
||||||
return String(localized: "3D")
|
return "3D"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -4961,14 +4952,14 @@ struct LockScreenSettings: View {
|
||||||
|
|
||||||
var title: String {
|
var title: String {
|
||||||
switch self {
|
switch self {
|
||||||
case .mins15: return String(localized: "15 mins")
|
case .mins15: return "15 mins"
|
||||||
case .mins30: return String(localized: "30 mins")
|
case .mins30: return "30 mins"
|
||||||
case .hour1: return String(localized: "1 hour")
|
case .hour1: return "1 hour"
|
||||||
case .hours3: return String(localized: "3 hours")
|
case .hours3: return "3 hours"
|
||||||
case .hours6: return String(localized: "6 hours")
|
case .hours6: return "6 hours"
|
||||||
case .hours12: return String(localized: "12 hours")
|
case .hours12: return "12 hours"
|
||||||
case .restOfDay: return String(localized: "Rest of the day")
|
case .restOfDay: return "Rest of the day"
|
||||||
case .allTime: return String(localized: "All time")
|
case .allTime: return "All time"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -4982,9 +4973,9 @@ struct LockScreenSettings: View {
|
||||||
|
|
||||||
var title: String {
|
var title: String {
|
||||||
switch self {
|
switch self {
|
||||||
case .leading: return String(localized: "Left")
|
case .leading: return "Left"
|
||||||
case .center: return String(localized: "Center")
|
case .center: return "Center"
|
||||||
case .trailing: return String(localized: "Right")
|
case .trailing: return "Right"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -7057,11 +7048,11 @@ struct StatsSettings: View {
|
||||||
private var formattedUpdateInterval: String {
|
private var formattedUpdateInterval: String {
|
||||||
let seconds = Int(statsUpdateInterval.rounded())
|
let seconds = Int(statsUpdateInterval.rounded())
|
||||||
if seconds >= 60 {
|
if seconds >= 60 {
|
||||||
return String(localized: "60 s (1 min)")
|
return "60 s (1 min)"
|
||||||
} else if seconds == 1 {
|
} else if seconds == 1 {
|
||||||
return String(localized: "1 s")
|
return "1 s"
|
||||||
} else {
|
} else {
|
||||||
return String(localized: "\(seconds) s")
|
return "\(seconds) s"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -7453,16 +7444,16 @@ struct ClipboardSettings: View {
|
||||||
let interval = Date().timeIntervalSince(date)
|
let interval = Date().timeIntervalSince(date)
|
||||||
|
|
||||||
if interval < 60 {
|
if interval < 60 {
|
||||||
return String(localized: "Just now")
|
return "Just now"
|
||||||
} else if interval < 3600 {
|
} else if interval < 3600 {
|
||||||
let minutes = Int(interval / 60)
|
let minutes = Int(interval / 60)
|
||||||
return String(localized: "\(minutes)m ago")
|
return "\(minutes)m ago"
|
||||||
} else if interval < 86400 {
|
} else if interval < 86400 {
|
||||||
let hours = Int(interval / 3600)
|
let hours = Int(interval / 3600)
|
||||||
return String(localized: "\(hours)h ago")
|
return "\(hours)h ago"
|
||||||
} else {
|
} else {
|
||||||
let days = Int(interval / 86400)
|
let days = Int(interval / 86400)
|
||||||
return String(localized: "\(days)d ago")
|
return "\(days)d ago"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -7631,16 +7622,16 @@ struct ScreenAssistantSettings: View {
|
||||||
let interval = Date().timeIntervalSince(date)
|
let interval = Date().timeIntervalSince(date)
|
||||||
|
|
||||||
if interval < 60 {
|
if interval < 60 {
|
||||||
return String(localized: "Just now")
|
return "Just now"
|
||||||
} else if interval < 3600 {
|
} else if interval < 3600 {
|
||||||
let minutes = Int(interval / 60)
|
let minutes = Int(interval / 60)
|
||||||
return String(localized: "\(minutes)m ago")
|
return "\(minutes)m ago"
|
||||||
} else if interval < 86400 {
|
} else if interval < 86400 {
|
||||||
let hours = Int(interval / 3600)
|
let hours = Int(interval / 3600)
|
||||||
return String(localized: "\(hours)h ago")
|
return "\(hours)h ago"
|
||||||
} else {
|
} else {
|
||||||
let days = Int(interval / 86400)
|
let days = Int(interval / 86400)
|
||||||
return String(localized: "\(days)d ago")
|
return "\(days)d ago"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -7957,6 +7948,7 @@ struct CustomOSDSettings: View {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.navigationTitle("Custom OSD")
|
||||||
.onAppear {
|
.onAppear {
|
||||||
accessibilityPermission.refreshStatus()
|
accessibilityPermission.refreshStatus()
|
||||||
if #unavailable(macOS 26.0), osdMaterial == .liquid {
|
if #unavailable(macOS 26.0), osdMaterial == .liquid {
|
||||||
|
|
@ -8004,21 +7996,21 @@ struct SettingsPermissionCallout: View {
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
VStack(alignment: .leading, spacing: 8) {
|
VStack(alignment: .leading, spacing: 8) {
|
||||||
Label(LocalizedStringKey(title), systemImage: icon)
|
Label(title, systemImage: icon)
|
||||||
.font(.subheadline.weight(.semibold))
|
.font(.subheadline.weight(.semibold))
|
||||||
.foregroundStyle(iconColor)
|
.foregroundStyle(iconColor)
|
||||||
|
|
||||||
Text(LocalizedStringKey(message))
|
Text(message)
|
||||||
.font(.caption)
|
.font(.caption)
|
||||||
.foregroundStyle(.secondary)
|
.foregroundStyle(.secondary)
|
||||||
|
|
||||||
HStack(spacing: 8) {
|
HStack(spacing: 8) {
|
||||||
Button(LocalizedStringKey(requestButtonTitle)) {
|
Button(requestButtonTitle) {
|
||||||
requestAction()
|
requestAction()
|
||||||
}
|
}
|
||||||
.buttonStyle(.borderedProminent)
|
.buttonStyle(.borderedProminent)
|
||||||
|
|
||||||
Button(LocalizedStringKey(openSettingsButtonTitle)) {
|
Button(openSettingsButtonTitle) {
|
||||||
openSettingsAction()
|
openSettingsAction()
|
||||||
}
|
}
|
||||||
.buttonStyle(.bordered)
|
.buttonStyle(.bordered)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue