diff --git a/pkgs/clan-vm-manager/clan_vm_manager/__init__.py b/pkgs/clan-vm-manager/clan_vm_manager/__init__.py index 42560f4c..b42ede31 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/__init__.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/__init__.py @@ -1,10 +1,5 @@ -import argparse import logging - -from clan_cli.clan_uri import ClanURI -from clan_cli.custom_logger import setup_logging - -from clan_vm_manager.models.interfaces import ClanConfig +import sys from .app import MainApplication @@ -12,53 +7,5 @@ log = logging.getLogger(__name__) def main() -> None: - parser = argparse.ArgumentParser(description="clan-vm-manager") - - parser.add_argument("--debug", action="store_true", help="enable debug mode") - - # Add join subcommand - subparser = parser.add_subparsers( - title="command", - description="command to execute", - help="the command to execute", - ) - register_join_parser(subparser.add_parser("join", help="join a clan")) - - register_overview_parser(subparser.add_parser("overview", help="overview screen")) - - # Executed when no command is given - parser.set_defaults(func=show_overview) - args = parser.parse_args() - - if args.debug: - setup_logging("DEBUG", root_log_name=__name__.split(".")[0]) - else: - setup_logging("INFO", root_log_name=__name__.split(".")[0]) - - log.debug("Debug logging enabled") - log.info("Info logging enabled") - - args.func(args) - - -def show_join(args: argparse.Namespace) -> None: - app = MainApplication( - config=ClanConfig(url=args.clan_uri, initial_view="list"), - ) - 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 = MainApplication( - config=ClanConfig(url=None, initial_view="list"), - ) - return app.run() - - -def register_overview_parser(parser: argparse.ArgumentParser) -> None: - parser.set_defaults(func=show_overview) + app = MainApplication() + return app.run(sys.argv) diff --git a/pkgs/clan-vm-manager/clan_vm_manager/app.py b/pkgs/clan-vm-manager/clan_vm_manager/app.py index b7cdf1f5..15d32f15 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/app.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/app.py @@ -1,16 +1,18 @@ #!/usr/bin/env python3 import logging from pathlib import Path -from typing import Any +from typing import Any, ClassVar import gi gi.require_version("Gtk", "4.0") gi.require_version("Adw", "1") +from clan_cli.custom_logger import setup_logging from gi.repository import Adw, Gdk, Gio, Gtk from clan_vm_manager.models.interfaces import ClanConfig +from clan_vm_manager.models.use_join import GLib, GObject from clan_vm_manager.models.use_vms import VMS from .constants import constants @@ -20,15 +22,54 @@ log = logging.getLogger(__name__) class MainApplication(Adw.Application): - def __init__(self, config: ClanConfig) -> None: + __gsignals__: ClassVar = { + "join_request": (GObject.SignalFlags.RUN_FIRST, None, [str]), + } + + def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__( - application_id=constants["APPID"], flags=Gio.ApplicationFlags.FLAGS_NONE + *args, + application_id=constants["APPID"], + flags=Gio.ApplicationFlags.HANDLES_COMMAND_LINE, + **kwargs, ) - self.config = config + + self.add_main_option( + "debug", + ord("d"), + GLib.OptionFlags.NONE, + GLib.OptionArg.NONE, + "enable debug mode", + None, + ) + self.win: Adw.ApplicationWindow | None = None self.connect("shutdown", self.on_shutdown) self.connect("activate", self.show_window) + def do_command_line(self, command_line: Any) -> int: + log.info("Do command line executed") + options = command_line.get_options_dict() + # convert GVariantDict -> GVariant -> dict + options = options.end().unpack() + + if "debug" in options: + setup_logging("DEBUG", root_log_name=__name__.split(".")[0]) + else: + setup_logging("INFO", root_log_name=__name__.split(".")[0]) + log.debug("Debug logging enabled") + + args = command_line.get_arguments() + + self.activate() + + if len(args) > 1: + log.debug(f"Join request: {args[1]}") + uri = args[1] + self.emit("join_request", uri) + + return 0 + def on_shutdown(self, app: Gtk.Application) -> None: log.debug("Shutting down") VMS.use().kill_all() @@ -39,7 +80,7 @@ class MainApplication(Adw.Application): def show_window(self, app: Any = None) -> None: if not self.win: self.init_style() - self.win = MainWindow(config=self.config) + self.win = MainWindow(config=ClanConfig(initial_view="list")) self.win.set_application(self) self.win.present() diff --git a/pkgs/clan-vm-manager/clan_vm_manager/assets/cLAN--black.png b/pkgs/clan-vm-manager/clan_vm_manager/assets/cLAN--black.png new file mode 100644 index 00000000..370d0f75 Binary files /dev/null and b/pkgs/clan-vm-manager/clan_vm_manager/assets/cLAN--black.png differ diff --git a/pkgs/clan-vm-manager/clan_vm_manager/assets/clan_black.png b/pkgs/clan-vm-manager/clan_vm_manager/assets/clan_black.png new file mode 100644 index 00000000..370d0f75 Binary files /dev/null and b/pkgs/clan-vm-manager/clan_vm_manager/assets/clan_black.png differ diff --git a/pkgs/clan-vm-manager/clan_vm_manager/assets/clan_white.png b/pkgs/clan-vm-manager/clan_vm_manager/assets/clan_white.png new file mode 100644 index 00000000..b5bcb145 Binary files /dev/null and b/pkgs/clan-vm-manager/clan_vm_manager/assets/clan_white.png differ diff --git a/pkgs/clan-vm-manager/clan_vm_manager/models/interfaces.py b/pkgs/clan-vm-manager/clan_vm_manager/models/interfaces.py index 64e993a0..1b8f36cc 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/models/interfaces.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/models/interfaces.py @@ -2,7 +2,6 @@ from dataclasses import dataclass from enum import StrEnum import gi -from clan_cli.clan_uri import ClanURI gi.require_version("Gtk", "4.0") @@ -10,7 +9,6 @@ gi.require_version("Gtk", "4.0") @dataclass class ClanConfig: initial_view: str - url: ClanURI | None class VMStatus(StrEnum): diff --git a/pkgs/clan-vm-manager/clan_vm_manager/models/use_join.py b/pkgs/clan-vm-manager/clan_vm_manager/models/use_join.py index 018ecb6f..cba131e7 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/models/use_join.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/models/use_join.py @@ -69,6 +69,10 @@ class Join: This method can add multiple join requests if called subsequently for each request. """ + if url.get_id() in [item.url.get_id() for item in self.list_store]: + log.info(f"Join request already exists: {url}") + return + def after_join(item: JoinValue, _: Any) -> None: self.discard(item) Clans.use().refresh() diff --git a/pkgs/clan-vm-manager/clan_vm_manager/views/list.py b/pkgs/clan-vm-manager/clan_vm_manager/views/list.py index ddd411af..cac60c63 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/views/list.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/views/list.py @@ -5,6 +5,7 @@ from typing import Any import gi from clan_cli import ClanError, history +from clan_cli.clan_uri import ClanURI from clan_vm_manager.models.interfaces import ClanConfig from clan_vm_manager.models.use_join import Join, JoinValue @@ -47,12 +48,12 @@ class ClanList(Gtk.Box): def __init__(self, config: ClanConfig) -> None: super().__init__(orientation=Gtk.Orientation.VERTICAL) + app = Gio.Application.get_default() + app.connect("join_request", self.on_join_request) + groups = Clans.use() join = Join.use() - if config.url: - join.push(config.url, self.after_join) - self.__init_machines = history.add.list_history() self.join_boxed_list = create_boxed_list( model=join.list_store, render_row=self.render_join_row @@ -228,6 +229,11 @@ class ClanList(Gtk.Box): dialog.set_transient_for(p) # set the parent window of the dialog dialog.choose() + def on_join_request(self, widget: Any, url: str) -> None: + log.debug("Join request: %s", url) + clan_uri = ClanURI.from_str(url) + Join.use().push(clan_uri, self.after_join) + def after_join(self, item: JoinValue) -> None: # If the join request list is empty disable the shadow artefact if not Join.use().list_store.get_n_items(): diff --git a/pkgs/clan-vm-manager/default.nix b/pkgs/clan-vm-manager/default.nix index 0b6e0110..8d3f2a65 100644 --- a/pkgs/clan-vm-manager/default.nix +++ b/pkgs/clan-vm-manager/default.nix @@ -58,8 +58,9 @@ python3.pkgs.buildPythonApplication { desktopItems = [ (makeDesktopItem { name = "clan-vm-manager"; - exec = "clan-vm-manager join %u"; - desktopName = "CLan VM Manager"; + exec = "clan-vm-manager %u"; + icon = ./clan_vm_manager/assets/clan_white.png; + desktopName = "cLAN Manager"; startupWMClass = "clan"; mimeTypes = [ "x-scheme-handler/clan" ]; })