aboutsummaryrefslogtreecommitdiff
path: root/menubar/main.swift
diff options
context:
space:
mode:
Diffstat (limited to 'menubar/main.swift')
-rw-r--r--menubar/main.swift71
1 files changed, 47 insertions, 24 deletions
diff --git a/menubar/main.swift b/menubar/main.swift
index c1891ab..183c5db 100644
--- a/menubar/main.swift
+++ b/menubar/main.swift
@@ -32,8 +32,7 @@ final class Menubar: NSObject, NSApplicationDelegate, NSMenuDelegate {
private let item = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
private let menu = NSMenu()
private var panel: PanelController!
- private var visibility = PanelVisibility(
- mode: PanelMode(rawValue: UserDefaults.standard.string(forKey: "panelMode") ?? "") ?? .auto)
+ private var visibility = Menubar.loadVisibility()
private var settings = Settings()
private var settingsModified: Date?
private var hotkey: Hotkey?
@@ -43,6 +42,22 @@ final class Menubar: NSObject, NSApplicationDelegate, NSMenuDelegate {
private var prefersFull = UserDefaults.standard.bool(forKey: "panelFull")
private var rows: [Row] = []
+ /// The panel settings; the first run after the on/off split migrates the
+ /// old three-way mode.
+ private static func loadVisibility() -> PanelVisibility {
+ let defaults = UserDefaults.standard
+ guard defaults.object(forKey: "panelEnabled") != nil else {
+ let migrated = PanelVisibility.migrated(fromMode: defaults.string(forKey: "panelMode") ?? "auto")
+ defaults.set(migrated.enabled, forKey: "panelEnabled")
+ defaults.set(migrated.policy.rawValue, forKey: "panelPolicy")
+ defaults.removeObject(forKey: "panelMode")
+ return migrated
+ }
+ return PanelVisibility(
+ enabled: defaults.bool(forKey: "panelEnabled"),
+ policy: PanelPolicy(rawValue: defaults.string(forKey: "panelPolicy") ?? "") ?? .whenWaiting)
+ }
+
func applicationDidFinishLaunching(_: Notification) {
menu.delegate = self
item.menu = menu
@@ -96,34 +111,42 @@ final class Menubar: NSObject, NSApplicationDelegate, NSMenuDelegate {
item.button?.toolTip = tipText
item.button?.setAccessibilityLabel("dingger, " + tipText)
- visibility.update(waiting: Set(rows.filter(\.waiting).map(\.paneId)))
+ visibility.anyWaiting = rows.contains(where: \.waiting)
applyPanel()
}
private var panelContent: PanelContent {
PanelContent(rows: rows,
- full: panelShowsFull(mode: visibility.mode, prefersFull: prefersFull),
- canToggle: visibility.mode == .on)
+ full: panelShowsFull(policy: visibility.policy, prefersFull: prefersFull),
+ canToggle: visibility.policy == .always)
}
private func applyPanel() {
- if visibility.visible {
+ if visibility.visible(at: Date()) {
if panel.render(panelContent) {
let content = panelContent
log("panel: render \(content.rows.filter(\.waiting).count) waiting, \(content.full ? "full" : "compact")")
}
if !panel.isVisible {
panel.show()
- log("panel: shown (\(visibility.mode.rawValue), forced: \(String(describing: visibility.forced)))")
+ log("panel: shown (\(panelState))")
}
} else if panel.isVisible {
panel.hide()
- log("panel: hidden (\(visibility.mode.rawValue), forced: \(String(describing: visibility.forced)))")
+ log("panel: hidden (\(panelState))")
}
}
+ private var panelState: String {
+ "\(visibility.enabled ? "on" : "off"), \(visibility.policy.rawValue), "
+ + (visibility.anyWaiting ? "agents waiting" : "nothing waiting")
+ }
+
+ /// The shortcut and the menu item: turn the panel on or off, persistently.
@objc private func togglePanel() {
- visibility.toggle()
+ visibility.toggle(at: Date())
+ UserDefaults.standard.set(visibility.enabled, forKey: "panelEnabled")
+ log("panel: turned \(visibility.enabled ? "on" : "off")")
applyPanel()
}
@@ -142,10 +165,10 @@ final class Menubar: NSObject, NSApplicationDelegate, NSMenuDelegate {
}
}
- @objc private func selectMode(_ sender: NSMenuItem) {
- guard let raw = sender.representedObject as? String, let mode = PanelMode(rawValue: raw) else { return }
- visibility.setMode(mode)
- UserDefaults.standard.set(mode.rawValue, forKey: "panelMode")
+ @objc private func selectPolicy(_ sender: NSMenuItem) {
+ guard let raw = sender.representedObject as? String, let policy = PanelPolicy(rawValue: raw) else { return }
+ visibility.policy = policy
+ UserDefaults.standard.set(policy.rawValue, forKey: "panelPolicy")
applyPanel()
}
@@ -187,9 +210,9 @@ final class Menubar: NSObject, NSApplicationDelegate, NSMenuDelegate {
}
menu.addItem(.separator())
- let toggle = NSMenuItem(title: visibility.visible ? "Hide Panel" : "Show Panel",
- action: #selector(togglePanel), keyEquivalent: "")
+ let toggle = NSMenuItem(title: "Show Panel", action: #selector(togglePanel), keyEquivalent: "")
toggle.target = self
+ toggle.state = visibility.enabled ? .on : .off
if let hotkey, hotkeyRegistered {
toggle.keyEquivalent = hotkey.key.count == 1 ? hotkey.key : ""
toggle.keyEquivalentModifierMask = hotkey.modifierFlags
@@ -206,17 +229,17 @@ final class Menubar: NSObject, NSApplicationDelegate, NSMenuDelegate {
}
menu.addItem(jumpItem)
- let modeMenu = NSMenu()
- for mode in PanelMode.allCases {
- let option = NSMenuItem(title: mode.label, action: #selector(selectMode(_:)), keyEquivalent: "")
+ let policyMenu = NSMenu()
+ for policy in PanelPolicy.allCases {
+ let option = NSMenuItem(title: policy.label, action: #selector(selectPolicy(_:)), keyEquivalent: "")
option.target = self
- option.representedObject = mode.rawValue
- option.state = visibility.mode == mode ? .on : .off
- modeMenu.addItem(option)
+ option.representedObject = policy.rawValue
+ option.state = visibility.policy == policy ? .on : .off
+ policyMenu.addItem(option)
}
- let modeItem = NSMenuItem(title: "Show Panel Automatically", action: nil, keyEquivalent: "")
- modeItem.submenu = modeMenu
- menu.addItem(modeItem)
+ let policyItem = NSMenuItem(title: "Panel Shows", action: nil, keyEquivalent: "")
+ policyItem.submenu = policyMenu
+ menu.addItem(policyItem)
for (shortcut, registered, spec) in [(hotkey, hotkeyRegistered, settings.hotkey),
(jumpHotkey, jumpHotkeyRegistered, settings.jumpHotkey)] {