mirror of
https://github.com/dw-0/kiauh.git
synced 2025-12-23 15:53:36 +05:00
refactor(kiauh): allow menus to link options to letters
Signed-off-by: Dominik Willner <th33xitus@gmail.com>
This commit is contained in:
@@ -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,
|
||||
)
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
@@ -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} |
|
||||
"""
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user