Files
steipete--codexbar/Sources/CodexBar/StatusItemController+PersistentRefreshMenuItem.swift
T
2026-07-13 12:22:33 +08:00

59 lines
2.0 KiB
Swift

import AppKit
extension StatusItemController {
func isPersistentRefreshItem(_ item: NSMenuItem) -> Bool {
item.representedObject as? String == Self.persistentRefreshMenuItemID
}
func makePersistentRefreshItem(title: String, menu: NSMenu, width: CGFloat) -> NSMenuItem {
let shortcutText = self.shortcut(for: .refresh).map(Self.shortcutDisplayLabel)
let metrics = PersistentRefreshRowMetrics.defaults
let view = PersistentRefreshMenuView(
title: title,
systemImageName: MenuDescriptor.MenuAction.refresh.systemImageName,
shortcutText: shortcutText,
onClick: { [weak self, weak menu] in
guard let self, let menu else { return }
if let menu = menu as? StatusItemMenu {
menu.requestPersistentRefreshAction()
} else {
self.performPersistentRefreshAction(in: ObjectIdentifier(menu))
}
})
let enabled = !self.isRefreshActionInFlight(for: menu)
view.setEnabled(enabled)
view.applySize(width: width, height: metrics.rowHeight)
let item = NSMenuItem()
item.title = title
item.representedObject = Self.persistentRefreshMenuItemID
item.view = view
item.isEnabled = enabled
item.keyEquivalentModifierMask = []
item.toolTip = title
return item
}
private static func shortcutDisplayLabel(
for shortcut: (key: String, modifiers: NSEvent.ModifierFlags)) -> String
{
var label = ""
if shortcut.modifiers.contains(.control) {
label += "^"
}
if shortcut.modifiers.contains(.option) {
label += "⌥"
}
if shortcut.modifiers.contains(.shift) {
label += "⇧"
}
if shortcut.modifiers.contains(.command) {
label += "⌘"
}
if !label.isEmpty {
label += " "
}
return label + shortcut.key.uppercased()
}
}