From 854cb4d790a722499131584b8afd53ab5e54d9c6 Mon Sep 17 00:00:00 2001 From: Kristopher Johnson Date: Tue, 22 Oct 2019 06:39:45 -0400 Subject: [PATCH 1/3] Use statusItem.button instead of deprecated statusItem.view --- MenubarCountdown/AppDelegate.swift | 33 ++++++++++++++---------------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/MenubarCountdown/AppDelegate.swift b/MenubarCountdown/AppDelegate.swift index 440a620..32162d2 100644 --- a/MenubarCountdown/AppDelegate.swift +++ b/MenubarCountdown/AppDelegate.swift @@ -45,8 +45,6 @@ class AppDelegate: NSObject, NSApplicationDelegate { var statusItem: NSStatusItem! - var statusItemView: StatusItemView! - /** Reference to menu loaded from MainMenu.xib. */ @@ -75,15 +73,10 @@ class AppDelegate: NSObject, NSApplicationDelegate { let statusBar = NSStatusBar.system statusItem = statusBar.statusItem(withLength: NSStatusItem.variableLength) - statusItemView = StatusItemView() - statusItemView.statusItem = statusItem - statusItemView.menu = menu - statusItemView.toolTip = NSLocalizedString("Menubar Countdown", - comment: "Status Item Tooltip") - // #KJ TODO: 'view' is deprecated. Use the standard button property instead. - statusItem.view = statusItemView - - updateStatusItemTitle(timeRemaining: 0) + statusItem.menu = menu + statusItem.button?.toolTip = NSLocalizedString("Menubar Countdown", + comment: "Status Item Tooltip") + showStatusItemIcon() if UserDefaults.standard.bool(forKey: AppUserDefaults.showStartDialogOnLaunchKey) { showStartTimerDialog(self) @@ -159,7 +152,14 @@ class AppDelegate: NSObject, NSApplicationDelegate { else { timeString = NSString(format: "%02d:%02d", hours, minutes) as String } - statusItemView.title = timeString + statusItem.button?.title = timeString + } + + /** + Change the status item to an hourglass icon + */ + func showStatusItemIcon() { + statusItem.button?.title = "⌛️" } // MARK: Timer expiration @@ -180,7 +180,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { let defaults = UserDefaults.standard if defaults.bool(forKey: AppUserDefaults.blinkOnExpirationKey) { - statusItemView.isTitleBlinking = true + //statusItemView.isTitleBlinking = true } if defaults.bool(forKey: AppUserDefaults.playAlertSoundOnExpirationKey) { @@ -287,7 +287,6 @@ class AppDelegate: NSObject, NSApplicationDelegate { startTimerDialogController.showDialog() } - /** Start the timer. @@ -311,7 +310,6 @@ class AppDelegate: NSObject, NSApplicationDelegate { stopwatch.reset() updateStatusItemTitle(timeRemaining: timerSettingSeconds) - statusItemView.showTitle() waitForNextSecond() } @@ -330,8 +328,8 @@ class AppDelegate: NSObject, NSApplicationDelegate { canPause = false canResume = false - statusItemView.isTitleBlinking = false - statusItemView.showIcon() + //statusItemView.isTitleBlinking = false + showStatusItemIcon() } /** @@ -366,7 +364,6 @@ class AppDelegate: NSObject, NSApplicationDelegate { stopwatch.reset() updateStatusItemTitle(timeRemaining: timerSettingSeconds) - statusItemView.showTitle() waitForNextSecond() } From 61788f4c054de29ff8a117e75473bbd641927a94 Mon Sep 17 00:00:00 2001 From: Kristopher Johnson Date: Tue, 22 Oct 2019 06:51:07 -0400 Subject: [PATCH 2/3] Implement blink-on-timer-expiration for statusItem.button --- MenubarCountdown/AppDelegate.swift | 36 ++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/MenubarCountdown/AppDelegate.swift b/MenubarCountdown/AppDelegate.swift index 32162d2..3525573 100644 --- a/MenubarCountdown/AppDelegate.swift +++ b/MenubarCountdown/AppDelegate.swift @@ -70,13 +70,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { stopwatch.reset() - let statusBar = NSStatusBar.system - statusItem = statusBar.statusItem(withLength: NSStatusItem.variableLength) - - statusItem.menu = menu - statusItem.button?.toolTip = NSLocalizedString("Menubar Countdown", - comment: "Status Item Tooltip") - showStatusItemIcon() + initializeStatusItem() if UserDefaults.standard.bool(forKey: AppUserDefaults.showStartDialogOnLaunchKey) { showStartTimerDialog(self) @@ -126,6 +120,22 @@ class AppDelegate: NSObject, NSApplicationDelegate { } } + /** + Create `statusItem` and set its initial state. + */ + func initializeStatusItem() { + let statusBar = NSStatusBar.system + statusItem = statusBar.statusItem(withLength: NSStatusItem.variableLength) + + statusItem.menu = menu + statusItem.button?.wantsLayer = true + statusItem.button?.toolTip = NSLocalizedString("Menubar Countdown", + comment: "Status Item Tooltip") + statusItem.button?.font = NSFont.monospacedDigitSystemFont(ofSize: 0, + weight: .regular) + showStatusItemIcon() + } + /** Sets the text of the menu bar status item. */ @@ -162,6 +172,14 @@ class AppDelegate: NSObject, NSApplicationDelegate { statusItem.button?.title = "⌛️" } + func startBlinking() { + statusItem.button?.layer?.addBlinkAnimation() + } + + func stopBlinking() { + statusItem.button?.layer?.removeBlinkAnimation() + } + // MARK: Timer expiration /** @@ -180,7 +198,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { let defaults = UserDefaults.standard if defaults.bool(forKey: AppUserDefaults.blinkOnExpirationKey) { - //statusItemView.isTitleBlinking = true + startBlinking() } if defaults.bool(forKey: AppUserDefaults.playAlertSoundOnExpirationKey) { @@ -328,7 +346,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { canPause = false canResume = false - //statusItemView.isTitleBlinking = false + stopBlinking() showStatusItemIcon() } From 0d160e34dedbff8d13ac28fdeb0260c665b0f274 Mon Sep 17 00:00:00 2001 From: Kristopher Johnson Date: Tue, 22 Oct 2019 06:52:23 -0400 Subject: [PATCH 3/3] Remove unused StatusItemView class and related resources --- MenubarCountdown.xcodeproj/project.pbxproj | 12 - MenubarCountdown/MenubarIcon.png | Bin 776 -> 0 bytes MenubarCountdown/MenubarIconInverse.png | Bin 713 -> 0 bytes MenubarCountdown/StatusItemView.swift | 292 --------------------- 4 files changed, 304 deletions(-) delete mode 100644 MenubarCountdown/MenubarIcon.png delete mode 100644 MenubarCountdown/MenubarIconInverse.png delete mode 100644 MenubarCountdown/StatusItemView.swift diff --git a/MenubarCountdown.xcodeproj/project.pbxproj b/MenubarCountdown.xcodeproj/project.pbxproj index 852246d..f14c96b 100644 --- a/MenubarCountdown.xcodeproj/project.pbxproj +++ b/MenubarCountdown.xcodeproj/project.pbxproj @@ -8,8 +8,6 @@ /* Begin PBXBuildFile section */ 4E48658E1BEE6CE500C159BF /* Log.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E48658D1BEE6CE500C159BF /* Log.swift */; }; - 4E4865911BEE703A00C159BF /* MenubarIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = 4E48658F1BEE703A00C159BF /* MenubarIcon.png */; }; - 4E4865921BEE703A00C159BF /* MenubarIconInverse.png in Resources */ = {isa = PBXBuildFile; fileRef = 4E4865901BEE703A00C159BF /* MenubarIconInverse.png */; }; 4E4865941BEE705E00C159BF /* UserDefaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = 4E4865931BEE705E00C159BF /* UserDefaults.plist */; }; 4E4865961BEE721C00C159BF /* CATransactionExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E4865951BEE721C00C159BF /* CATransactionExtensions.swift */; }; 4E4865981BEE749E00C159BF /* StartTimerDialogController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E4865971BEE749E00C159BF /* StartTimerDialogController.swift */; }; @@ -29,7 +27,6 @@ 4EB204401BED89F900D83EF3 /* MenubarCountdownUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB2043F1BED89F900D83EF3 /* MenubarCountdownUITests.swift */; }; 4EB2044E1BED908300D83EF3 /* Stopwatch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB2044D1BED908300D83EF3 /* Stopwatch.swift */; }; 4EB204501BEE29D700D83EF3 /* AppUserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB2044F1BEE29D700D83EF3 /* AppUserDefaults.swift */; }; - 4EB204521BEE2E8B00D83EF3 /* StatusItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB204511BEE2E8B00D83EF3 /* StatusItemView.swift */; }; 4EB204541BEE307900D83EF3 /* CALayerExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB204531BEE307900D83EF3 /* CALayerExtensions.swift */; }; /* End PBXBuildFile section */ @@ -52,8 +49,6 @@ /* Begin PBXFileReference section */ 4E48658D1BEE6CE500C159BF /* Log.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Log.swift; sourceTree = ""; }; - 4E48658F1BEE703A00C159BF /* MenubarIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = MenubarIcon.png; sourceTree = ""; }; - 4E4865901BEE703A00C159BF /* MenubarIconInverse.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = MenubarIconInverse.png; sourceTree = ""; }; 4E4865931BEE705E00C159BF /* UserDefaults.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = UserDefaults.plist; sourceTree = ""; }; 4E4865951BEE721C00C159BF /* CATransactionExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CATransactionExtensions.swift; sourceTree = ""; }; 4E4865971BEE749E00C159BF /* StartTimerDialogController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StartTimerDialogController.swift; sourceTree = ""; }; @@ -81,7 +76,6 @@ 4EB204411BED89F900D83EF3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 4EB2044D1BED908300D83EF3 /* Stopwatch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Stopwatch.swift; sourceTree = ""; }; 4EB2044F1BEE29D700D83EF3 /* AppUserDefaults.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppUserDefaults.swift; sourceTree = ""; }; - 4EB204511BEE2E8B00D83EF3 /* StatusItemView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusItemView.swift; sourceTree = ""; }; 4EB204531BEE307900D83EF3 /* CALayerExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CALayerExtensions.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -136,8 +130,6 @@ children = ( 4E4865A81BEFA07300C159BF /* MenuTimerIcon.icns */, 4EB204261BED89F900D83EF3 /* Assets.xcassets */, - 4E48658F1BEE703A00C159BF /* MenubarIcon.png */, - 4E4865901BEE703A00C159BF /* MenubarIconInverse.png */, ); name = "Image Resources"; sourceTree = ""; @@ -184,7 +176,6 @@ 4E48659F1BEE85D200C159BF /* MenubarCountdown-Bridging-Header.h */, 4E4865B11BEFC63700C159BF /* StartTimerDialog.xib */, 4E4865971BEE749E00C159BF /* StartTimerDialogController.swift */, - 4EB204511BEE2E8B00D83EF3 /* StatusItemView.swift */, 4EB2044D1BED908300D83EF3 /* Stopwatch.swift */, 4E4865AB1BEFA0F000C159BF /* Text Resources */, 4E4865991BEE79EA00C159BF /* TextField.swift */, @@ -317,13 +308,11 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 4E4865921BEE703A00C159BF /* MenubarIconInverse.png in Resources */, 4E4865941BEE705E00C159BF /* UserDefaults.plist in Resources */, 4E4865A91BEFA07300C159BF /* MenuTimerIcon.icns in Resources */, 4E4865B51BEFC63700C159BF /* TimerExpiredAlert.xib in Resources */, 4EB204271BED89F900D83EF3 /* Assets.xcassets in Resources */, 4E4865B41BEFC63700C159BF /* StartTimerDialog.xib in Resources */, - 4E4865911BEE703A00C159BF /* MenubarIcon.png in Resources */, 4E4865B31BEFC63700C159BF /* MainMenu.xib in Resources */, 4E4865AD1BEFA12A00C159BF /* Credits.rtf in Resources */, ); @@ -350,7 +339,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 4EB204521BEE2E8B00D83EF3 /* StatusItemView.swift in Sources */, 4E4865981BEE749E00C159BF /* StartTimerDialogController.swift in Sources */, 4EB204541BEE307900D83EF3 /* CALayerExtensions.swift in Sources */, 4E48659A1BEE79EA00C159BF /* TextField.swift in Sources */, diff --git a/MenubarCountdown/MenubarIcon.png b/MenubarCountdown/MenubarIcon.png deleted file mode 100644 index 57fe213cda71ef14295a39bac60fd8d7c5bca70d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 776 zcmV+j1NZ!iP)KLZ*U+s!PAz6~$9cIRu+`&V51dreiQV3o|u(k*iECqkn z<24T+h}Wp!9kkA&s=bYqC>v)JdA#L_0|3aCGsDqc3Q#w-<~IRf9|(Z=>!{xy@HdCb zSP#4b4~2FL#0gM7dE-H>f%bG^JcwtYy-1TDh!^10>$L~yHD+VW+1$%ZbtP}YFqBcz zOtl9Iw5y)t{lu0?8dnXg^v|Z^UV7CpxS#0x-jPt6>WhdzH@5b3g z?$T$90K~<1-|eYKyZZULbqn9W20$v}d3Hbm001CkNK#Dz0D2_=0Dyx40Qvs_0D$QL z0Cg|`0P0`>06Lfe02gnPU&TfM00DSOL_t(|+MJWSFGFz@$3OSg-g=knP(eb7l2js* zAS7N9HU_as#A2~X%>D#180#+}NX1~Z*w`3IJW};ah&Eciz3uJK+LE8BbEcE?$;tP; z6v5w3ErCTTrLtZaxX8N82FlxwdNezpc}|_^v5X9+FSy$f&`@x&fE4G`L?oK4d;I~2 zBngt(*cgZ5z)NtW=c1~=4i&X1UsTx#xUgE> z&FL4@Zyw(R&adkZslkeF-)Q=c*>COtfCKp+pLcP6Y_oPI9`z5qi?fBAG&+{%&W^>h zm=Fu1bH8QPrg++{P*}vdaIJ)uK@s?sgz0uT@p(G0000KLZ*U+s!PAz6~$9cIRu+`&V51dreiQV3o|u(k*iECqkn z<24T+h}Wp!9kkA&s=bYqC>v)JdA#L_0|3aCGsDqc3Q#w-<~IRf9|(Z=>!{xy@HdCb zSP#4b4~2FL#0gM7dE-H>f%bG^JcwtYy-1TDh!^10>$L~yHD+VW+1$%ZbtP}YFqBcz zOtl9Iw5y)t{lu0?8dnXg^v|Z^UV7CpxS#0x-jPt6>WhdzH@5b3g z?$T$90K~<1-|eYKyZZULbqn9W20$v}d3Hbm001CkNK#Dz0D2_=0Dyx40Qvs_0D$QL z0Cg|`0P0`>06Lfe02gnPU&TfM00B8kL_t(|+QgH;FGEonhM&`3DM=-_LrW?utrUr* zCW$s(BqYROuv(dHVz61v27|%o574E9#6qGr7BP@$L^LT9zgi^CmCr()dv32-#CN9e zd*7Tq=RM~r;rA8bugsRwhse=Klpv2(DRJ#mMPDOQd6Swv%d33Ww641`h9zzhrk%F0 z$(TR$m3lY0%6g-W=$09zgiQ+$6((5HsZDc~Ao@f+GtF5RXL{L9i7QF zUp|_V1F6f2NI@1Q=Fi-FzrB!Ykfnn