From 5533b7780c585305f27c81434ca8ec69eb8fd544 Mon Sep 17 00:00:00 2001 From: Johannes Kirschbauer Date: Sun, 21 Jan 2024 12:45:45 +0100 Subject: [PATCH] prepare details view --- .../clan_vm_manager/views/details.py | 55 +++++++++++++++++++ .../clan_vm_manager/views/list.py | 3 + .../clan_vm_manager/windows/main_window.py | 2 + 3 files changed, 60 insertions(+) create mode 100644 pkgs/clan-vm-manager/clan_vm_manager/views/details.py diff --git a/pkgs/clan-vm-manager/clan_vm_manager/views/details.py b/pkgs/clan-vm-manager/clan_vm_manager/views/details.py new file mode 100644 index 000000000..58f5b5950 --- /dev/null +++ b/pkgs/clan-vm-manager/clan_vm_manager/views/details.py @@ -0,0 +1,55 @@ +import os +from collections.abc import Callable +from functools import partial +from typing import Any, Literal + +import gi + +gi.require_version("Adw", "1") +from gi.repository import Adw, Gio, GObject, Gtk + + +def create_details_list( + model: Gio.ListStore, render_row: Callable[[Gtk.ListBox, GObject], Gtk.Widget] +) -> Gtk.ListBox: + boxed_list = Gtk.ListBox() + boxed_list.set_selection_mode(Gtk.SelectionMode.NONE) + boxed_list.add_css_class("boxed-list") + boxed_list.bind_model(model, create_widget_func=partial(render_row, boxed_list)) + return boxed_list + + +class PreferencesValue(GObject.Object): + variant: Literal["CPU", "MEMORY"] + editable: bool + data: Any + + def __init__( + self, variant: Literal["CPU", "MEMORY"], editable: bool, data: Any + ) -> None: + super().__init__() + self.variant = variant + self.editable = editable + self.data = data + + +class Details(Gtk.Box): + def __init__(self) -> None: + super().__init__(orientation=Gtk.Orientation.VERTICAL) + + preferences_store = Gio.ListStore.new(PreferencesValue) + preferences_store.append(PreferencesValue("CPU", True, 1)) + + self.details_list = create_details_list( + model=preferences_store, render_row=self.render_entry_row + ) + + self.append(self.details_list) + + def render_entry_row( + self, boxed_list: Gtk.ListBox, item: PreferencesValue + ) -> Gtk.Widget: + row = Adw.SpinRow.new_with_range(0, os.cpu_count(), 1) + row.set_value(item.data) + + return row 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 bb033a610..ee1acc68c 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/views/list.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/views/list.py @@ -169,6 +169,9 @@ class ClanList(Gtk.Box): def on_join(_history: list[HistoryEntry]) -> None: VMS.use().refresh() + # TODO(@hsjobeki): Confirm and edit details + # Views.use().view.set_visible_child_name("details") + Join.use().join(item, cb=on_join) # If the join request list is empty disable the shadow artefact diff --git a/pkgs/clan-vm-manager/clan_vm_manager/windows/main_window.py b/pkgs/clan-vm-manager/clan_vm_manager/windows/main_window.py index d75f65c2b..52b859413 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/windows/main_window.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/windows/main_window.py @@ -2,6 +2,7 @@ import gi from clan_vm_manager.models.interfaces import ClanConfig from clan_vm_manager.models.use_views import Views +from clan_vm_manager.views.details import Details from clan_vm_manager.views.list import ClanList gi.require_version("Adw", "1") @@ -26,6 +27,7 @@ class MainWindow(Adw.ApplicationWindow): Views.use().set_main_window(self) stack_view.add_named(ClanList(), "list") + stack_view.add_named(Details(), "details") stack_view.set_visible_child_name(config.initial_view)