refactor(kiauh): handle menus based on if they need instantiation or not

Signed-off-by: Dominik Willner <th33xitus@gmail.com>
This commit is contained in:
dw-0
2024-02-08 22:41:52 +01:00
parent 0447bc4405
commit 2f34253bad

View File

@@ -97,13 +97,14 @@ class BaseMenu(ABC):
def __init__( def __init__(
self, self,
options: Dict[str, Union[Callable, Type["BaseMenu"]]], options: Dict[str, Union[Callable, Any]],
options_offset: int = 0, options_offset: int = 0,
header: bool = True, header: bool = True,
footer_type: Literal[ footer_type: Literal[
"QUIT_FOOTER", "BACK_FOOTER", "BACK_HELP_FOOTER" "QUIT_FOOTER", "BACK_FOOTER", "BACK_HELP_FOOTER"
] = QUIT_FOOTER, ] = QUIT_FOOTER,
): ):
self.previous_menu = None
self.options = options self.options = options
self.options_offset = options_offset self.options_offset = options_offset
self.header = header self.header = header
@@ -131,11 +132,11 @@ class BaseMenu(ABC):
def handle_user_input(self) -> str: def handle_user_input(self) -> str:
while True: while True:
choice = input(f"{COLOR_CYAN}###### Perform action: {RESET_FORMAT}") choice = input(f"{COLOR_CYAN}###### Perform action: {RESET_FORMAT}").lower()
option = self.options.get(choice, None) option = self.options.get(choice, None)
has_navi_option = self.footer_type in self.NAVI_OPTIONS has_navi_option = self.footer_type in self.NAVI_OPTIONS
user_navigated = choice.lower() in self.NAVI_OPTIONS[self.footer_type] user_navigated = choice in self.NAVI_OPTIONS[self.footer_type]
if has_navi_option and user_navigated: if has_navi_option and user_navigated:
return choice return choice
@@ -163,7 +164,9 @@ class BaseMenu(ABC):
option = self.options.get(choice, None) option = self.options.get(choice, None)
if isinstance(option, type) and issubclass(option, BaseMenu): if isinstance(option, type) and issubclass(option, BaseMenu):
self.navigate_to_submenu(option) self.navigate_to_menu(option, True)
elif isinstance(option, BaseMenu):
self.navigate_to_menu(option, False)
elif callable(option): elif callable(option):
option(opt_index=choice) option(opt_index=choice)
elif option is None: elif option is None:
@@ -173,7 +176,14 @@ class BaseMenu(ABC):
f"Type {type(option)} of option {choice} not of type BaseMenu or Method" f"Type {type(option)} of option {choice} not of type BaseMenu or Method"
) )
def navigate_to_submenu(self, submenu_class) -> None: def navigate_to_menu(self, menu, instantiate: bool) -> None:
submenu = submenu_class() """
submenu.previous_menu = self Method for handling the actual menu switch. Can either take in a menu type or an already
submenu.start() instantiated menu class. Use instantiated menu classes only if the menu requires specific input parameters
:param menu: A menu type or menu instance
:param instantiate: Specify if the menu requires instantiation
:return: None
"""
menu = menu() if instantiate else menu
menu.previous_menu = self
menu.start()