diff --git a/ee_plugin/ui/menus.py b/ee_plugin/ui/menus.py index fde68fb..279b4c4 100644 --- a/ee_plugin/ui/menus.py +++ b/ee_plugin/ui/menus.py @@ -1,16 +1,17 @@ from dataclasses import dataclass, field -from typing import Optional, List, Union +from typing import Optional, List, Callable from PyQt5.QtWidgets import QMenu, QAction -MenuItem = Union["Separator", "SubMenu", "Action"] +MenuItem = Callable[[QMenu], None] -@dataclass class Separator: """A separator in a menu.""" - ... + def __call__(self, menu: QMenu): + """Render the separator in the given QMenu.""" + menu.addSeparator() @dataclass @@ -20,6 +21,11 @@ class SubMenu: label: Optional[str] = None subitems: Optional[List[MenuItem]] = field(default_factory=list) + def __call__(self, menu: QMenu): + """Render the submenu in the given QMenu.""" + sub_menu = menu.addMenu(self.label or "") + populate_menu(menu=sub_menu, items=self.subitems) + @dataclass class Action: @@ -27,14 +33,12 @@ class Action: action: Optional[QAction] = None + def __call__(self, menu: QMenu): + """Render the action in the given QMenu.""" + menu.addAction(self.action) + def populate_menu(*, menu: QMenu, items: List[MenuItem]): """Populate a QMenu with the given list of MenuItem objects.""" for item in items: - if isinstance(item, Separator): - menu.addSeparator() - elif isinstance(item, SubMenu): - sub_menu = menu.addMenu(item.label or "") - populate_menu(menu=sub_menu, items=item.subitems) - elif isinstance(item, Action): - menu.addAction(item.action) + item(menu)