|
|
@@ -8,6 +8,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
|
|
|
private let logger = AirAcceptLogger()
|
|
|
private lazy var watcher = AirPlayPromptWatcher(configStore: configStore, logger: logger)
|
|
|
private var statusItem: NSStatusItem?
|
|
|
+ private let pollIntervalOptions = [2_000, 3_000, 4_000, 5_000]
|
|
|
|
|
|
func applicationDidFinishLaunching(_ notification: Notification) {
|
|
|
NSApp.setActivationPolicy(.accessory)
|
|
|
@@ -73,6 +74,10 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
|
|
|
watcherItem.target = self
|
|
|
menu.addItem(watcherItem)
|
|
|
|
|
|
+ let intervalMenuItem = NSMenuItem(title: "Poll Interval", action: nil, keyEquivalent: "")
|
|
|
+ intervalMenuItem.submenu = makePollIntervalMenu()
|
|
|
+ menu.addItem(intervalMenuItem)
|
|
|
+
|
|
|
let launchItem = NSMenuItem(
|
|
|
title: "Launch at Login",
|
|
|
action: #selector(toggleLaunchAtLogin(_:)),
|
|
|
@@ -117,15 +122,54 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
|
|
|
return menu
|
|
|
}
|
|
|
|
|
|
+ private func makePollIntervalMenu() -> NSMenu {
|
|
|
+ let menu = NSMenu()
|
|
|
+ let currentInterval = currentConfig().pollIntervalMilliseconds
|
|
|
+
|
|
|
+ for interval in pollIntervalOptions {
|
|
|
+ let seconds = interval / 1_000
|
|
|
+ let item = NSMenuItem(
|
|
|
+ title: "\(seconds) seconds",
|
|
|
+ action: #selector(setPollInterval(_:)),
|
|
|
+ keyEquivalent: ""
|
|
|
+ )
|
|
|
+ item.target = self
|
|
|
+ item.representedObject = interval
|
|
|
+ item.state = currentInterval == interval ? .on : .off
|
|
|
+ menu.addItem(item)
|
|
|
+ }
|
|
|
+
|
|
|
+ return menu
|
|
|
+ }
|
|
|
+
|
|
|
private func rebuildMenu() {
|
|
|
statusItem?.menu = makeMenu()
|
|
|
}
|
|
|
|
|
|
+ private func currentConfig() -> AirAcceptConfig {
|
|
|
+ (try? configStore.loadOrCreate()) ?? AirAcceptConfig()
|
|
|
+ }
|
|
|
+
|
|
|
@objc private func toggleWatcher(_ sender: NSMenuItem) {
|
|
|
watcher.setEnabled(!watcher.isEnabled)
|
|
|
rebuildMenu()
|
|
|
}
|
|
|
|
|
|
+ @objc private func setPollInterval(_ sender: NSMenuItem) {
|
|
|
+ guard let interval = sender.representedObject as? Int else {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ do {
|
|
|
+ try configStore.save(AirAcceptConfig(pollIntervalMilliseconds: interval))
|
|
|
+ watcher.reloadConfiguration()
|
|
|
+ logger.info("poll interval set to \(Double(interval) / 1_000.0)s")
|
|
|
+ } catch {
|
|
|
+ logger.error("failed to set poll interval: \(error.localizedDescription)")
|
|
|
+ }
|
|
|
+ rebuildMenu()
|
|
|
+ }
|
|
|
+
|
|
|
@objc private func toggleLaunchAtLogin(_ sender: NSMenuItem) {
|
|
|
do {
|
|
|
try LoginItemManager.setEnabled(!LoginItemManager.isEnabled)
|