Skip to content

Commit ac0188e

Browse files
Merge pull request #4 from kristopherjohnson/status-item-button
Use status item button
2 parents d2caa07 + 0d160e3 commit ac0188e

File tree

5 files changed

+36
-325
lines changed

5 files changed

+36
-325
lines changed

MenubarCountdown.xcodeproj/project.pbxproj

-12
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88

99
/* Begin PBXBuildFile section */
1010
4E48658E1BEE6CE500C159BF /* Log.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E48658D1BEE6CE500C159BF /* Log.swift */; };
11-
4E4865911BEE703A00C159BF /* MenubarIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = 4E48658F1BEE703A00C159BF /* MenubarIcon.png */; };
12-
4E4865921BEE703A00C159BF /* MenubarIconInverse.png in Resources */ = {isa = PBXBuildFile; fileRef = 4E4865901BEE703A00C159BF /* MenubarIconInverse.png */; };
1311
4E4865941BEE705E00C159BF /* UserDefaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = 4E4865931BEE705E00C159BF /* UserDefaults.plist */; };
1412
4E4865961BEE721C00C159BF /* CATransactionExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E4865951BEE721C00C159BF /* CATransactionExtensions.swift */; };
1513
4E4865981BEE749E00C159BF /* StartTimerDialogController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E4865971BEE749E00C159BF /* StartTimerDialogController.swift */; };
@@ -29,7 +27,6 @@
2927
4EB204401BED89F900D83EF3 /* MenubarCountdownUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB2043F1BED89F900D83EF3 /* MenubarCountdownUITests.swift */; };
3028
4EB2044E1BED908300D83EF3 /* Stopwatch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB2044D1BED908300D83EF3 /* Stopwatch.swift */; };
3129
4EB204501BEE29D700D83EF3 /* AppUserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB2044F1BEE29D700D83EF3 /* AppUserDefaults.swift */; };
32-
4EB204521BEE2E8B00D83EF3 /* StatusItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB204511BEE2E8B00D83EF3 /* StatusItemView.swift */; };
3330
4EB204541BEE307900D83EF3 /* CALayerExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB204531BEE307900D83EF3 /* CALayerExtensions.swift */; };
3431
/* End PBXBuildFile section */
3532

@@ -52,8 +49,6 @@
5249

5350
/* Begin PBXFileReference section */
5451
4E48658D1BEE6CE500C159BF /* Log.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Log.swift; sourceTree = "<group>"; };
55-
4E48658F1BEE703A00C159BF /* MenubarIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = MenubarIcon.png; sourceTree = "<group>"; };
56-
4E4865901BEE703A00C159BF /* MenubarIconInverse.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = MenubarIconInverse.png; sourceTree = "<group>"; };
5752
4E4865931BEE705E00C159BF /* UserDefaults.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = UserDefaults.plist; sourceTree = "<group>"; };
5853
4E4865951BEE721C00C159BF /* CATransactionExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CATransactionExtensions.swift; sourceTree = "<group>"; };
5954
4E4865971BEE749E00C159BF /* StartTimerDialogController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StartTimerDialogController.swift; sourceTree = "<group>"; };
@@ -81,7 +76,6 @@
8176
4EB204411BED89F900D83EF3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
8277
4EB2044D1BED908300D83EF3 /* Stopwatch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Stopwatch.swift; sourceTree = "<group>"; };
8378
4EB2044F1BEE29D700D83EF3 /* AppUserDefaults.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppUserDefaults.swift; sourceTree = "<group>"; };
84-
4EB204511BEE2E8B00D83EF3 /* StatusItemView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusItemView.swift; sourceTree = "<group>"; };
8579
4EB204531BEE307900D83EF3 /* CALayerExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CALayerExtensions.swift; sourceTree = "<group>"; };
8680
/* End PBXFileReference section */
8781

