refactor(kiauh): allow menus to link options to letters

Signed-off-by: Dominik Willner <th33xitus@gmail.com>
This commit is contained in:
dw-0
2024-02-05 21:57:19 +01:00
parent 7cb2231584
commit 0447bc4405
8 changed files with 85 additions and 88 deletions

View File

@@ -23,12 +23,12 @@ class KlipperRemoveMenu(BaseMenu):
super().__init__( super().__init__(
header=False, header=False,
options={ options={
0: self.toggle_all, "0": self.toggle_all,
1: self.toggle_remove_klipper_service, "1": self.toggle_remove_klipper_service,
2: self.toggle_remove_klipper_dir, "2": self.toggle_remove_klipper_dir,
3: self.toggle_remove_klipper_env, "3": self.toggle_remove_klipper_env,
4: self.toggle_delete_klipper_logs, "4": self.toggle_delete_klipper_logs,
5: self.run_removal_process, "5": self.run_removal_process,
}, },
footer_type=BACK_HELP_FOOTER, footer_type=BACK_HELP_FOOTER,
) )

View File

@@ -23,13 +23,13 @@ class MainsailRemoveMenu(BaseMenu):
super().__init__( super().__init__(
header=False, header=False,
options={ options={
0: self.toggle_all, "0": self.toggle_all,
1: self.toggle_remove_mainsail, "1": self.toggle_remove_mainsail,
2: self.toggle_remove_ms_config, "2": self.toggle_remove_ms_config,
3: self.toggle_backup_config_json, "3": self.toggle_backup_config_json,
4: self.toggle_remove_updater_section, "4": self.toggle_remove_updater_section,
5: self.toggle_remove_printer_cfg_include, "5": self.toggle_remove_printer_cfg_include,
6: self.run_removal_process, "6": self.run_removal_process,
}, },
footer_type=BACK_HELP_FOOTER, footer_type=BACK_HELP_FOOTER,
) )

View File

@@ -23,13 +23,13 @@ class MoonrakerRemoveMenu(BaseMenu):
super().__init__( super().__init__(
header=False, header=False,
options={ options={
0: self.toggle_all, "0": self.toggle_all,
1: self.toggle_remove_moonraker_service, "1": self.toggle_remove_moonraker_service,
2: self.toggle_remove_moonraker_dir, "2": self.toggle_remove_moonraker_dir,
3: self.toggle_remove_moonraker_env, "3": self.toggle_remove_moonraker_env,
4: self.toggle_remove_moonraker_polkit, "4": self.toggle_remove_moonraker_polkit,
5: self.toggle_delete_moonraker_logs, "5": self.toggle_delete_moonraker_logs,
6: self.run_removal_process, "6": self.run_removal_process,
}, },
footer_type=BACK_HELP_FOOTER, footer_type=BACK_HELP_FOOTER,
) )

View File

