diff --git a/kiauh/components/klipper/menus/klipper_remove_menu.py b/kiauh/components/klipper/menus/klipper_remove_menu.py index 379005a..e6a8845 100644 --- a/kiauh/components/klipper/menus/klipper_remove_menu.py +++ b/kiauh/components/klipper/menus/klipper_remove_menu.py @@ -10,7 +10,7 @@ import textwrap from components.klipper import klipper_remove -from core.menus import BACK_HELP_FOOTER +from core.menus import FooterType from core.menus.base_menu import BaseMenu from utils.constants import RESET_FORMAT, COLOR_RED, COLOR_CYAN @@ -18,18 +18,18 @@ from utils.constants import RESET_FORMAT, COLOR_RED, COLOR_CYAN # noinspection PyUnusedLocal class KlipperRemoveMenu(BaseMenu): def __init__(self): - 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, - "c": self.run_removal_process, - }, - footer_type=BACK_HELP_FOOTER, - ) + super().__init__() + self.header = False + self.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, + "c": self.run_removal_process, + } + self.footer_type = FooterType.BACK_HELP + self.remove_klipper_service = False self.remove_klipper_dir = False self.remove_klipper_env = False diff --git a/kiauh/components/klipper_firmware/menus/klipper_flash_menu.py b/kiauh/components/klipper_firmware/menus/klipper_flash_menu.py index afad1b6..cd8e9f2 100644 --- a/kiauh/components/klipper_firmware/menus/klipper_flash_menu.py +++ b/kiauh/components/klipper_firmware/menus/klipper_flash_menu.py @@ -21,7 +21,7 @@ from components.klipper_firmware.flash_utils import ( find_usb_dfu_device, flash_device, ) -from core.menus import BACK_HELP_FOOTER, BACK_FOOTER +from core.menus import FooterType from core.menus.base_menu import BaseMenu from utils.constants import COLOR_CYAN, RESET_FORMAT, COLOR_YELLOW, COLOR_RED @@ -33,17 +33,17 @@ from utils.logger import Logger # noinspection PyMethodMayBeStatic class KlipperFlashMethodMenu(BaseMenu): def __init__(self): + super().__init__() + self.header = False + self.options = { + "1": self.select_regular, + "2": self.select_sdcard, + "h": KlipperFlashMethodHelpMenu, + } + self.input_label_txt = "Select flash method" + self.footer_type = FooterType.BACK_HELP + self.flash_options = FlashOptions() - super().__init__( - header=False, - options={ - "1": self.select_regular, - "2": self.select_sdcard, - "h": KlipperFlashMethodHelpMenu, - }, - input_label_txt="Select flash method", - footer_type=BACK_HELP_FOOTER, - ) def print_menu(self) -> None: header = " [ Flash MCU ] " @@ -76,26 +76,26 @@ class KlipperFlashMethodMenu(BaseMenu): def goto_next_menu(self, **kwargs): next_menu = KlipperFlashCommandMenu(previous_menu=self) - next_menu.start() + next_menu.run() # noinspection PyUnusedLocal # noinspection PyMethodMayBeStatic class KlipperFlashCommandMenu(BaseMenu): def __init__(self, previous_menu: BaseMenu): + super().__init__() + self.header = False + self.options = { + "1": self.select_flash, + "2": self.select_serialflash, + "h": KlipperFlashCommandHelpMenu, + } + self.default_option = self.select_flash + self.input_label_txt = "Select flash command" + self.previous_menu = previous_menu + self.footer_type = FooterType.BACK_HELP + self.flash_options = FlashOptions() - super().__init__( - header=False, - options={ - "1": self.select_flash, - "2": self.select_serialflash, - "h": KlipperFlashCommandHelpMenu, - }, - default_option="1", - input_label_txt="Select flash command", - previous_menu=previous_menu, - footer_type=BACK_HELP_FOOTER, - ) def print_menu(self) -> None: menu = textwrap.dedent( @@ -120,26 +120,26 @@ class KlipperFlashCommandMenu(BaseMenu): def goto_next_menu(self, **kwargs): next_menu = KlipperSelectMcuConnectionMenu(previous_menu=self) - next_menu.start() + next_menu.run() # noinspection PyUnusedLocal # noinspection PyMethodMayBeStatic class KlipperSelectMcuConnectionMenu(BaseMenu): def __init__(self, previous_menu: BaseMenu): + super().__init__() + self.header = False + self.options = { + "1": self.select_usb, + "2": self.select_dfu, + "3": self.select_usb_dfu, + "h": KlipperMcuConnectionHelpMenu, + } + self.input_label_txt = "Select connection type" + self.previous_menu = previous_menu + self.footer_type = FooterType.BACK_HELP + self.flash_options = FlashOptions() - super().__init__( - header=False, - options={ - "1": self.select_usb, - "2": self.select_dfu, - "3": self.select_usb_dfu, - "h": KlipperMcuConnectionHelpMenu, - }, - input_label_txt="Select connection type", - previous_menu=previous_menu, - footer_type=BACK_HELP_FOOTER, - ) def print_menu(self) -> None: header = "Make sure that the controller board is connected now!" @@ -193,23 +193,22 @@ class KlipperSelectMcuConnectionMenu(BaseMenu): def goto_next_menu(self, **kwargs): next_menu = KlipperSelectMcuIdMenu(previous_menu=self) - next_menu.start() + next_menu.run() # noinspection PyUnusedLocal # noinspection PyMethodMayBeStatic class KlipperSelectMcuIdMenu(BaseMenu): def __init__(self, previous_menu: BaseMenu): + super().__init__() + self.header = False self.flash_options = FlashOptions() self.mcu_list = self.flash_options.mcu_list options = {f"{index}": self.flash_mcu for index in range(len(self.mcu_list))} - super().__init__( - header=False, - options=options, - input_label_txt="Select MCU to flash", - previous_menu=previous_menu, - footer_type=BACK_FOOTER, - ) + self.options = options + self.input_label_txt = "Select MCU to flash" + self.previous_menu = previous_menu + self.footer_type = FooterType.BACK_HELP def print_menu(self) -> None: header = "!!! ATTENTION !!!" @@ -262,11 +261,8 @@ class KlipperSelectMcuIdMenu(BaseMenu): class KlipperFlashMethodHelpMenu(BaseMenu): def __init__(self): - super().__init__( - header=False, - options={}, - footer_type=BACK_FOOTER, - ) + super().__init__() + self.header = False def print_menu(self) -> None: header = " < ? > Help: Flash MCU < ? > " @@ -309,11 +305,8 @@ class KlipperFlashMethodHelpMenu(BaseMenu): class KlipperFlashCommandHelpMenu(BaseMenu): def __init__(self): - super().__init__( - header=False, - options={}, - footer_type=BACK_FOOTER, - ) + super().__init__() + self.header = False def print_menu(self) -> None: header = " < ? > Help: Flash MCU < ? > " @@ -343,11 +336,8 @@ class KlipperFlashCommandHelpMenu(BaseMenu): class KlipperMcuConnectionHelpMenu(BaseMenu): def __init__(self): - super().__init__( - header=False, - options={}, - footer_type=BACK_FOOTER, - ) + super().__init__() + self.header = False def print_menu(self) -> None: header = " < ? > Help: Flash MCU < ? > " diff --git a/kiauh/components/log_uploads/menus/log_upload_menu.py b/kiauh/components/log_uploads/menus/log_upload_menu.py index f477594..d2a1169 100644 --- a/kiauh/components/log_uploads/menus/log_upload_menu.py +++ b/kiauh/components/log_uploads/menus/log_upload_menu.py @@ -11,7 +11,6 @@ import textwrap from components.log_uploads.log_upload_utils import get_logfile_list from components.log_uploads.log_upload_utils import upload_logfile -from core.menus import BACK_FOOTER from core.menus.base_menu import BaseMenu from utils.constants import RESET_FORMAT, COLOR_YELLOW @@ -19,13 +18,11 @@ from utils.constants import RESET_FORMAT, COLOR_YELLOW # noinspection PyMethodMayBeStatic class LogUploadMenu(BaseMenu): def __init__(self): + super().__init__() + self.header = True self.logfile_list = get_logfile_list() options = {f"{index}": self.upload for index in range(len(self.logfile_list))} - super().__init__( - header=True, - options=options, - footer_type=BACK_FOOTER, - ) + self.options = options def print_menu(self): header = " [ Log Upload ] " diff --git a/kiauh/components/moonraker/menus/moonraker_remove_menu.py b/kiauh/components/moonraker/menus/moonraker_remove_menu.py index 607d04e..4281f15 100644 --- a/kiauh/components/moonraker/menus/moonraker_remove_menu.py +++ b/kiauh/components/moonraker/menus/moonraker_remove_menu.py @@ -10,7 +10,6 @@ import textwrap from components.moonraker import moonraker_remove -from core.menus import BACK_HELP_FOOTER from core.menus.base_menu import BaseMenu from utils.constants import RESET_FORMAT, COLOR_RED, COLOR_CYAN @@ -18,19 +17,18 @@ from utils.constants import RESET_FORMAT, COLOR_RED, COLOR_CYAN # noinspection PyUnusedLocal class MoonrakerRemoveMenu(BaseMenu): def __init__(self): - 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, - "c": self.run_removal_process, - }, - footer_type=BACK_HELP_FOOTER, - ) + super().__init__() + self.header = False + self.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, + "c": self.run_removal_process, + } + self.remove_moonraker_service = False self.remove_moonraker_dir = False self.remove_moonraker_env = False diff --git a/kiauh/components/webui_client/menus/client_remove_menu.py b/kiauh/components/webui_client/menus/client_remove_menu.py index 6cf5638..db9198a 100644 --- a/kiauh/components/webui_client/menus/client_remove_menu.py +++ b/kiauh/components/webui_client/menus/client_remove_menu.py @@ -11,7 +11,6 @@ import textwrap from typing import Callable, Dict from components.webui_client import client_remove, ClientData -from core.menus import BACK_HELP_FOOTER from core.menus.base_menu import BaseMenu from utils.constants import RESET_FORMAT, COLOR_RED, COLOR_CYAN @@ -19,25 +18,23 @@ from utils.constants import RESET_FORMAT, COLOR_RED, COLOR_CYAN # noinspection PyUnusedLocal class ClientRemoveMenu(BaseMenu): def __init__(self, client: ClientData): + super().__init__() + self.header = False + self.options = self.get_options(client) + self.client = client self.rm_client = False self.rm_client_config = False self.backup_mainsail_config_json = False - super().__init__( - header=False, - options=self.get_options(), - footer_type=BACK_HELP_FOOTER, - ) - - def get_options(self) -> Dict[str, Callable]: + def get_options(self, client: ClientData) -> Dict[str, Callable]: options = { "0": self.toggle_all, "1": self.toggle_rm_client, "2": self.toggle_rm_client_config, "c": self.run_removal_process, } - if self.client.get("name") == "mainsail": + if client.get("name") == "mainsail": options["3"] = self.toggle_backup_mainsail_config_json return options diff --git a/kiauh/core/menus/__init__.py b/kiauh/core/menus/__init__.py index 14f4f7b..332135d 100644 --- a/kiauh/core/menus/__init__.py +++ b/kiauh/core/menus/__init__.py @@ -7,6 +7,17 @@ # This file may be distributed under the terms of the GNU GPLv3 license # # ======================================================================= # -QUIT_FOOTER = "quit" -BACK_FOOTER = "back" -BACK_HELP_FOOTER = "back_help" +from enum import Enum + + +class FooterType(Enum): + QUIT = "QUIT" + BACK = "BACK" + BACK_HELP = "BACK_HELP" + + +NAVI_OPTIONS = { + FooterType.QUIT: ["q"], + FooterType.BACK: ["b"], + FooterType.BACK_HELP: ["b", "h"], +} diff --git a/kiauh/core/menus/advanced_menu.py b/kiauh/core/menus/advanced_menu.py index 66d9be1..4b3e776 100644 --- a/kiauh/core/menus/advanced_menu.py +++ b/kiauh/core/menus/advanced_menu.py @@ -9,26 +9,25 @@ import textwrap -from components.klipper_firmware.menus.klipper_flash_menu import KlipperFlashMethodMenu -from core.menus import BACK_FOOTER +from components.klipper_firmware.menus.klipper_flash_menu import ( + KlipperFlashMethodMenu, + KlipperSelectMcuConnectionMenu, +) from core.menus.base_menu import BaseMenu from utils.constants import COLOR_YELLOW, RESET_FORMAT class AdvancedMenu(BaseMenu): def __init__(self): - super().__init__( - header=True, - options={ - "1": None, - "2": None, - "3": None, - "4": KlipperFlashMethodMenu, - "5": None, - "6": None, - }, - footer_type=BACK_FOOTER, - ) + super().__init__() + self.options = { + "1": None, + "2": None, + "3": None, + "4": KlipperFlashMethodMenu, + "5": None, + "6": KlipperSelectMcuConnectionMenu, + } def print_menu(self): header = " [ Advanced Menu ] " diff --git a/kiauh/core/menus/backup_menu.py b/kiauh/core/menus/backup_menu.py index 4f404a7..ac416fe 100644 --- a/kiauh/core/menus/backup_menu.py +++ b/kiauh/core/menus/backup_menu.py @@ -19,7 +19,6 @@ from components.webui_client.client_utils import ( load_client_data, backup_client_config_data, ) -from core.menus import BACK_FOOTER from core.menus.base_menu import BaseMenu from utils.common import backup_printer_config_dir from utils.constants import COLOR_CYAN, RESET_FORMAT, COLOR_YELLOW @@ -29,21 +28,18 @@ from utils.constants import COLOR_CYAN, RESET_FORMAT, COLOR_YELLOW # noinspection PyMethodMayBeStatic class BackupMenu(BaseMenu): def __init__(self): - super().__init__( - header=True, - options={ - "1": self.backup_klipper, - "2": self.backup_moonraker, - "3": self.backup_printer_config, - "4": self.backup_moonraker_db, - "5": self.backup_mainsail, - "6": self.backup_fluidd, - "7": self.backup_mainsail_config, - "8": self.backup_fluidd_config, - "9": self.backup_klipperscreen, - }, - footer_type=BACK_FOOTER, - ) + super().__init__() + self.options = { + "1": self.backup_klipper, + "2": self.backup_moonraker, + "3": self.backup_printer_config, + "4": self.backup_moonraker_db, + "5": self.backup_mainsail, + "6": self.backup_fluidd, + "7": self.backup_mainsail_config, + "8": self.backup_fluidd_config, + "9": self.backup_klipperscreen, + } def print_menu(self): header = " [ Backup Menu ] " diff --git a/kiauh/core/menus/base_menu.py b/kiauh/core/menus/base_menu.py index 78c31cc..84916fb 100644 --- a/kiauh/core/menus/base_menu.py +++ b/kiauh/core/menus/base_menu.py @@ -13,9 +13,9 @@ import subprocess import sys import textwrap from abc import abstractmethod, ABC -from typing import Dict, Any, Literal, Union, Callable +from typing import Dict, Union, Callable, Type -from core.menus import QUIT_FOOTER, BACK_FOOTER, BACK_HELP_FOOTER +from core.menus import FooterType, NAVI_OPTIONS from utils.constants import ( COLOR_GREEN, COLOR_YELLOW, @@ -92,74 +92,86 @@ def print_back_help_footer(): print(footer, end="") -class BaseMenu(ABC): - NAVI_OPTIONS = {"quit": ["q"], "back": ["b"], "back_help": ["b", "h"]} +Option = Union[Callable, Type["BaseMenu"], "BaseMenu"] +Options = Dict[str, Option] - def __init__( - self, - options: Dict[str, Union[Callable, Any]], - options_offset: int = 0, - default_option: Union[str, None] = None, - input_label_txt: Union[str, None] = None, - header: bool = True, - previous_menu: BaseMenu = None, - footer_type: Literal[ - "QUIT_FOOTER", "BACK_FOOTER", "BACK_HELP_FOOTER" - ] = QUIT_FOOTER, - ): - self.previous_menu = previous_menu - self.options = options - self.default_option = default_option - self.options_offset = options_offset - self.input_label_txt = input_label_txt - self.header = header - self.footer_type = footer_type + +class BaseMenu(ABC): + options: Options = None + options_offset: int = 0 + default_option: Union[Option, None] = None + input_label_txt: str = "Perform action" + header: bool = True + previous_menu: Union[Type[BaseMenu], BaseMenu] = None + footer_type: FooterType = FooterType.BACK + + def __init__(self): + if type(self) is BaseMenu: + raise NotImplementedError("BaseMenu cannot be instantiated directly.") @abstractmethod def print_menu(self) -> None: raise NotImplementedError("Subclasses must implement the print_menu method") def print_footer(self) -> None: - footer_type_map = { - QUIT_FOOTER: print_quit_footer, - BACK_FOOTER: print_back_footer, - BACK_HELP_FOOTER: print_back_help_footer, - } - footer_function = footer_type_map.get(self.footer_type, print_quit_footer) - footer_function() + if self.footer_type is FooterType.QUIT: + print_quit_footer() + elif self.footer_type is FooterType.BACK: + print_back_footer() + elif self.footer_type is FooterType.BACK_HELP: + print_back_help_footer() + else: + raise NotImplementedError("Method for printing footer not implemented.") - def display(self) -> None: + def display_menu(self) -> None: # clear() if self.header: print_header() self.print_menu() self.print_footer() - def handle_user_input(self) -> str: + def validate_user_input(self, usr_input: str) -> Union[Option, str, None]: + """ + Validate the user input and either return an Option, a string or None + :param usr_input: The user input in form of a string + :return: Option, str or None + """ + usr_input = usr_input.lower() + option = self.options.get(usr_input, None) + + # check if usr_input contains a character used for basic navigation, e.g. b, h or q + # and if the current menu has the appropriate footer to allow for that action + is_valid_navigation = self.footer_type in NAVI_OPTIONS + user_navigated = usr_input in NAVI_OPTIONS[self.footer_type] + if is_valid_navigation and user_navigated: + return usr_input + + # if usr_input is None or an empty string, we execute the menues default option if specified + if option is None or option == "" and self.default_option is not None: + return self.default_option + + # user selected a regular option + if option is not None: + return option + + return None + + def handle_user_input(self) -> Union[Option, str]: + """Handle the user input, return the validated input or print an error.""" while True: - label_text = ( - "Perform action" - if self.input_label_txt is None or self.input_label_txt == "" - else self.input_label_txt - ) - choice = input(f"{COLOR_CYAN}###### {label_text}: {RESET_FORMAT}").lower() - option = self.options.get(choice, None) + print(f"{COLOR_CYAN}###### {self.input_label_txt}: {RESET_FORMAT}", end="") + usr_input = input().lower() + validated_input = self.validate_user_input(usr_input) - has_navi_option = self.footer_type in self.NAVI_OPTIONS - user_navigated = choice in self.NAVI_OPTIONS[self.footer_type] - if has_navi_option and user_navigated: - return choice - - if option is not None: - return choice - elif option is None and self.default_option is not None: - return self.default_option + if validated_input is not None: + return validated_input else: Logger.print_error("Invalid input!", False) - def start(self) -> None: + def run(self) -> None: + """Start the menu lifecycle. When this function returns, the lifecycle of the menu ends.""" while True: - self.display() + self.display_menu() choice = self.handle_user_input() if choice == "q": @@ -170,21 +182,16 @@ class BaseMenu(ABC): else: self.execute_option(choice) - def execute_option(self, choice: str) -> None: - option = self.options.get(choice, None) + def execute_option(self, option: Option) -> None: + if option is None: + raise NotImplementedError(f"No implementation for {option}") if isinstance(option, type) and issubclass(option, BaseMenu): self.navigate_to_menu(option, True) elif isinstance(option, BaseMenu): self.navigate_to_menu(option, False) elif callable(option): - option(opt_index=choice) - elif option is None: - raise NotImplementedError(f"No implementation for option {choice}") - else: - raise TypeError( - f"Type {type(option)} of option {choice} not of type BaseMenu or Method" - ) + option() def navigate_to_menu(self, menu, instantiate: bool) -> None: """ @@ -196,4 +203,4 @@ class BaseMenu(ABC): """ menu = menu() if instantiate else menu menu.previous_menu = self - menu.start() + menu.run() diff --git a/kiauh/core/menus/extensions_menu.py b/kiauh/core/menus/extensions_menu.py index 3db2aea..7562cc4 100644 --- a/kiauh/core/menus/extensions_menu.py +++ b/kiauh/core/menus/extensions_menu.py @@ -12,11 +12,10 @@ import inspect import json import textwrap from pathlib import Path -from typing import List, Dict +from typing import List from core.base_extension import BaseExtension -from core.menus import BACK_FOOTER -from core.menus.base_menu import BaseMenu +from core.menus.base_menu import BaseMenu, Options from utils.constants import RESET_FORMAT, COLOR_CYAN, COLOR_YELLOW @@ -24,12 +23,11 @@ from utils.constants import RESET_FORMAT, COLOR_CYAN, COLOR_YELLOW # noinspection PyMethodMayBeStatic class ExtensionsMenu(BaseMenu): def __init__(self): + super().__init__() + self.header = False + self.options: Options = self.get_options() + self.extensions = self.discover_extensions() - super().__init__( - header=False, - options=self.get_options(), - footer_type=BACK_FOOTER, - ) def discover_extensions(self) -> List[BaseExtension]: extensions = [] @@ -58,8 +56,8 @@ class ExtensionsMenu(BaseMenu): return sorted(extensions, key=lambda ex: ex.metadata.get("index")) - def get_options(self) -> Dict[str, BaseMenu]: - options = {} + def get_options(self) -> Options: + options: Options = {} for extension in self.extensions: index = extension.metadata.get("index") options[f"{index}"] = ExtensionSubmenu(extension) @@ -93,17 +91,16 @@ class ExtensionsMenu(BaseMenu): # noinspection PyMethodMayBeStatic class ExtensionSubmenu(BaseMenu): def __init__(self, extension: BaseExtension): + super().__init__() + self.header = False + self.options = { + "1": extension.install_extension, + "2": extension.remove_extension, + } + self.extension = extension self.extension_name = extension.metadata.get("display_name") self.extension_desc = extension.metadata.get("description") - super().__init__( - header=False, - options={ - "1": extension.install_extension, - "2": extension.remove_extension, - }, - footer_type=BACK_FOOTER, - ) def print_menu(self) -> None: header = f" [ {self.extension_name} ] " diff --git a/kiauh/core/menus/install_menu.py b/kiauh/core/menus/install_menu.py index 6400645..465033f 100644 --- a/kiauh/core/menus/install_menu.py +++ b/kiauh/core/menus/install_menu.py @@ -13,7 +13,7 @@ from components.klipper import klipper_setup from components.moonraker import moonraker_setup from components.webui_client import client_setup from components.webui_client.client_config import client_config_setup -from core.menus import BACK_FOOTER + from core.menus.base_menu import BaseMenu from utils.constants import COLOR_GREEN, RESET_FORMAT @@ -22,21 +22,18 @@ from utils.constants import COLOR_GREEN, RESET_FORMAT # noinspection PyMethodMayBeStatic class InstallMenu(BaseMenu): def __init__(self): - super().__init__( - header=True, - options={ - "1": self.install_klipper, - "2": self.install_moonraker, - "3": self.install_mainsail, - "4": self.install_fluidd, - "5": self.install_mainsail_config, - "6": self.install_fluidd_config, - "7": None, - "8": None, - "9": None, - }, - footer_type=BACK_FOOTER, - ) + super().__init__() + self.options = { + "1": self.install_klipper, + "2": self.install_moonraker, + "3": self.install_mainsail, + "4": self.install_fluidd, + "5": self.install_mainsail_config, + "6": self.install_fluidd_config, + "7": None, + "8": None, + "9": None, + } def print_menu(self): header = " [ Installation Menu ] " diff --git a/kiauh/core/menus/main_menu.py b/kiauh/core/menus/main_menu.py index 5d017e3..d11ef81 100644 --- a/kiauh/core/menus/main_menu.py +++ b/kiauh/core/menus/main_menu.py @@ -17,7 +17,7 @@ from components.webui_client.client_utils import ( load_client_data, get_current_client_config, ) -from core.menus import QUIT_FOOTER +from core.menus import FooterType from core.menus.advanced_menu import AdvancedMenu from core.menus.backup_menu import BackupMenu from core.menus.base_menu import BaseMenu @@ -39,20 +39,19 @@ from utils.constants import ( # noinspection PyMethodMayBeStatic class MainMenu(BaseMenu): def __init__(self): - super().__init__( - header=True, - options={ - "0": LogUploadMenu, - "1": InstallMenu, - "2": UpdateMenu, - "3": RemoveMenu, - "4": AdvancedMenu, - "5": BackupMenu, - "e": ExtensionsMenu, - "s": SettingsMenu, - }, - footer_type=QUIT_FOOTER, - ) + super().__init__() + self.options = { + "0": LogUploadMenu, + "1": InstallMenu, + "2": UpdateMenu, + "3": RemoveMenu, + "4": AdvancedMenu, + "5": BackupMenu, + "e": ExtensionsMenu, + "s": SettingsMenu, + } + self.footer_type = FooterType.QUIT + self.kl_status = "" self.kl_repo = "" self.mr_status = "" diff --git a/kiauh/core/menus/remove_menu.py b/kiauh/core/menus/remove_menu.py index a7b61a4..6ea9810 100644 --- a/kiauh/core/menus/remove_menu.py +++ b/kiauh/core/menus/remove_menu.py @@ -15,7 +15,6 @@ from components.moonraker.menus.moonraker_remove_menu import ( ) from components.webui_client.client_utils import load_client_data from components.webui_client.menus.client_remove_menu import ClientRemoveMenu -from core.menus import BACK_FOOTER from core.menus.base_menu import BaseMenu from utils.constants import COLOR_RED, RESET_FORMAT @@ -24,25 +23,22 @@ from utils.constants import COLOR_RED, RESET_FORMAT # noinspection PyMethodMayBeStatic class RemoveMenu(BaseMenu): def __init__(self): - super().__init__( - header=True, - options={ - "1": KlipperRemoveMenu, - "2": MoonrakerRemoveMenu, - "3": ClientRemoveMenu(client=load_client_data("mainsail")), - "4": ClientRemoveMenu(client=load_client_data("fluidd")), - "5": None, - "6": None, - "7": None, - "8": None, - "9": None, - "10": None, - "11": None, - "12": None, - "13": None, - }, - footer_type=BACK_FOOTER, - ) + super().__init__() + self.options = { + "1": KlipperRemoveMenu, + "2": MoonrakerRemoveMenu, + "3": ClientRemoveMenu(client=load_client_data("mainsail")), + "4": ClientRemoveMenu(client=load_client_data("fluidd")), + "5": None, + "6": None, + "7": None, + "8": None, + "9": None, + "10": None, + "11": None, + "12": None, + "13": None, + } def print_menu(self): header = " [ Remove Menu ] " diff --git a/kiauh/core/menus/settings_menu.py b/kiauh/core/menus/settings_menu.py index c74a384..4cfddc7 100644 --- a/kiauh/core/menus/settings_menu.py +++ b/kiauh/core/menus/settings_menu.py @@ -13,7 +13,7 @@ from core.menus.base_menu import BaseMenu # noinspection PyMethodMayBeStatic class SettingsMenu(BaseMenu): def __init__(self): - super().__init__(header=True, options={}) + super().__init__() def print_menu(self): print("self") diff --git a/kiauh/core/menus/update_menu.py b/kiauh/core/menus/update_menu.py index 7cd944b..724a2e3 100644 --- a/kiauh/core/menus/update_menu.py +++ b/kiauh/core/menus/update_menu.py @@ -25,7 +25,6 @@ from components.webui_client.client_utils import ( load_client_data, get_client_config_status, ) -from core.menus import BACK_FOOTER from core.menus.base_menu import BaseMenu from utils.constants import ( COLOR_GREEN, @@ -40,23 +39,21 @@ from utils.constants import ( # noinspection PyMethodMayBeStatic class UpdateMenu(BaseMenu): def __init__(self): - 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_mainsail_config, - "6": self.update_fluidd_config, - "7": self.update_klipperscreen, - "8": self.update_mobileraker, - "9": self.update_crowsnest, - "10": self.upgrade_system_packages, - }, - footer_type=BACK_FOOTER, - ) + super().__init__() + self.options = { + "0": self.update_all, + "1": self.update_klipper, + "2": self.update_moonraker, + "3": self.update_mainsail, + "4": self.update_fluidd, + "5": self.update_mainsail_config, + "6": self.update_fluidd_config, + "7": self.update_klipperscreen, + "8": self.update_mobileraker, + "9": self.update_crowsnest, + "10": self.upgrade_system_packages, + } + self.kl_local = f"{COLOR_WHITE}{RESET_FORMAT}" self.kl_remote = f"{COLOR_WHITE}{RESET_FORMAT}" self.mr_local = f"{COLOR_WHITE}{RESET_FORMAT}" diff --git a/kiauh/extensions/mainsail_theme_installer/mainsail_theme_installer_extension.py b/kiauh/extensions/mainsail_theme_installer/mainsail_theme_installer_extension.py index 546b6ac..e3e78c9 100644 --- a/kiauh/extensions/mainsail_theme_installer/mainsail_theme_installer_extension.py +++ b/kiauh/extensions/mainsail_theme_installer/mainsail_theme_installer_extension.py @@ -22,7 +22,6 @@ from components.klipper.klipper_dialogs import ( from core.base_extension import BaseExtension from core.instance_manager.base_instance import BaseInstance from core.instance_manager.instance_manager import InstanceManager -from core.menus import BACK_FOOTER from core.menus.base_menu import BaseMenu from core.repo_manager.repo_manager import RepoManager from utils.constants import COLOR_YELLOW, COLOR_CYAN, RESET_FORMAT @@ -44,7 +43,7 @@ class MainsailThemeInstallerExtension(BaseExtension): def install_extension(self, **kwargs) -> None: install_menu = MainsailThemeInstallMenu(self.instances) - install_menu.start() + install_menu.run() def remove_extension(self, **kwargs) -> None: print_instance_overview( @@ -79,14 +78,13 @@ class MainsailThemeInstallMenu(BaseMenu): ) def __init__(self, instances: List[Klipper]): - self.instances = instances + super().__init__() + self.header = False self.themes: List[ThemeData] = self.load_themes() options = {f"{index}": self.install_theme for index in range(len(self.themes))} - super().__init__( - header=False, - options=options, - footer_type=BACK_FOOTER, - ) + self.options = options + + self.instances = instances def print_menu(self) -> None: header = " [ Mainsail Theme Installer ] " diff --git a/kiauh/main.py b/kiauh/main.py index dd6f068..3040ec5 100644 --- a/kiauh/main.py +++ b/kiauh/main.py @@ -13,6 +13,6 @@ from utils.logger import Logger def main(): try: - MainMenu().start() + MainMenu().run() except KeyboardInterrupt: Logger.print_ok("\nHappy printing!\n", prefix=False)