UI: Added joining multiple clans one after another over clan url
All checks were successful
checks-impure / test (pull_request) Successful in 1m35s
checks / test (pull_request) Successful in 2m18s

This commit is contained in:
Luis Hebendanz 2024-02-07 17:16:20 +07:00
parent 96b98dcbed
commit 10578e7611
9 changed files with 65 additions and 68 deletions

View File

@ -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)

View File

@ -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()

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

View File

@ -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):

View File

@ -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()

View File

@ -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():

View File

@ -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" ];
})