@@ -136,8 +130,6 @@
136130
children = (
137131
4E4865A81BEFA07300C159BF /* MenuTimerIcon.icns */,
138132
4EB204261BED89F900D83EF3 /* Assets.xcassets */,
139-
4E48658F1BEE703A00C159BF /* MenubarIcon.png */,
140-
4E4865901BEE703A00C159BF /* MenubarIconInverse.png */,
141133
);
142134
name = "Image Resources";
143135
sourceTree = "<group>";
@@ -184,7 +176,6 @@
184176
4E48659F1BEE85D200C159BF /* MenubarCountdown-Bridging-Header.h */,
185177
4E4865B11BEFC63700C159BF /* StartTimerDialog.xib */,
186178
4E4865971BEE749E00C159BF /* StartTimerDialogController.swift */,
187-
4EB204511BEE2E8B00D83EF3 /* StatusItemView.swift */,
188179
4EB2044D1BED908300D83EF3 /* Stopwatch.swift */,
189180
4E4865AB1BEFA0F000C159BF /* Text Resources */,
190181
4E4865991BEE79EA00C159BF /* TextField.swift */,
@@ -317,13 +308,11 @@
317308
isa = PBXResourcesBuildPhase;
318309
buildActionMask = 2147483647;
319310
files = (
320-
4E4865921BEE703A00C159BF /* MenubarIconInverse.png in Resources */,
321311
4E4865941BEE705E00C159BF /* UserDefaults.plist in Resources */,
322312
4E4865A91BEFA07300C159BF /* MenuTimerIcon.icns in Resources */,
323313
4E4865B51BEFC63700C159BF /* TimerExpiredAlert.xib in Resources */,
324314
4EB204271BED89F900D83EF3 /* Assets.xcassets in Resources */,
325315
4E4865B41BEFC63700C159BF /* StartTimerDialog.xib in Resources */,
326-
4E4865911BEE703A00C159BF /* MenubarIcon.png in Resources */,
327316
4E4865B31BEFC63700C159BF /* MainMenu.xib in Resources */,
328317
4E4865AD1BEFA12A00C159BF /* Credits.rtf in Resources */,
329318
);
@@ -350,7 +339,6 @@
350339
isa = PBXSourcesBuildPhase;
351340
buildActionMask = 2147483647;
352341
files = (
353-
4EB204521BEE2E8B00D83EF3 /* StatusItemView.swift in Sources */,
354342
4E4865981BEE749E00C159BF /* StartTimerDialogController.swift in Sources */,
355343
4EB204541BEE307900D83EF3 /* CALayerExtensions.swift in Sources */,
356344
4E48659A1BEE79EA00C159BF /* TextField.swift in Sources */,

MenubarCountdown/AppDelegate.swift

+36-21
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,6 @@ class AppDelegate: NSObject, NSApplicationDelegate {
4545

4646
var statusItem: NSStatusItem!
4747

48-
var statusItemView: StatusItemView!
49-
5048
/**
5149
Reference to menu loaded from MainMenu.xib.
5250
*/
@@ -72,18 +70,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
7270

7371
stopwatch.reset()
7472

75-
let statusBar = NSStatusBar.system
76-
statusItem = statusBar.statusItem(withLength: NSStatusItem.variableLength)
77-
78-
statusItemView = StatusItemView()
79-
statusItemView.statusItem = statusItem
80-
statusItemView.menu = menu
81-
statusItemView.toolTip = NSLocalizedString("Menubar Countdown",
82-
comment: "Status Item Tooltip")
83-
// #KJ TODO: 'view' is deprecated. Use the standard button property instead.
84-
statusItem.view = statusItemView
85-
86-
updateStatusItemTitle(timeRemaining: 0)
73+
initializeStatusItem()
8774

8875
if UserDefaults.standard.bool(forKey: AppUserDefaults.showStartDialogOnLaunchKey) {
8976
showStartTimerDialog(self)
@@ -133,6 +120,22 @@ class AppDelegate: NSObject, NSApplicationDelegate {
133120
}
134121
}
135122

123+
/**
124+
Create `statusItem` and set its initial state.
125+
*/
126+
func initializeStatusItem() {
127+
let statusBar = NSStatusBar.system
128+
statusItem = statusBar.statusItem(withLength: NSStatusItem.variableLength)
129+
130+
statusItem.menu = menu
131+
statusItem.button?.wantsLayer = true
132+
statusItem.button?.toolTip = NSLocalizedString("Menubar Countdown",
133+
comment: "Status Item Tooltip")
134+
statusItem.button?.font = NSFont.monospacedDigitSystemFont(ofSize: 0,
135+
weight: .regular)
136+
showStatusItemIcon()
137+
}
138+
136139
/**
137140
Sets the text of the menu bar status item.
138141
*/
@@ -159,7 +162,22 @@ class AppDelegate: NSObject, NSApplicationDelegate {
159162
else {
160163
timeString = NSString(format: "%02d:%02d", hours, minutes) as String
161164
}
162-
statusItemView.title = timeString
165+
statusItem.button?.title = timeString
166+
}
167+
168+
/**
169+
Change the status item to an hourglass icon
170+
*/
171+
func showStatusItemIcon() {
172+
statusItem.button?.title = "⌛️"
173+
}
174+
175+
func startBlinking() {
176+
statusItem.button?.layer?.addBlinkAnimation()
177+
}
178+
179+
func stopBlinking() {
180+
statusItem.button?.layer?.removeBlinkAnimation()
163181
}
164182

165183
// MARK: Timer expiration
@@ -180,7 +198,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
180198
let defaults = UserDefaults.standard
181199

182200
if defaults.bool(forKey: AppUserDefaults.blinkOnExpirationKey) {
183-
statusItemView.isTitleBlinking = true
201+
startBlinking()
184202
}
185203

186204
if defaults.bool(forKey: AppUserDefaults.playAlertSoundOnExpirationKey) {
@@ -287,7 +305,6 @@ class AppDelegate: NSObject, NSApplicationDelegate {
287305
startTimerDialogController.showDialog()
288306
}
289307

290-
291308
/**
292309
Start the timer.
293310

@@ -311,7 +328,6 @@ class AppDelegate: NSObject, NSApplicationDelegate {
311328
stopwatch.reset()
312329

313330
updateStatusItemTitle(timeRemaining: timerSettingSeconds)
314-
statusItemView.showTitle()
315331

316332
waitForNextSecond()
317333
}
@@ -330,8 +346,8 @@ class AppDelegate: NSObject, NSApplicationDelegate {
330346
canPause = false
331347
canResume = false
332348

333-
statusItemView.isTitleBlinking = false
334-
statusItemView.showIcon()
349+
stopBlinking()
350+
showStatusItemIcon()
335351
}
336352

337353
/**
@@ -366,7 +382,6 @@ class AppDelegate: NSObject, NSApplicationDelegate {
366382
stopwatch.reset()
367383

368384
updateStatusItemTitle(timeRemaining: timerSettingSeconds)
369-
statusItemView.showTitle()
370385

371386
waitForNextSecond()
372387
}

MenubarCountdown/MenubarIcon.png

-776 Bytes
Binary file not shown.
-713 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)