@@ -13,7 +13,7 @@ import subprocess
import sys import sys
import textwrap import textwrap
from abc import abstractmethod, ABC from abc import abstractmethod, ABC
from typing import Dict, Any, Literal from typing import Dict, Any, Literal, Union, Callable, Type
from kiauh.core.menus import QUIT_FOOTER, BACK_FOOTER, BACK_HELP_FOOTER from kiauh.core.menus import QUIT_FOOTER, BACK_FOOTER, BACK_HELP_FOOTER
from kiauh.utils.constants import ( from kiauh.utils.constants import (
@@ -97,7 +97,7 @@ class BaseMenu(ABC):
def __init__( def __init__(
self, self,
options: Dict[int, Any], options: Dict[str, Union[Callable, Type["BaseMenu"]]],
options_offset: int = 0, options_offset: int = 0,
header: bool = True, header: bool = True,
footer_type: Literal[ footer_type: Literal[
@@ -110,10 +110,10 @@ class BaseMenu(ABC):
self.footer_type = footer_type self.footer_type = footer_type
@abstractmethod @abstractmethod
def print_menu(self): def print_menu(self) -> None:
raise NotImplementedError("Subclasses must implement the print_menu method") raise NotImplementedError("Subclasses must implement the print_menu method")
def print_footer(self): def print_footer(self) -> None:
footer_type_map = { footer_type_map = {
QUIT_FOOTER: print_quit_footer, QUIT_FOOTER: print_quit_footer,
BACK_FOOTER: print_back_footer, BACK_FOOTER: print_back_footer,
@@ -122,33 +122,29 @@ class BaseMenu(ABC):
footer_function = footer_type_map.get(self.footer_type, print_quit_footer) footer_function = footer_type_map.get(self.footer_type, print_quit_footer)
footer_function() footer_function()
def display(self): def display(self) -> None:
# clear() # clear()
if self.header: if self.header:
print_header() print_header()
self.print_menu() self.print_menu()
self.print_footer() self.print_footer()
def handle_user_input(self): 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}")
option = self.options.get(choice, None)
if choice.isdigit() and 0 <= int(choice) < len(self.options): has_navi_option = self.footer_type in self.NAVI_OPTIONS
user_navigated = choice.lower() in self.NAVI_OPTIONS[self.footer_type]
if has_navi_option and user_navigated:
return choice return choice
elif choice.isalpha() and (
self.footer_type in self.NAVI_OPTIONS if option is not None:
and choice.lower() in self.NAVI_OPTIONS[self.footer_type]
):
return choice return choice
else: else:
error_msg = ( Logger.print_error("Invalid input!", False)
"Invalid input!"
if choice.isalpha() or (not self.options and len(self.options) < 1)
else f"Invalid input! Select a number between {min(self.options)} and {max(self.options)}."
)
Logger.print_error(error_msg, False)
def start(self): def start(self) -> None:
while True: while True:
self.display() self.display()
choice = self.handle_user_input() choice = self.handle_user_input()
@@ -158,12 +154,12 @@ class BaseMenu(ABC):
sys.exit(0) sys.exit(0)
elif choice == "b": elif choice == "b":
return return
elif choice == "p": elif choice == "h":
print("help!") print("help!")
else: else:
self.execute_option(int(choice)) self.execute_option(choice)
def execute_option(self, choice): def execute_option(self, choice: str) -> None:
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):
@@ -177,7 +173,7 @@ 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): def navigate_to_submenu(self, submenu_class) -> None:
submenu = submenu_class() submenu = submenu_class()
submenu.previous_menu = self submenu.previous_menu = self
submenu.start() submenu.start()

View File

@@ -26,17 +26,17 @@ class InstallMenu(BaseMenu):
super().__init__( super().__init__(
header=True, header=True,
options={ options={
1: self.install_klipper, "1": self.install_klipper,
2: self.install_moonraker, "2": self.install_moonraker,
3: self.install_mainsail, "3": self.install_mainsail,
4: self.install_fluidd, "4": self.install_fluidd,
5: self.install_klipperscreen, "5": self.install_klipperscreen,
6: self.install_pretty_gcode, "6": self.install_pretty_gcode,
7: self.install_telegram_bot, "7": self.install_telegram_bot,
8: self.install_obico, "8": self.install_obico,
9: self.install_octoeverywhere, "9": self.install_octoeverywhere,
10: self.install_mobileraker, "10": self.install_mobileraker,
11: self.install_crowsnest, "11": self.install_crowsnest,
}, },
footer_type=BACK_FOOTER, footer_type=BACK_FOOTER,
) )

View File

@@ -37,13 +37,14 @@ class MainMenu(BaseMenu):
super().__init__( super().__init__(
header=True, header=True,
options={ options={
0: LogUploadMenu, "0": LogUploadMenu,
1: InstallMenu, "1": InstallMenu,
2: UpdateMenu, "2": UpdateMenu,
3: RemoveMenu, "3": RemoveMenu,
4: AdvancedMenu, "4": AdvancedMenu,
5: None, "5": None,
6: SettingsMenu, "e": None,
"s": SettingsMenu,
}, },
footer_type=QUIT_FOOTER, footer_type=QUIT_FOOTER,
) )
@@ -113,13 +114,13 @@ class MainMenu(BaseMenu):
| 4) [Advanced] |------------------------------------| | 4) [Advanced] |------------------------------------|
| 5) [Backup] | Mainsail: {self.ms_status:<26} | | 5) [Backup] | Mainsail: {self.ms_status:<26} |
| | Fluidd: {self.fl_status:<26} | | | Fluidd: {self.fl_status:<26} |
| 6) [Settings] | KlipperScreen: {self.ks_status:<26} | | E) [Extensions] | KlipperScreen: {self.ks_status:<26} |
| | Mobileraker: {self.mb_status:<26} | | | Mobileraker: {self.mb_status:<26} |
| | | | | |
| | Crowsnest: {self.cn_status:<26} | | | Crowsnest: {self.cn_status:<26} |
| | Telegram Bot: {self.tg_status:<26} | | | Telegram Bot: {self.tg_status:<26} |
| | Obico: {self.ob_status:<26} | | | Obico: {self.ob_status:<26} |
| | OctoEverywhere: {self.oe_status:<26} | | S) [Settings] | OctoEverywhere: {self.oe_status:<26} |
|-------------------------------------------------------| |-------------------------------------------------------|
| {COLOR_CYAN}{footer1:^16}{RESET_FORMAT} | {footer2:^43} | | {COLOR_CYAN}{footer1:^16}{RESET_FORMAT} | {footer2:^43} |
""" """

