diff options
Diffstat (limited to 'menubar/main.swift')
| -rw-r--r-- | menubar/main.swift | 71 |
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)] { |
