From c8fd869cc3ddba5ca0c4cf195b4ee644a9a37996 Mon Sep 17 00:00:00 2001 From: Jeckel Date: Sat, 9 Nov 2024 13:09:36 +0100 Subject: [PATCH] Init package manager screen --- src/models/project.py | 4 ++++ src/presentation/__init__.py | 14 ++++++++++- src/presentation/package_manager/__init__.py | 1 + src/presentation/package_manager/screen.py | 25 ++++++++++++++++++++ src/presentation/summary/package_card.py | 3 +-- 5 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 src/presentation/package_manager/__init__.py create mode 100644 src/presentation/package_manager/screen.py diff --git a/src/models/project.py b/src/models/project.py index d949c69..aaf1856 100644 --- a/src/models/project.py +++ b/src/models/project.py @@ -51,3 +51,7 @@ def check_composer_file(self): if os.path.exists(composer_file): self.composer = True return self + + @property + def has_package_managers(self) -> bool: + return self.package_managers is not None and len(self.package_managers) > 0 diff --git a/src/presentation/__init__.py b/src/presentation/__init__.py index 06edcea..e01fc55 100644 --- a/src/presentation/__init__.py +++ b/src/presentation/__init__.py @@ -9,6 +9,7 @@ from .composer import ComposerCommandRequested from .composer.composer_screen import ComposerScreen from .docker import DockerContainer +from .package_manager import PackageManagerScreen from .summary import ProjectSummaryContainer from .component import Sidebar, TerminalModal, NonShellCommand from .summary.summary_screen import SummaryScreen @@ -26,7 +27,11 @@ class MainApp(App[None]): } """ CSS_PATH = "../tcss/layout.tcss" - SCREENS = {"summary": SummaryScreen, "composer": ComposerScreen} + SCREENS = { + "summary": SummaryScreen, + "composer": ComposerScreen, + "packages": PackageManagerScreen, + } _project: Project @@ -34,6 +39,10 @@ def __init__(self): super().__init__() self._project = ServiceLocator.context().current_project self.title = f"DX Companion - {self._project.name}" + if self._project.has_package_managers: + self.bind( + keys="ctrl+u", action="toggle_package_screen", description="Packages" + ) def on_mount(self) -> None: self.push_screen("summary") @@ -44,6 +53,9 @@ def action_toggle_sidebar(self) -> None: except NoMatches: pass + def action_toggle_package_screen(self) -> None: + self.switch_screen("packages") + @on(ComposerCommandRequested) def action_composer_script(self, event: ComposerCommandRequested) -> None: def refresh_composer(result: bool | None): diff --git a/src/presentation/package_manager/__init__.py b/src/presentation/package_manager/__init__.py new file mode 100644 index 0000000..5b72e86 --- /dev/null +++ b/src/presentation/package_manager/__init__.py @@ -0,0 +1 @@ +from .screen import PackageManagerScreen diff --git a/src/presentation/package_manager/screen.py b/src/presentation/package_manager/screen.py new file mode 100644 index 0000000..72aa8ba --- /dev/null +++ b/src/presentation/package_manager/screen.py @@ -0,0 +1,25 @@ +from textual import on +from textual.app import ComposeResult +from textual.events import ScreenResume +from textual.screen import Screen +from textual.widgets import Header, Footer + +from presentation.component.sidebar import Sidebar + + +class PackageManagerScreen(Screen): + BINDINGS = { + ("escape", "return", "Return to project"), + } + + def compose(self) -> ComposeResult: + yield Sidebar(classes="-hidden") + yield Header() + yield Footer() + + def action_return(self): + self.app.switch_screen("summary") + + @on(ScreenResume) + def screen_resume(self): + pass diff --git a/src/presentation/summary/package_card.py b/src/presentation/summary/package_card.py index 3156d30..637b8af 100644 --- a/src/presentation/summary/package_card.py +++ b/src/presentation/summary/package_card.py @@ -6,7 +6,6 @@ from rich.style import Style from rich.table import Table -from presentation import ComposerScreen from service_locator import ServiceLocator from services.package_manager.abstract_package_manager import Package @@ -31,7 +30,7 @@ def compose(self) -> ComposeResult: @on(Button.Pressed, "#toggle_package_screen") def on_composer_manage(self): - self.app.push_screen(ComposerScreen()) + self.app.switch_screen("packages") def refresh_packages(self) -> None: """