66 lines
1.9 KiB
Python
66 lines
1.9 KiB
Python
from cursesmenu.items import MenuItem
|
|
from cursesmenu.curses_menu import CursesMenu
|
|
from typing import Callable, Any
|
|
|
|
|
|
class DynamicSubmenuItem(MenuItem):
|
|
def __init__(
|
|
self,
|
|
text: str,
|
|
generator: Callable[..., CursesMenu],
|
|
menu: CursesMenu | None = None,
|
|
args: list[Any] | None = None,
|
|
kwargs: dict[Any, Any] | None = None,
|
|
) -> None:
|
|
self._args: list[Any] | None = args
|
|
self._kwargs: dict[Any, Any] | None = kwargs
|
|
self._generator: Callable[..., CursesMenu] | None = generator
|
|
self._menu: CursesMenu | None = menu
|
|
self._submenu: CursesMenu | None = None
|
|
super().__init__(
|
|
text=text,
|
|
menu=menu
|
|
)
|
|
|
|
@property
|
|
def submenu(self) -> CursesMenu | None:
|
|
return self._submenu
|
|
|
|
@submenu.setter
|
|
def submenu(self, submenu: CursesMenu | None) -> None:
|
|
self._submenu = submenu
|
|
if self._submenu is not None:
|
|
self._submenu.parent = self._menu
|
|
|
|
@property
|
|
def menu(self) -> CursesMenu | None:
|
|
return self._menu
|
|
|
|
@menu.setter
|
|
def menu(self, menu: CursesMenu | None) -> None:
|
|
self._menu = menu
|
|
if self._submenu is not None:
|
|
self._submenu.parent = menu
|
|
|
|
def set_up(self) -> None:
|
|
assert self.menu is not None
|
|
self.menu.pause()
|
|
self.menu.clear_screen()
|
|
|
|
def action(self) -> None:
|
|
self.submenu = self._generator(*self._args if self._args else [],
|
|
**self._kwargs if self._kwargs else {})
|
|
self.submenu.start()
|
|
|
|
def clean_up(self) -> None:
|
|
assert self.menu is not None
|
|
assert self.submenu is not None
|
|
self.submenu.join()
|
|
self.submenu.clear_screen()
|
|
self.menu.resume()
|
|
|
|
def get_return(self) -> Any:
|
|
if self.submenu is not None:
|
|
return self.submenu.returned_value
|
|
return None
|