2023-11-25 00:55:01 +00:00
|
|
|
#!/usr/bin/env python3
|
2024-02-05 07:18:40 +00:00
|
|
|
import logging
|
2024-02-07 10:16:20 +00:00
|
|
|
from typing import Any, ClassVar
|
2023-12-16 12:03:10 +00:00
|
|
|
|
2023-11-25 00:55:01 +00:00
|
|
|
import gi
|
2023-12-16 12:03:10 +00:00
|
|
|
|
2024-02-08 07:10:17 +00:00
|
|
|
from clan_vm_manager import assets
|
|
|
|
|
2024-01-17 12:11:49 +00:00
|
|
|
gi.require_version("Gtk", "4.0")
|
|
|
|
gi.require_version("Adw", "1")
|
2024-01-02 04:54:19 +00:00
|
|
|
|
2024-02-07 10:16:20 +00:00
|
|
|
from clan_cli.custom_logger import setup_logging
|
2024-01-17 12:11:49 +00:00
|
|
|
from gi.repository import Adw, Gdk, Gio, Gtk
|
2023-12-16 12:03:10 +00:00
|
|
|
|
2024-01-20 09:11:52 +00:00
|
|
|
from clan_vm_manager.models.interfaces import ClanConfig
|
2024-02-07 10:16:20 +00:00
|
|
|
from clan_vm_manager.models.use_join import GLib, GObject
|
2024-02-16 09:10:49 +00:00
|
|
|
from clan_vm_manager.models.use_vms import VMs
|
2023-12-26 17:02:43 +00:00
|
|
|
|
2024-02-08 13:57:02 +00:00
|
|
|
from .trayicon import TrayIcon
|
2024-01-20 09:11:52 +00:00
|
|
|
from .windows.main_window import MainWindow
|
2023-12-16 11:52:10 +00:00
|
|
|
|
2024-02-05 07:18:40 +00:00
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
|
2023-11-28 17:19:01 +00:00
|
|
|
|
2024-01-20 09:11:52 +00:00
|
|
|
class MainApplication(Adw.Application):
|
2024-02-07 10:16:20 +00:00
|
|
|
__gsignals__: ClassVar = {
|
|
|
|
"join_request": (GObject.SignalFlags.RUN_FIRST, None, [str]),
|
|
|
|
}
|
|
|
|
|
|
|
|
def __init__(self, *args: Any, **kwargs: Any) -> None:
|
2024-01-17 12:11:49 +00:00
|
|
|
super().__init__(
|
2024-02-07 10:16:20 +00:00
|
|
|
*args,
|
2024-02-08 13:57:02 +00:00
|
|
|
application_id="lol.clan.vm.manager",
|
2024-02-07 10:16:20 +00:00
|
|
|
flags=Gio.ApplicationFlags.HANDLES_COMMAND_LINE,
|
|
|
|
**kwargs,
|
|
|
|
)
|
2024-02-08 13:57:02 +00:00
|
|
|
self.tray_icon: TrayIcon | None = None
|
2024-02-07 10:16:20 +00:00
|
|
|
|
|
|
|
self.add_main_option(
|
|
|
|
"debug",
|
|
|
|
ord("d"),
|
|
|
|
GLib.OptionFlags.NONE,
|
|
|
|
GLib.OptionArg.NONE,
|
|
|
|
"enable debug mode",
|
|
|
|
None,
|
2023-12-30 10:14:45 +00:00
|
|
|
)
|
2024-02-16 09:10:49 +00:00
|
|
|
self.vms = VMs.use()
|
|
|
|
log.debug(f"VMS object: {self.vms}")
|
2024-02-08 13:57:02 +00:00
|
|
|
self.window: Adw.ApplicationWindow | None = None
|
2024-01-17 12:11:49 +00:00
|
|
|
self.connect("shutdown", self.on_shutdown)
|
2024-02-07 05:03:12 +00:00
|
|
|
self.connect("activate", self.show_window)
|
2023-12-30 10:14:45 +00:00
|
|
|
|
2024-02-07 10:16:20 +00:00
|
|
|
def do_command_line(self, command_line: Any) -> int:
|
|
|
|
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])
|
2024-02-12 08:31:27 +00:00
|
|
|
setup_logging("DEBUG", root_log_name="clan_cli")
|
2024-02-07 10:16:20 +00:00
|
|
|
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
|
|
|
|
|
2024-01-17 12:11:49 +00:00
|
|
|
def on_shutdown(self, app: Gtk.Application) -> None:
|
2024-02-05 07:18:40 +00:00
|
|
|
log.debug("Shutting down")
|
2024-02-08 13:57:02 +00:00
|
|
|
|
2024-02-16 09:10:49 +00:00
|
|
|
self.vms.kill_all()
|
|
|
|
|
2024-02-08 13:57:02 +00:00
|
|
|
if self.tray_icon is not None:
|
|
|
|
self.tray_icon.destroy()
|
|
|
|
|
|
|
|
def on_window_hide_unhide(self, *_args: Any) -> None:
|
|
|
|
assert self.window is not None
|
|
|
|
if self.window.is_visible():
|
|
|
|
self.window.hide()
|
2024-02-16 05:25:06 +00:00
|
|
|
else:
|
|
|
|
self.window.present()
|
2024-02-08 13:57:02 +00:00
|
|
|
|
|
|
|
def dummy_menu_entry(self) -> None:
|
|
|
|
log.info("Dummy menu entry called")
|
|
|
|
|
2023-11-30 12:42:15 +00:00
|
|
|
def do_activate(self) -> None:
|
2024-02-07 05:03:12 +00:00
|
|
|
self.show_window()
|
|
|
|
|
|
|
|
def show_window(self, app: Any = None) -> None:
|
2024-02-08 13:57:02 +00:00
|
|
|
if not self.window:
|
2024-02-07 05:03:12 +00:00
|
|
|
self.init_style()
|
2024-02-08 13:57:02 +00:00
|
|
|
self.window = MainWindow(config=ClanConfig(initial_view="list"))
|
|
|
|
self.window.set_application(self)
|
|
|
|
self.tray_icon = TrayIcon(self)
|
|
|
|
self.window.present()
|
2023-11-28 17:19:01 +00:00
|
|
|
|
|
|
|
# TODO: For css styling
|
2023-11-30 12:42:15 +00:00
|
|
|
def init_style(self) -> None:
|
2024-02-08 07:10:17 +00:00
|
|
|
resource_path = assets.loc / "style.css"
|
|
|
|
|
|
|
|
log.debug(f"Style css path: {resource_path}")
|
2024-01-17 12:11:49 +00:00
|
|
|
css_provider = Gtk.CssProvider()
|
|
|
|
css_provider.load_from_path(str(resource_path))
|
|
|
|
Gtk.StyleContext.add_provider_for_display(
|
|
|
|
Gdk.Display.get_default(),
|
|
|
|
css_provider,
|
|
|
|
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION,
|
|
|
|
)
|