60 lines
2.0 KiB
Swift
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() }
|
|
}
|
|
}
|