def add_menu(win, menu_bar, label, specs:dict|tuple[tuple], parent=None):
label_txt = "&"+label.capitalize()
if parent is None:
menu = menu_bar.addMenu(label_txt)
win.menus[label] = menu
def add_action(action, *_, m=menu):
return m.addAction(action)
else:
menu = parent.addMenu(label_txt)
exclusive = isinstance(specs, tuple)
if exclusive:
group = QActionGroup(win)
group.setExclusive(True)
def add_action(action, i, *_, g=group, m=menu):
g.addAction(action)
if i == 0:
action.setChecked(True)
return m.addAction(action)
else:
def add_action(action, *_, m=menu):
return m.addAction(action)
if isinstance(specs, dict):
specs = specs.items()
for i, (name, spec) in enumerate(specs):
if isinstance(spec, (tuple,dict)):
add_menu(win, menu, name, spec, parent=menu)
continue
action_func = spec
if len(name) == 2:
action_label, shortcut = name
else:
action_label = name
shortcut = None
action = QAction(action_label, win)
if shortcut:
action.setShortcut(shortcut)
action.triggered.connect(action_func)
add_action(action, i)
return menu