60 lines
2.6 KiB
Swift
60 lines
2.6 KiB
Swift
import AppKit
|
|
|
|
extension AppDelegate {
|
|
|
|
func setupStatusBar() {
|
|
statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
|
|
if let button = statusItem.button {
|
|
let minutes = workTimerDuration / 60
|
|
let seconds = workTimerDuration % 60
|
|
button.title = String(format: "🍅 %02d:%02d", minutes, seconds)
|
|
button.font = NSFont.monospacedSystemFont(ofSize: 12, weight: .medium)
|
|
}
|
|
|
|
let menu = NSMenu()
|
|
statusMenuItem = NSMenuItem(title: "Pommedoro: Running", action: nil, keyEquivalent: "")
|
|
statusMenuItem.isEnabled = false
|
|
menu.addItem(statusMenuItem)
|
|
menu.addItem(NSMenuItem.separator())
|
|
pauseMenuItem = NSMenuItem(title: "Pause", action: #selector(togglePause), keyEquivalent: "p")
|
|
menu.addItem(pauseMenuItem)
|
|
menu.addItem(NSMenuItem(title: "Restart Timer", action: #selector(restartTimer), keyEquivalent: "r"))
|
|
menu.addItem(NSMenuItem.separator())
|
|
|
|
// Settings submenu with inline sliders and color picker
|
|
settingsMenuBuilder = SettingsMenuBuilder()
|
|
menu.addItem(settingsMenuBuilder.buildSettingsSubmenu())
|
|
|
|
menu.addItem(NSMenuItem.separator())
|
|
menu.addItem(NSMenuItem(title: "View Work Log", action: #selector(showWorkLog), keyEquivalent: "w"))
|
|
menu.addItem(NSMenuItem.separator())
|
|
debugMenuItem = NSMenuItem(title: "Debug Mode", action: #selector(toggleDebugMode), keyEquivalent: "d")
|
|
debugMenuItem.state = isDebugMode ? .on : .off
|
|
menu.addItem(debugMenuItem)
|
|
menu.addItem(NSMenuItem.separator())
|
|
launchAtLoginMenuItem = NSMenuItem(title: "Launch at Login", action: #selector(toggleLaunchAtLogin), keyEquivalent: "l")
|
|
launchAtLoginMenuItem.state = LaunchAgent.isInstalled() ? .on : .off
|
|
menu.addItem(launchAtLoginMenuItem)
|
|
menu.addItem(NSMenuItem.separator())
|
|
menu.addItem(NSMenuItem(title: "Quit Pommedoro", action: #selector(closePommedoro), keyEquivalent: "q"))
|
|
|
|
for item in menu.items {
|
|
if item.target == nil && item.action != nil {
|
|
item.target = self
|
|
}
|
|
}
|
|
|
|
statusItem.menu = menu
|
|
}
|
|
|
|
func updateStatusBar() {
|
|
let minutes = remainingSeconds / 60
|
|
let seconds = remainingSeconds % 60
|
|
let time = String(format: "%02d:%02d", minutes, seconds)
|
|
let prefix = isPaused ? "⏸" : "🍅"
|
|
statusItem.button?.title = "\(prefix) \(time)"
|
|
statusMenuItem.title = isPaused ? "Pommedoro: Paused" : "Pommedoro: Running"
|
|
pauseMenuItem.title = isPaused ? "Resume" : "Pause"
|
|
}
|
|
}
|