diff --git a/Timer/AppDelegate.swift b/Timer/AppDelegate.swift index 9cb5a4d..152cb29 100644 --- a/Timer/AppDelegate.swift +++ b/Timer/AppDelegate.swift @@ -20,6 +20,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele func applicationDidFinishLaunching(_ aNotification: Notification) { let controller = MVTimerController() + controller.isMainController = true controllers.append(controller) self.addBadgeToDock(controller: controller) @@ -81,6 +82,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele @objc func newDocument(_ sender: AnyObject?) { let controller = MVTimerController(closeToWindow: NSApplication.shared.keyWindow) controller.window?.level = self.windowLevel() + controller.isMainController = controllers.isEmpty controllers.append(controller) } @@ -109,6 +111,9 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele } private func registerDefaults() { - UserDefaults.standard.register(defaults: [MVUserDefaultsKeys.staysOnTop: false]) + UserDefaults.standard.register(defaults: [ + MVUserDefaultsKeys.staysOnTop: false, + MVUserDefaultsKeys.hideDigitalTimer: false + ]) } } diff --git a/Timer/MVClockView.swift b/Timer/MVClockView.swift index 1f27d8e..691767b 100644 --- a/Timer/MVClockView.swift +++ b/Timer/MVClockView.swift @@ -5,7 +5,6 @@ class MVClockView: NSControl { private var pauseIconImageView: NSImageView! private var progressView: MVClockProgressView! private var arrowView: MVClockArrowView! - private var timerTimeLabel: NSTextView! private var timerTimeLabelFontSize: CGFloat = 15 private var minutesLabel: NSTextView! private var minutesLabelSuffixWidth: CGFloat = 0.0 @@ -47,6 +46,7 @@ class MVClockView: NSControl { self.layoutPauseViews() } } + var timerTimeLabel: NSTextView! var seconds: CGFloat = 0.0 { didSet { diff --git a/Timer/MVMainView.swift b/Timer/MVMainView.swift index 1f59288..095199f 100644 --- a/Timer/MVMainView.swift +++ b/Timer/MVMainView.swift @@ -16,6 +16,7 @@ class MVMainView: NSView { private var contextMenu: NSMenu? public var menuItem: NSMenuItem? private var soundMenuItems: [NSMenuItem] = [] + var hideDigitalTimerMenuItem: NSMenuItem? // swiftlint:disable unused_setter_value override var menu: NSMenu? { @@ -52,9 +53,27 @@ class MVMainView: NSView { submenu.addItem(soundItem) } self.soundMenuItems.first?.state = .on + + let menuItemViewConfig = NSMenuItem( + title: "View", + action: nil, + keyEquivalent: "" + ) + let submenuViewConfig = NSMenu() + submenuViewConfig.autoenablesItems = false + + hideDigitalTimerMenuItem = NSMenuItem( + title: "Hide digital timer", + action: #selector(self.toggleViewItemState), + keyEquivalent: "" + ) + submenuViewConfig.addItem(hideDigitalTimerMenuItem!) + self.contextMenu?.addItem(menuItem!) self.contextMenu?.addItem(menuItemSoundChoice) self.contextMenu?.setSubmenu(submenu, for: menuItemSoundChoice) + self.contextMenu?.addItem(menuItemViewConfig) + self.contextMenu?.setSubmenu(submenuViewConfig, for: menuItemViewConfig) let notificationCenter = NotificationCenter.default @@ -102,6 +121,17 @@ class MVMainView: NSView { } } + @objc func toggleViewItemState(_ sender: NSMenuItem) { + var value = sender.state == .on ? true : false + value.toggle() + switch sender { + case hideDigitalTimerMenuItem: + self.controller?.setViewState(value, forKey: MVUserDefaultsKeys.hideDigitalTimer) + default: + break + } + } + deinit { NotificationCenter.default.removeObserver(self) } diff --git a/Timer/MVTimerController.swift b/Timer/MVTimerController.swift index ecebb3a..fb36ad4 100644 --- a/Timer/MVTimerController.swift +++ b/Timer/MVTimerController.swift @@ -8,6 +8,8 @@ class MVTimerController: NSWindowController { private var audioPlayer: AVAudioPlayer? // player must be kept in memory private var soundURL = Bundle.main.url(forResource: "alert-sound", withExtension: "caf") + var isMainController: Bool = false + convenience init() { let mainView = MVMainView(frame: NSRect.zero) @@ -25,6 +27,8 @@ class MVTimerController: NSWindowController { self.windowFrameAutosaveName = "TimerWindowAutosaveFrame" window.makeKeyAndOrderFront(self) + + loadViewStateFromUserDefaults() } convenience init(closeToWindow: NSWindow?) { @@ -105,4 +109,32 @@ class MVTimerController: NSWindowController { self.soundURL = nil } } + + func setViewState(_ value: Bool, forKey viewConfigKey: String) { + setViewState(value, forKey: viewConfigKey, save: isMainController) + } + + private func setViewState(_ value: Bool, forKey viewConfigKey: String, save: Bool) { + let state: NSControl.StateValue = value ? .on : .off + switch viewConfigKey { + case MVUserDefaultsKeys.hideDigitalTimer: + mainView.hideDigitalTimerMenuItem?.state = state + clockView.timerTimeLabel.isHidden = value + default: + break + } + if save { + UserDefaults.standard.set(value, forKey: viewConfigKey) + } + } + + private func loadViewStateFromUserDefaults() { + let keys: [String] = [ + MVUserDefaultsKeys.hideDigitalTimer + ] + for key in keys { + let value = UserDefaults.standard.bool(forKey: key) + setViewState(value, forKey: key, save: false) + } + } } diff --git a/Timer/MVUserDefaultsKeys.swift b/Timer/MVUserDefaultsKeys.swift index d400c83..dfbcfa9 100644 --- a/Timer/MVUserDefaultsKeys.swift +++ b/Timer/MVUserDefaultsKeys.swift @@ -1,3 +1,4 @@ struct MVUserDefaultsKeys { static let staysOnTop = "staysOnTop" + static let hideDigitalTimer = "hideDigitalTimer" }