diff --git a/kiauh/core/menus/repo_select_menu.py b/kiauh/core/menus/repo_select_menu.py index afe0e6c..25772f7 100644 --- a/kiauh/core/menus/repo_select_menu.py +++ b/kiauh/core/menus/repo_select_menu.py @@ -10,14 +10,17 @@ from __future__ import annotations from typing import List, Literal, Type -from core.logger import Logger +from core.logger import Logger, DialogType from core.menus import Option from core.menus.base_menu import BaseMenu from core.settings.kiauh_settings import KiauhSettings, Repository from core.types.color import Color from procedures.switch_repo import run_switch_repo_routine +from utils.input_utils import get_string_input, get_number_input, get_confirm +# noinspection PyUnusedLocal +# noinspection PyMethodMayBeStatic class RepoSelectMenu(BaseMenu): def __init__( self, @@ -48,26 +51,27 @@ class RepoSelectMenu(BaseMenu): def set_options(self) -> None: self.options = {} - - if not self.repos: - return - - for idx, repo in enumerate(self.repos, start=1): - self.options[str(idx)] = Option( - method=self.select_repository, opt_data=repo - ) + if self.repos: + for idx, repo in enumerate(self.repos, start=1): + self.options[str(idx)] = Option( + method=self.select_repository, opt_data=repo + ) + self.options["a"] = Option(method=self.add_repository) + self.options["r"] = Option(method=self.remove_repository) + self.options["b"] = Option(method=self.go_back) def print_menu(self) -> None: menu = "╟───────────────────────────────────────────────────────╢\n" menu += "║ Available Repositories: ║\n" menu += "╟───────────────────────────────────────────────────────╢\n" - for idx, repo in enumerate(self.repos, start=1): url = f"● Repo: {repo.url.replace('.git', '')}" branch = f"└► Branch: {repo.branch}" menu += f"║ {idx}) {Color.apply(url, Color.CYAN):<59} ║\n" menu += f"║ {Color.apply(branch, Color.CYAN):<59} ║\n" - + menu += "╟───────────────────────────────────────────────────────╢\n" + menu += "║ A) Add repository ║\n" + menu += "║ R) Remove repository ║\n" menu += "╟───────────────────────────────────────────────────────╢\n" print(menu, end="") @@ -77,3 +81,82 @@ class RepoSelectMenu(BaseMenu): f"Switching to {self.name.capitalize()}'s new source repository ..." ) run_switch_repo_routine(self.name, repo.url, repo.branch) + + def add_repository(self, **kwargs) -> None: + while True: + Logger.print_dialog( + DialogType.CUSTOM, + custom_title="Enter the repository URL", + content=[ + "NOTE: There is no input validation in place, " + "please check your input for correctness", + ], + ) + url = get_string_input("Repository URL", allow_special_chars=True).strip() + + Logger.print_dialog( + DialogType.CUSTOM, + custom_title="Enter the branch name", + content=[ "Press Enter to use the default branch (master)." ], + center_content=False, + ) + branch = get_string_input("Branch", allow_special_chars=True, default="master").strip() + Logger.print_dialog( + DialogType.CUSTOM, + custom_title="Summary", + content=[ + f"● URL: {url}", + f"● Branch: {branch}", + ], + ) + confirm = get_confirm("Save repository") + if confirm: + repo = Repository(url, branch) + if self.name == "klipper": + self.settings.klipper.repositories.append(repo) + self.settings.save() + self.repos = self.settings.klipper.repositories + else: + self.settings.moonraker.repositories.append(repo) + self.settings.save() + self.repos = self.settings.moonraker.repositories + Logger.print_ok("Repository added and saved.") + + # Refresh menu to show new repo immediately and update options + self.set_options() + self.run() + break + else: + Logger.print_info("Operation cancelled by user.") + break + + def remove_repository(self, **kwargs) -> None: + repos = self.repos + if not repos: + Logger.print_info("No repositories configured.") + return + repo_lines = [f"{idx}) {repo.url} [{repo.branch}]" for idx, repo in enumerate(repos, start=1)] + Logger.print_dialog( + DialogType.CUSTOM, + custom_title="Available Repositories", + content=[*repo_lines], + ) + idx = get_number_input("Select the repository to remove", 1, len(repos)) + removed = repos.pop(idx - 1) + if self.name == "klipper": + self.settings.klipper.repositories = repos + self.settings.save() + self.repos = self.settings.klipper.repositories + else: + self.settings.moonraker.repositories = repos + self.settings.save() + self.repos = self.settings.moonraker.repositories + Logger.print_ok(f"Removed repository: {removed.url} [{removed.branch}]") + + # Refresh menu to show updated repo list and options + self.set_options() + self.run() + + def go_back(self, **kwargs) -> None: + from core.menus.settings_menu import SettingsMenu + SettingsMenu().run() diff --git a/kiauh/core/menus/settings_menu.py b/kiauh/core/menus/settings_menu.py index e4559bb..a486315 100644 --- a/kiauh/core/menus/settings_menu.py +++ b/kiauh/core/menus/settings_menu.py @@ -117,20 +117,12 @@ class SettingsMenu(BaseMenu): ) def switch_klipper_repo(self, **kwargs) -> None: - name = "Klipper" repos = self.settings.klipper.repositories - if not repos: - self._warn_no_repos(name) - return - RepoSelectMenu(name.lower(), repos=repos, previous_menu=self.__class__).run() + RepoSelectMenu("klipper", repos=repos, previous_menu=self.__class__).run() def switch_moonraker_repo(self, **kwargs) -> None: - name = "Moonraker" repos = self.settings.moonraker.repositories - if not repos: - self._warn_no_repos(name) - return - RepoSelectMenu(name.lower(), repos=repos, previous_menu=self.__class__).run() + RepoSelectMenu("moonraker", repos=repos, previous_menu=self.__class__).run() def toggle_mainsail_release(self, **kwargs) -> None: self.mainsail_unstable = not self.mainsail_unstable