summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorder richter <der.richter@gmx.de>2024-03-04 23:59:54 +0100
committerder richter <der.richter@gmx.de>2024-03-07 01:03:52 +0100
commit16ea688115b83f83fe81834e290632468b7634c8 (patch)
treec447e5167d0ef89774386adc439b581f276dd473
parent4eb58f6ea71ed9ee6454707d605cd0713c1baa4c (diff)
downloadmpv-16ea688115b83f83fe81834e290632468b7634c8.tar.bz2
mpv-16ea688115b83f83fe81834e290632468b7634c8.tar.xz
mac/menu: make menu creation recursive to allow nested submenus
also makes menu creation cleaner and more obvious.
-rw-r--r--osdep/mac/menu_bar.swift62
1 files changed, 31 insertions, 31 deletions
diff --git a/osdep/mac/menu_bar.swift b/osdep/mac/menu_bar.swift
index 75b1f35aba..e57d92eb19 100644
--- a/osdep/mac/menu_bar.swift
+++ b/osdep/mac/menu_bar.swift
@@ -64,6 +64,8 @@ extension MenuBar {
}
class MenuBar: NSObject {
+ let mainMenu = NSMenu(title: "Main")
+ let servicesMenu = NSMenu(title: "Services")
var menuConfigs: [Config] = []
var dynamicMenuItems: [MenuKey:[MenuItem]] = [:]
let appIcon: NSImage
@@ -94,7 +96,7 @@ class MenuBar: NSObject {
url: "input.conf"
),
Config(name: "separator"),
- Config(name: "Services"),
+ Config(name: "Services", configs: []),
Config(name: "separator"),
Config(name: "Hide mpv", key: "h", action: #selector(NSApp.hide(_:))),
Config(name: "Hide Others", key: "h", modifiers: [.command, .option], action: #selector(NSApp.hideOtherApplications(_:))),
@@ -240,41 +242,39 @@ class MenuBar: NSObject {
Config(name: "Help", configs: helpMenuConfigs),
]
- NSApp.mainMenu = generateMainMenu()
+ createMenu(parentMenu: mainMenu, configs: menuConfigs)
+ NSApp.mainMenu = mainMenu
+ NSApp.servicesMenu = servicesMenu
}
- func generateMainMenu() -> NSMenu {
- let mainMenu = NSMenu(title: "MainMenu")
- NSApp.servicesMenu = NSMenu()
-
- for menuConfig in menuConfigs {
- let menu = NSMenu(title: menuConfig.name)
- let item = MenuItem(title: menuConfig.name, action: nil, keyEquivalent: menuConfig.key)
- item.config = menuConfig
- mainMenu.addItem(item)
- mainMenu.setSubmenu(menu, for: item)
-
- for subConfig in menuConfig.configs ?? [] {
- if subConfig.name == "separator" {
- menu.addItem(MenuItem.separator())
- } else {
- 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)
-
- if subConfig.name == "Services" {
- subItem.submenu = NSApp.servicesMenu
- }
- if let cmd = subConfig.commandSpecial {
- dynamicMenuItems[cmd] = (dynamicMenuItems[cmd] ?? []) + [subItem]
- }
- }
+ func createMenu(parentMenu: NSMenu, configs: [Config]) {
+ for config in configs {
+ let item = createMenuItem(parentMenu: parentMenu, config: config)
+
+ if config.configs != nil {
+ let menu = config.name == "Services" ? servicesMenu : NSMenu(title: config.name)
+ item.submenu = menu
+ createMenu(parentMenu: menu, configs: config.configs ?? [])
+ }
+
+ if let cmd = config.commandSpecial {
+ dynamicMenuItems[cmd] = (dynamicMenuItems[cmd] ?? []) + [item]
}
}
+ }
+
+ func createMenuItem(parentMenu: NSMenu, config: Config) -> MenuItem {
+ var item = MenuItem(title: config.name, action: config.action, keyEquivalent: config.key)
+ item.config = config
+ item.target = config.target
+ item.keyEquivalentModifierMask = config.modifiers
+
+ if config.name == "separator" {
+ item = MenuItem.separator() as? MenuItem ?? item
+ }
+ parentMenu.addItem(item)
- return mainMenu
+ return item
}
@objc func about() {