diff --git a/pkgs/clan-vm-manager/clan-vm-manager.code-workspace b/pkgs/clan-vm-manager/clan-vm-manager.code-workspace index 211e93d1..4f0e7e1b 100644 --- a/pkgs/clan-vm-manager/clan-vm-manager.code-workspace +++ b/pkgs/clan-vm-manager/clan-vm-manager.code-workspace @@ -1,10 +1,10 @@ { "folders": [ { - "path": ".." + "path": "." }, { - "path": "../clan-cli" + "path": "../clan-cli/clan_cli" } ], "settings": {} diff --git a/pkgs/clan-vm-manager/clan_vm_manager/models.py b/pkgs/clan-vm-manager/clan_vm_manager/models.py index c655baa1..79b6e8bb 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/models.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/models.py @@ -1,35 +1,31 @@ from collections import OrderedDict +from dataclasses import dataclass from pathlib import Path from typing import Any import clan_cli +from gi.repository import GdkPixbuf -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 +@dataclass(frozen=True) +class VMBase: + icon: Path | GdkPixbuf.Pixbuf + name: str + url: str + running: bool - self.path = path.resolve() - print(self.path) - assert self.path.exists() - assert self.path.is_dir() + @staticmethod + def name_to_type_map() -> OrderedDict[str, type]: + return OrderedDict( + { + "Icon": GdkPixbuf.Pixbuf, + "Name": str, + "URL": str, + "Running": bool, + } + ) - def list_display(self) -> OrderedDict[str, Any]: + def list_data(self) -> OrderedDict[str, Any]: return OrderedDict( { "Icon": str(self.icon), @@ -40,6 +36,12 @@ class VM: ) +@dataclass(frozen=True) +class VM(VMBase): + path: Path + autostart: bool = False + + def list_vms() -> list[VM]: assets = Path(__file__).parent / "assets" @@ -56,23 +58,23 @@ def list_vms() -> list[VM]: name="Zenith Clan", url="clan://zenith.lol", path=Path(__file__).parent.parent / "test_democlan", + running=False, ), VM( icon=assets / "firestorm.jpeg", name="Firestorm Clan", url="clan://firestorm.lol", path=Path(__file__).parent.parent / "test_democlan", + running=False, ), VM( icon=assets / "placeholder.jpeg", name="Demo Clan", url="clan://demo.lol", path=Path(__file__).parent.parent / "test_democlan", + running=False, ), ] - # vms.extend(vms) - # vms.extend(vms) - # vms.extend(vms) for path in clan_cli.flakes.history.list_history(): new_vm = { 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 5cd141e1..f37807e8 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 @@ -2,7 +2,7 @@ from collections.abc import Callable from gi.repository import GdkPixbuf, Gtk -from ..models import VM, list_vms +from ..models import VM, VMBase, list_vms class ClanSelectPage(Gtk.Box): @@ -34,16 +34,16 @@ class ClanSelectPage(Gtk.Box): def on_backup_clicked(self, widget: Gtk.Widget) -> None: print("Backup clicked") - def on_cell_toggled(self, widget: Gtk.Widget, path: str) -> None: - print(f"on_cell_toggled: {path}") - # Get the current value from the model - current_value = self.list_store[path][1] + def on_cell_toggled(self, vm: VMBase) -> None: + print(f"on_cell_toggled: {vm}") + # # Get the current value from the model + # current_value = self.list_store[path][1] - print(f"current_value: {current_value}") - # Toggle the value - self.list_store[path][1] = not current_value - # Print the updated value - print("Switched", path, "to", self.list_store[path][1]) + # print(f"current_value: {current_value}") + # # Toggle the value + # self.list_store[path][1] = not current_value + # # Print the updated value + # print("Switched", path, "to", self.list_store[path][1]) def on_select_row(self, selection: Gtk.TreeSelection) -> None: model, row = selection.get_selected() @@ -94,16 +94,17 @@ class ClanSelectList(Gtk.Box): ) -> None: super().__init__(expand=True) self.vms = vms - - self.list_store = Gtk.ListStore(GdkPixbuf.Pixbuf, str, str, bool) + self.on_cell_toggled = on_cell_toggled + self.list_store = Gtk.ListStore(*VM.name_to_type_map().values()) for vm in vms: - items = list(vm.list_display().values()) - items[0] = GdkPixbuf.Pixbuf.new_from_file_at_size(items[0], 64, 64) - assert len(items) == 4 + items = list(vm.list_data().values()) + items[0] = GdkPixbuf.Pixbuf.new_from_file_at_scale( + filename=items[0], width=64, height=64, preserve_aspect_ratio=True + ) self.list_store.append(items) self.tree_view = Gtk.TreeView(self.list_store, expand=True) - for idx, (key, value) in enumerate(vm.list_display().items()): + for idx, (key, value) in enumerate(vm.list_data().items()): match key: case "Icon": renderer = Gtk.CellRendererPixbuf() @@ -128,7 +129,7 @@ class ClanSelectList(Gtk.Box): case "Running": renderer = Gtk.CellRendererToggle() renderer.set_property("activatable", True) - renderer.connect("toggled", on_cell_toggled) + renderer.connect("toggled", self._on_cell_toggled) col = Gtk.TreeViewColumn(key, renderer, active=idx) col.set_resizable(True) col.set_expand(True) @@ -143,3 +144,8 @@ class ClanSelectList(Gtk.Box): self.set_border_width(10) self.add(self.tree_view) + + def _on_cell_toggled(self, widget: Gtk.CellRendererToggle, path: str) -> None: + row = self.list_store[path] + vm = VMBase(*row) + self.on_cell_toggled(vm) diff --git a/pkgs/clan-vm-manager/test_democlan b/pkgs/clan-vm-manager/test_democlan index 99f20170..6287f4e1 160000 --- a/pkgs/clan-vm-manager/test_democlan +++ b/pkgs/clan-vm-manager/test_democlan @@ -1 +1 @@ -Subproject commit 99f20170a9a122b4349fbb5226d1f07183dc1bd9 +Subproject commit 6287f4e19194a6c13a2623736404cd91a88e0a1b