From 0afa27bc15760fe2501fbcecaea061d336746917 Mon Sep 17 00:00:00 2001 From: Johannes Kirschbauer Date: Sat, 16 Dec 2023 12:52:10 +0100 Subject: [PATCH] window switcher --- .../clan_vm_manager/__init__.py | 3 +- pkgs/clan-vm-manager/clan_vm_manager/app.py | 67 +++++++++++++++++-- .../clan_vm_manager/interfaces.py | 13 ++++ .../clan_vm_manager/windows/join.py | 35 +++++----- .../clan_vm_manager/windows/overview.py | 11 +-- 5 files changed, 94 insertions(+), 35 deletions(-) create mode 100644 pkgs/clan-vm-manager/clan_vm_manager/interfaces.py diff --git a/pkgs/clan-vm-manager/clan_vm_manager/__init__.py b/pkgs/clan-vm-manager/clan_vm_manager/__init__.py index bb665e118..547865668 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/__init__.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/__init__.py @@ -1,7 +1,6 @@ import argparse -from .windows.join import register_join_parser -from .windows.overview import register_overview_parser, show_overview +from .app import register_overview_parser, show_overview, register_join_parser def main() -> None: diff --git a/pkgs/clan-vm-manager/clan_vm_manager/app.py b/pkgs/clan-vm-manager/clan_vm_manager/app.py index 48b39d21d..a604315ca 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/app.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/app.py @@ -1,21 +1,56 @@ #!/usr/bin/env python3 - - +import argparse +from dataclasses import dataclass import gi - +from typing import Callable, Optional, Type gi.require_version("Gtk", "3.0") from gi.repository import Gio, Gtk - +from clan_cli.clan_uri import ClanURI from .constants import constants +from .windows.join import JoinWindow +from .windows.overview import OverviewWindow +from .interfaces import Callbacks, InitialJoinValues +@dataclass +class ClanWindows(): + join: type[JoinWindow] + overview: type[OverviewWindow] + +@dataclass +class ClanConfig(): + initial_window: str + url: Optional[ClanURI] + class Application(Gtk.Application): - def __init__(self, window: Gtk.ApplicationWindow) -> None: + def __init__(self, windows: ClanWindows, config: ClanConfig) -> None: super().__init__( application_id=constants["APPID"], flags=Gio.ApplicationFlags.FLAGS_NONE ) self.init_style() - self.window = window + self.windows = windows + initial = windows.__dict__[config.initial_window] + + if(issubclass(initial,JoinWindow)): + # see JoinWindow constructor + self.window = initial(initial_values=InitialJoinValues(url=config.url or ""), cbs=Callbacks(show_list=self.show_list, show_join=self.show_join)) + + if(issubclass(initial,OverviewWindow)): + # see OverviewWindow constructor + self.window = initial() + + def show_list(self) -> None: + prev = self.window + self.window = self.windows.__dict__["overview"]() + self.do_activate() + prev.hide() + + + def show_join(self,initial_values: InitialJoinValues) -> None: + prev = self.window + self.window = self.windows.__dict__["join"]() + self.do_activate() + prev.hide() def do_startup(self) -> None: Gtk.Application.do_startup(self) @@ -36,3 +71,23 @@ class Application(Gtk.Application): # screen = Gdk.Screen.get_default() # style_context = Gtk.StyleContext() # style_context.add_provider_for_screen(screen, css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION) + + +def show_join(args: argparse.Namespace) -> None: + print(f"Joining clan {args.clan_uri}") + app = Application(windows=ClanWindows(join=JoinWindow, overview=OverviewWindow), config=ClanConfig(url=args.clan_uri, initial_window="join") ) + return app.run() + + +def register_join_parser(parser: argparse.ArgumentParser) -> None: + parser.add_argument("clan_uri", type=ClanURI, help="clan URI to join") + parser.set_defaults(func=show_join) + + +def show_overview(args: argparse.Namespace) -> None: + app = Application(windows=ClanWindows(join=JoinWindow, overview=OverviewWindow), config=ClanConfig(url=None, initial_window="overview") ) + return app.run() + + +def register_overview_parser(parser: argparse.ArgumentParser) -> None: + parser.set_defaults(func=show_overview) diff --git a/pkgs/clan-vm-manager/clan_vm_manager/interfaces.py b/pkgs/clan-vm-manager/clan_vm_manager/interfaces.py new file mode 100644 index 000000000..14b80194b --- /dev/null +++ b/pkgs/clan-vm-manager/clan_vm_manager/interfaces.py @@ -0,0 +1,13 @@ +from dataclasses import dataclass +from typing import Callable, Optional, Type +from clan_cli.clan_uri import ClanURI + +@dataclass +class InitialJoinValues(): + url: ClanURI + + +@dataclass +class Callbacks(): + show_list: Callable[[],None] + show_join: Callable[[InitialJoinValues],None] \ No newline at end of file diff --git a/pkgs/clan-vm-manager/clan_vm_manager/windows/join.py b/pkgs/clan-vm-manager/clan_vm_manager/windows/join.py index bb55429a3..f0953f0f7 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/windows/join.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/windows/join.py @@ -4,16 +4,20 @@ from typing import Any import gi from clan_cli.clan_uri import ClanURI -from ..app import Application +from ..interfaces import Callbacks, InitialJoinValues gi.require_version("Gtk", "3.0") from gi.repository import Gio, Gtk +from typing import Callable +from dataclasses import dataclass + class JoinWindow(Gtk.ApplicationWindow): - def __init__(self) -> None: + def __init__(self, initial_values: InitialJoinValues, cbs: Callbacks ) -> None: super().__init__() - # Initialize the main window + # Initialize the main wincbsdow + self.cbs = cbs self.set_title("cLAN Manager") self.connect("delete-event", self.on_quit) self.set_default_size(800, 600) @@ -21,28 +25,25 @@ class JoinWindow(Gtk.ApplicationWindow): vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6, expand=True) self.add(vbox) - # Add a notebook layout - # https://python-gtk-3-tutorial.readthedocs.io/en/latest/layout.html#notebook - self.notebook = Gtk.Notebook() self.stack = Gtk.Stack() - self.stack.add_titled(Gtk.Label("Join cLan"), "join", "Join") + self.stack.add_titled(Gtk.Label(str(initial_values.url)), "join", "Join") vbox.add(self.stack) + vbox.add(Gtk.Entry(text=str(initial_values.url))) + + + button = Gtk.Button(label="To List", ) + button.connect("clicked", self.switch) + vbox.add(button) # Must be called AFTER all components were added self.show_all() + def switch(self, widget: Gtk.Widget) -> None: + self.cbs.show_list() + def on_quit(self, *args: Any) -> None: Gio.Application.quit(self.get_application()) + - -def show_join(args: argparse.Namespace) -> None: - print(f"Joining clan {args.clan_uri}") - app = Application(JoinWindow()) - return app.run() - - -def register_join_parser(parser: argparse.ArgumentParser) -> None: - parser.add_argument("clan_uri", type=ClanURI, help="clan URI to join") - parser.set_defaults(func=show_join) diff --git a/pkgs/clan-vm-manager/clan_vm_manager/windows/overview.py b/pkgs/clan-vm-manager/clan_vm_manager/windows/overview.py index f0dba3b4f..cd0403c44 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/windows/overview.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/windows/overview.py @@ -9,7 +9,6 @@ import argparse from gi.repository import Gio, Gtk -from ..app import Application from ..ui.clan_join_page import ClanJoinPage from ..ui.clan_select_list import ClanEdit, ClanList @@ -86,12 +85,4 @@ class OverviewWindow(Gtk.ApplicationWindow): def on_quit(self, *args: Any) -> None: Gio.Application.quit(self.get_application()) - - -def show_overview(args: argparse.Namespace) -> None: - app = Application(OverviewWindow()) - return app.run() - - -def register_overview_parser(parser: argparse.ArgumentParser) -> None: - parser.set_defaults(func=show_overview) + \ No newline at end of file