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__(
|
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,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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} |
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -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,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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,
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user