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__(
header=False,
options={
0: self.toggle_all,
1: self.toggle_remove_klipper_service,
2: self.toggle_remove_klipper_dir,
3: self.toggle_remove_klipper_env,
4: self.toggle_delete_klipper_logs,
5: self.run_removal_process,
"0": self.toggle_all,
"1": self.toggle_remove_klipper_service,
"2": self.toggle_remove_klipper_dir,
"3": self.toggle_remove_klipper_env,
"4": self.toggle_delete_klipper_logs,
"5": self.run_removal_process,
},
footer_type=BACK_HELP_FOOTER,
)

View File

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

View File

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

View File

@@ -13,7 +13,7 @@ import subprocess
import sys
import textwrap
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.utils.constants import (
@@ -97,7 +97,7 @@ class BaseMenu(ABC):
def __init__(
self,
options: Dict[int, Any],
options: Dict[str, Union[Callable, Type["BaseMenu"]]],
options_offset: int = 0,
header: bool = True,
footer_type: Literal[
@@ -110,10 +110,10 @@ class BaseMenu(ABC):
self.footer_type = footer_type
@abstractmethod
def print_menu(self):
def print_menu(self) -> None:
raise NotImplementedError("Subclasses must implement the print_menu method")
def print_footer(self):
def print_footer(self) -> None:
footer_type_map = {
QUIT_FOOTER: print_quit_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()
def display(self):
def display(self) -> None:
# clear()
if self.header:
print_header()
self.print_menu()
self.print_footer()
def handle_user_input(self):
def handle_user_input(self) -> str:
while True:
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
elif choice.isalpha() and (
self.footer_type in self.NAVI_OPTIONS
and choice.lower() in self.NAVI_OPTIONS[self.footer_type]
):
if option is not None:
return choice
else:
error_msg = (
"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)
Logger.print_error("Invalid input!", False)
def start(self):
def start(self) -> None:
while True:
self.display()
choice = self.handle_user_input()
@@ -158,12 +154,12 @@ class BaseMenu(ABC):
sys.exit(0)
elif choice == "b":
return
elif choice == "p":
elif choice == "h":
print("help!")
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)
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"
)
def navigate_to_submenu(self, submenu_class):
def navigate_to_submenu(self, submenu_class) -> None:
submenu = submenu_class()
submenu.previous_menu = self
submenu.start()

View File

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

View File

@@ -37,13 +37,14 @@ class MainMenu(BaseMenu):
super().__init__(
header=True,
options={
0: LogUploadMenu,
1: InstallMenu,
2: UpdateMenu,
3: RemoveMenu,
4: AdvancedMenu,
5: None,
6: SettingsMenu,
"0": LogUploadMenu,
"1": InstallMenu,
"2": UpdateMenu,
"3": RemoveMenu,
"4": AdvancedMenu,
"5": None,
"e": None,
"s": SettingsMenu,
},
footer_type=QUIT_FOOTER,
)
@@ -113,13 +114,13 @@ class MainMenu(BaseMenu):
| 4) [Advanced] |------------------------------------|
| 5) [Backup] | Mainsail: {self.ms_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} |
| | |
| | Crowsnest: {self.cn_status:<26} |
| | Telegram Bot: {self.tg_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} |
"""

View File

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

View File

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