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