diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..7f8b37fa --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "pkgs/clan-vm-manager/test_democlan"] + path = pkgs/clan-vm-manager/test_democlan + url = gitea@git.clan.lol:clan/democlan.git diff --git a/pkgs/clan-vm-manager/clan_vm_manager/app.py b/pkgs/clan-vm-manager/clan_vm_manager/app.py index eb1c91fc..670f32db 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/app.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/app.py @@ -2,8 +2,6 @@ import argparse import sys -from collections import OrderedDict -from pathlib import Path from typing import Any import gi @@ -15,64 +13,6 @@ from .constants import constants from .ui.clan_select_list import ClanSelectPage -class VM: - def __init__( - self, - icon: Path, - name: str, - url: str, - path: Path, - running: bool = False, - autostart: bool = False, - ) -> None: - self.icon = icon.resolve() - assert self.icon.exists() - assert self.icon.is_file() - self.url = url - self.autostart = autostart - self.running = running - self.name = name - self.path = path - - def list_display(self) -> OrderedDict[str, Any]: - return OrderedDict( - { - "Icon": str(self.icon), - "Name": self.name, - "URL": self.url, - "Running": self.running, - } - ) - - -assets = Path(__file__).parent / "assets" - -vms = [ - VM( - assets / "cybernet.jpeg", - "Cybernet Clan", - "clan://cybernet.lol", - "/home/user/w-clan", - True, - ), - VM( - assets / "zenith.jpeg", - "Zenith Clan", - "clan://zenith.lol", - "/home/user/lassulus-clan", - ), - VM( - assets / "firestorm.jpeg", - "Firestorm Clan", - "clan://firestorm.lol", - "/home/user/mic-clan", - ), -] -# vms.extend(vms) -# vms.extend(vms) -# vms.extend(vms) - - class ClanJoinPage(Gtk.Box): def __init__(self) -> None: super().__init__() @@ -97,7 +37,7 @@ class MainWindow(Gtk.ApplicationWindow): self.notebook = Gtk.Notebook() vbox.add(self.notebook) - self.notebook.append_page(ClanSelectPage(vms), Gtk.Label(label="Overview")) + self.notebook.append_page(ClanSelectPage(), Gtk.Label(label="Overview")) self.notebook.append_page(ClanJoinPage(), Gtk.Label(label="Join")) # Must be called AFTER all components were added diff --git a/pkgs/clan-vm-manager/clan_vm_manager/ui/clan_select_list.py b/pkgs/clan-vm-manager/clan_vm_manager/ui/clan_select_list.py index 7fa59dda..7b0d71da 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/ui/clan_select_list.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/ui/clan_select_list.py @@ -1,23 +1,29 @@ from collections.abc import Callable -from typing import TYPE_CHECKING from gi.repository import GdkPixbuf, Gtk -if TYPE_CHECKING: - from ..app import VM +from ..models import VM, list_vms class ClanSelectPage(Gtk.Box): - def __init__(self, vms: list["VM"]) -> None: + def __init__(self) -> None: super().__init__(orientation=Gtk.Orientation.VERTICAL, expand=True) - self.add(ClanSelectList(vms, self.on_cell_toggled, self.on_select_row, self.on_double_click)) - self.add( - ClanSelectButtons( - self.on_start_clicked, self.on_stop_clicked, self.on_backup_clicked - ) - ) + vms = list_vms() + list_hooks = { + "on_cell_toggled": self.on_cell_toggled, + "on_select_row": self.on_select_row, + "on_double_click": self.on_double_click, + } + self.add(ClanSelectList(vms=vms, **list_hooks)) + + button_hooks = { + "on_start_clicked": self.on_start_clicked, + "on_stop_clicked": self.on_stop_clicked, + "on_backup_clicked": self.on_backup_clicked, + } + self.add(ClanSelectButtons(**button_hooks)) def on_start_clicked(self, widget: Gtk.Widget) -> None: print("Start clicked") @@ -42,13 +48,12 @@ class ClanSelectPage(Gtk.Box): def on_select_row(self, selection: Gtk.TreeSelection) -> None: model, row = selection.get_selected() if row is not None: - print(f"Selected {model[row][0]}") - - def on_double_click(self, tree_view, path, column) -> None: - - model = tree_view.get_model() - iter = model.get_iter(path) + print(f"Selected {model[row][1]}") + def on_double_click( + self, tree_view: Gtk.TreeView, path: Gtk.TreePath, column: Gtk.TreeViewColumn + ) -> None: + breakpoint() # Get the selection object of the tree view selection = tree_view.get_selection() model, row = selection.get_selected() @@ -59,6 +64,7 @@ class ClanSelectPage(Gtk.Box): class ClanSelectButtons(Gtk.Box): def __init__( self, + *, on_start_clicked: Callable[[Gtk.Widget], None], on_stop_clicked: Callable[[Gtk.Widget], None], on_backup_clicked: Callable[[Gtk.Widget], None], @@ -81,7 +87,8 @@ class ClanSelectButtons(Gtk.Box): class ClanSelectList(Gtk.Box): def __init__( self, - vms: list["VM"], + *, + vms: list[VM], on_cell_toggled: Callable[[Gtk.Widget, str], None], on_select_row: Callable[[Gtk.TreeSelection], None], on_double_click: Callable[[Gtk.TreeSelection], None], diff --git a/pkgs/clan-vm-manager/test_democlan b/pkgs/clan-vm-manager/test_democlan new file mode 160000 index 00000000..99f20170 --- /dev/null +++ b/pkgs/clan-vm-manager/test_democlan @@ -0,0 +1 @@ +Subproject commit 99f20170a9a122b4349fbb5226d1f07183dc1bd9