From c7fda31ab30c9636261c65972207af6b9e646766 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Thalheim?= Date: Thu, 4 Jan 2024 18:35:26 +0100 Subject: [PATCH] Update start/stop button based on VM state --- .../clan_vm_manager/executor.py | 1 + .../clan_vm_manager/ui/clan_select_list.py | 37 ++++++++----------- .../clan_vm_manager/windows/overview.py | 10 ++++- 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/pkgs/clan-vm-manager/clan_vm_manager/executor.py b/pkgs/clan-vm-manager/clan_vm_manager/executor.py index ee4a7c9b9..e5828eb82 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/executor.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/executor.py @@ -185,6 +185,7 @@ class ProcessManager: print("Killing all processes", file=sys.stderr) for proc in self.procs.values(): proc.kill_group() + self.procs.clear() def kill(self, ident: str) -> None: if ident not in self.procs: 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 caf4e62d5..5add4e80c 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 @@ -3,7 +3,7 @@ from collections.abc import Callable from gi.repository import Gdk, GdkPixbuf, Gtk from ..interfaces import Callbacks -from ..models import VMBase +from ..models import VMBase, VMStatus from .context_menu import VmMenu @@ -89,29 +89,26 @@ class ClanList(Gtk.Box): cbs: Callbacks, selected_vm: VMBase | None, vms: list[VMBase], - show_toolbar: bool = True, ) -> None: super().__init__(orientation=Gtk.Orientation.VERTICAL, expand=True) self.remount_edit_view = remount_edit self.remount_list_view = remount_list self.set_selected = set_selected - self.show_toolbar = show_toolbar self.cbs = cbs self.show_join = cbs.show_join self.selected_vm: VMBase | None = selected_vm - if show_toolbar: - self.toolbar = ClanListToolbar( - on_start_clicked=self.on_start_clicked, - on_stop_clicked=self.on_stop_clicked, - on_edit_clicked=self.on_edit_clicked, - on_join_clan_clicked=self.on_join_clan_clicked, - on_flash_clicked=self.on_flash_clicked, - ) - self.toolbar.set_is_selected(self.selected_vm is not None) - self.add(self.toolbar) + self.toolbar = ClanListToolbar( + on_start_clicked=self.on_start_clicked, + on_stop_clicked=self.on_stop_clicked, + on_edit_clicked=self.on_edit_clicked, + on_join_clan_clicked=self.on_join_clan_clicked, + on_flash_clicked=self.on_flash_clicked, + ) + self.toolbar.set_selected_vm(self.selected_vm) + self.add(self.toolbar) self.add( ClanListView( @@ -146,11 +143,7 @@ class ClanList(Gtk.Box): self.remount_edit_view() def on_select_vm(self, vm: VMBase) -> None: - if self.show_toolbar: - if vm is None: - self.toolbar.set_is_selected(False) - else: - self.toolbar.set_is_selected(True) + self.toolbar.set_selected_vm(vm) self.set_selected(vm) self.selected_vm = vm @@ -188,11 +181,11 @@ class ClanListToolbar(Gtk.Toolbar): self.flash_button.connect("clicked", on_flash_clicked) self.add(self.flash_button) - def set_is_selected(self, s: bool) -> None: - if s: + def set_selected_vm(self, vm: VMBase | None) -> None: + if vm: self.edit_button.set_sensitive(True) - self.start_button.set_sensitive(True) - self.stop_button.set_sensitive(True) + self.start_button.set_sensitive(vm.status == VMStatus.STOPPED) + self.stop_button.set_sensitive(vm.status == VMStatus.RUNNING) else: self.edit_button.set_sensitive(False) self.start_button.set_sensitive(False) diff --git a/pkgs/clan-vm-manager/clan_vm_manager/windows/overview.py b/pkgs/clan-vm-manager/clan_vm_manager/windows/overview.py index 0f2d2737e..507a556fe 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/windows/overview.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/windows/overview.py @@ -57,9 +57,17 @@ class OverviewWindow(Gtk.ApplicationWindow): widget = self.stack.get_child_by_name("list") if widget: widget.destroy() + vms = [] + + for vm in get_initial_vms(self.cbs.running_vms()): + vms.append(vm.base) + # FIXME: It feels very odd that we have to re-fetch the selected VM. + # The model should be just updated in-place. + if self.selected_vm and vm.base.url == self.selected_vm.url: + self.selected_vm = vm.base clan_list = ClanList( - vms=[vm.base for vm in get_initial_vms(self.cbs.running_vms())], + vms=vms, cbs=self.cbs, remount_list=self.remount_list_view, remount_edit=self.remount_edit_view,