Files

60 lines
2.0 KiB
Swift

// Copyright (C) 2026 ysicing
// SPDX-License-Identifier: AGPL-3.0-or-later
import AppKit
import Localization
/// 番茄钟启用时才出现的独立菜单栏入口;左键打开主页面,右键切换 Mini HUD。
@MainActor
final class RestMenuBarController: NSObject {
private let rest: RestController
private let open: () -> Void
private let toggleHUD: () -> Void
private var item: NSStatusItem?
init(rest: RestController, open: @escaping () -> Void, toggleHUD: @escaping () -> Void) {
self.rest = rest
self.open = open
self.toggleHUD = toggleHUD
super.init()
}
func sync() {
guard rest.settings.restEnabled else {
if let item { NSStatusBar.system.removeStatusItem(item) }
item = nil
rest.setMenuBarVisible(false)
return
}
if item == nil {
let item = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
item.autosaveName = "XStats.rest"
if let button = item.button {
button.target = self
button.action = #selector(clicked(_:))
button.sendAction(on: [.leftMouseUp, .rightMouseUp])
button.image = NSImage(systemSymbolName: "timer", accessibilityDescription: tr("番茄钟"))
button.image?.isTemplate = true
}
self.item = item
}
rest.setMenuBarVisible(true)
update()
}
func update() {
guard let button = item?.button else { return }
if rest.isRunning {
let seconds = max(0, Int(rest.secondsRemaining.rounded(.up)))
button.title = String(format: " %02d:%02d", seconds / 60, seconds % 60)
} else {
button.title = ""
}
button.toolTip = tr("番茄钟") + " · " + tr(rest.isRunning ? "计时中" : "已暂停")
}
@objc private func clicked(_ sender: NSStatusBarButton) {
if NSApp.currentEvent?.type == .rightMouseUp { toggleHUD() } else { open() }
}
}