mac/menu: attach menu config to menu item for direct access

add a config property to the menu items, so we don't need to search in
the config array for the right config.
This commit is contained in:
der richter 2024-03-03 22:28:48 +01:00
parent 95d08df7a7
commit 30eab4b933
1 changed files with 21 additions and 27 deletions

View File

@ -16,6 +16,10 @@
*/
extension MenuBar {
class MenuItem: NSMenuItem {
var config: Config?
}
enum MenuKey {
case normalSize
case halfSize
@ -34,7 +38,7 @@ extension MenuBar {
let url: String?
let file: String?
let commandSpecial: MenuKey?
var menuItem: NSMenuItem?
var menuItem: MenuItem?
var configs: [Config]?
init(
@ -47,7 +51,7 @@ extension MenuBar {
url: String? = nil,
file: String? = nil,
commandSpecial: MenuKey? = nil,
menuItem: NSMenuItem? = nil,
menuItem: MenuItem? = nil,
configs: [Config]? = nil
) {
self.name = name
@ -251,7 +255,8 @@ class MenuBar: NSObject {
for (menuConfigIndex, menuConfig) in menuConfigs.enumerated() {
let menu = NSMenu(title: menuConfig.name)
let item = NSMenuItem(title: menuConfig.name, action: nil, keyEquivalent: menuConfig.key)
let item = MenuItem(title: menuConfig.name, action: nil, keyEquivalent: menuConfig.key)
item.config = menuConfig
mainMenu.addItem(item)
mainMenu.setSubmenu(menu, for: item)
menuConfigs[menuConfigIndex].menuItem = item
@ -262,11 +267,12 @@ class MenuBar: NSObject {
}
if subConfig.name == "separator" {
menu.addItem(NSMenuItem.separator())
menu.addItem(MenuItem.separator())
} else {
let subItem = NSMenuItem(title: subConfig.name, action: subConfig.action, keyEquivalent: subConfig.key)
let subItem = MenuItem(title: subConfig.name, action: subConfig.action, keyEquivalent: subConfig.key)
subItem.target = subConfig.target
subItem.keyEquivalentModifierMask = subConfig.modifiers
subItem.config = subConfig
menu.addItem(subItem)
menuConfigs[menuConfigIndex].configs?[subConfigIndex].menuItem = subItem
@ -289,8 +295,8 @@ class MenuBar: NSObject {
])
}
@objc func settings(_ menuItem: NSMenuItem) {
guard let menuConfig = getConfigFromMenu(menuItem: menuItem),
@objc func settings(_ menuItem: MenuItem) {
guard let menuConfig = menuItem.config,
let fileName = menuConfig.file else { return }
let configPaths: [URL] = [
URL(fileURLWithPath: NSHomeDirectory() + "/.config/mpv/", isDirectory: true),
@ -316,8 +322,8 @@ class MenuBar: NSObject {
}
}
@objc func quit(_ menuItem: NSMenuItem) {
guard let menuConfig = getConfigFromMenu(menuItem: menuItem) else { return }
@objc func quit(_ menuItem: MenuItem) {
guard let menuConfig = menuItem.config else { return }
menuConfig.command.withCString {
(NSApp as? Application)?.stopMPV(UnsafeMutablePointer<CChar>(mutating: $0))
}
@ -363,21 +369,21 @@ class MenuBar: NSObject {
}
}
@objc func command(_ menuItem: NSMenuItem) {
guard let menuConfig = getConfigFromMenu(menuItem: menuItem) else { return }
@objc func command(_ menuItem: MenuItem) {
guard let menuConfig = menuItem.config else { return }
menuConfig.command.withCString {
EventsResponder.sharedInstance().queueCommand(UnsafeMutablePointer<CChar>(mutating: $0))
}
}
@objc func url(_ menuItem: NSMenuItem) {
guard let menuConfig = getConfigFromMenu(menuItem: menuItem),
@objc func url(_ menuItem: MenuItem) {
guard let menuConfig = menuItem.config,
let url = URL(string: menuConfig.url ?? "") else { return }
NSWorkspace.shared.open(url)
}
@objc func showFile(_ menuItem: NSMenuItem) {
guard let menuConfig = getConfigFromMenu(menuItem: menuItem) else { return }
@objc func showFile(_ menuItem: MenuItem) {
guard let menuConfig = menuItem.config else { return }
let url = URL(fileURLWithPath: menuConfig.file ?? "")
if FileManager.default.fileExists(atPath: url.path) {
NSWorkspace.shared.activateFileViewerSelecting([url])
@ -396,18 +402,6 @@ class MenuBar: NSObject {
alert.runModal()
}
func getConfigFromMenu(menuItem: NSMenuItem) -> Config? {
for menuConfig in menuConfigs {
for subConfig in menuConfig.configs ?? [] {
if subConfig.menuItem == menuItem {
return subConfig
}
}
}
return nil
}
func register(_ selector: Selector, key: MenuKey) {
for menuConfig in menuConfigs {
for subConfig in menuConfig.configs ?? [] {