View File

@@ -26,19 +26,19 @@ class RemoveMenu(BaseMenu):
super().__init__( super().__init__(
header=True, header=True,
options={ options={
1: KlipperRemoveMenu, "1": KlipperRemoveMenu,
2: MoonrakerRemoveMenu, "2": MoonrakerRemoveMenu,
3: MainsailRemoveMenu, "3": MainsailRemoveMenu,
5: self.remove_fluidd, "5": self.remove_fluidd,
6: self.remove_klipperscreen, "6": self.remove_klipperscreen,
7: self.remove_crowsnest, "7": self.remove_crowsnest,
8: self.remove_mjpgstreamer, "8": self.remove_mjpgstreamer,
9: self.remove_pretty_gcode, "9": self.remove_pretty_gcode,
10: self.remove_telegram_bot, "10": self.remove_telegram_bot,
11: self.remove_obico, "11": self.remove_obico,
12: self.remove_octoeverywhere, "12": self.remove_octoeverywhere,
13: self.remove_mobileraker, "13": self.remove_mobileraker,
14: self.remove_nginx, "14": self.remove_nginx,
}, },
footer_type=BACK_FOOTER, footer_type=BACK_FOOTER,
) )

View File

@@ -34,19 +34,19 @@ class UpdateMenu(BaseMenu):
super().__init__( super().__init__(
header=True, header=True,
options={ options={
0: self.update_all, "0": self.update_all,
1: self.update_klipper, "1": self.update_klipper,
2: self.update_moonraker, "2": self.update_moonraker,
3: self.update_mainsail, "3": self.update_mainsail,
4: self.update_fluidd, "4": self.update_fluidd,
5: self.update_klipperscreen, "5": self.update_klipperscreen,
6: self.update_pgc_for_klipper, "6": self.update_pgc_for_klipper,
7: self.update_telegram_bot, "7": self.update_telegram_bot,
8: self.update_moonraker_obico, "8": self.update_moonraker_obico,
9: self.update_octoeverywhere, "9": self.update_octoeverywhere,
10: self.update_mobileraker, "10": self.update_mobileraker,
11: self.update_crowsnest, "11": self.update_crowsnest,
12: self.upgrade_system_packages, "12": self.upgrade_system_packages,
}, },
footer_type=BACK_FOOTER, footer_type=BACK_FOOTER,
) )