Skip to content

Commit

Permalink
Rework as callables
Browse files Browse the repository at this point in the history
  • Loading branch information
alukach committed Feb 24, 2025
1 parent e9a1fc3 commit 50a84ab
Showing 1 changed file with 15 additions and 11 deletions.
26 changes: 15 additions & 11 deletions ee_plugin/ui/menus.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -20,21 +21,24 @@ 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:
"""An action in a menu."""

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)

0 comments on commit 50a84ab

Please sign in to comment.