Update start/stop button based on VM state

This commit is contained in:
Jörg Thalheim
2024-01-04 18:35:26 +01:00
parent 738aaa3b5d
commit c7fda31ab3
3 changed files with 25 additions and 23 deletions

View File

@@ -185,6 +185,7 @@ class ProcessManager:
print("Killing all processes", file=sys.stderr) print("Killing all processes", file=sys.stderr)
for proc in self.procs.values(): for proc in self.procs.values():
proc.kill_group() proc.kill_group()
self.procs.clear()
def kill(self, ident: str) -> None: def kill(self, ident: str) -> None:
if ident not in self.procs: if ident not in self.procs:

View File

@@ -3,7 +3,7 @@ from collections.abc import Callable
from gi.repository import Gdk, GdkPixbuf, Gtk from gi.repository import Gdk, GdkPixbuf, Gtk
from ..interfaces import Callbacks from ..interfaces import Callbacks
from ..models import VMBase from ..models import VMBase, VMStatus
from .context_menu import VmMenu from .context_menu import VmMenu
@@ -89,29 +89,26 @@ class ClanList(Gtk.Box):
cbs: Callbacks, cbs: Callbacks,
selected_vm: VMBase | None, selected_vm: VMBase | None,
vms: list[VMBase], vms: list[VMBase],
show_toolbar: bool = True,
) -> None: ) -> None:
super().__init__(orientation=Gtk.Orientation.VERTICAL, expand=True) super().__init__(orientation=Gtk.Orientation.VERTICAL, expand=True)
self.remount_edit_view = remount_edit self.remount_edit_view = remount_edit
self.remount_list_view = remount_list self.remount_list_view = remount_list
self.set_selected = set_selected self.set_selected = set_selected
self.show_toolbar = show_toolbar
self.cbs = cbs self.cbs = cbs
self.show_join = cbs.show_join self.show_join = cbs.show_join
self.selected_vm: VMBase | None = selected_vm self.selected_vm: VMBase | None = selected_vm
if show_toolbar: self.toolbar = ClanListToolbar(
self.toolbar = ClanListToolbar( on_start_clicked=self.on_start_clicked,
on_start_clicked=self.on_start_clicked, on_stop_clicked=self.on_stop_clicked,
on_stop_clicked=self.on_stop_clicked, on_edit_clicked=self.on_edit_clicked,
on_edit_clicked=self.on_edit_clicked, on_join_clan_clicked=self.on_join_clan_clicked,
on_join_clan_clicked=self.on_join_clan_clicked, on_flash_clicked=self.on_flash_clicked,
on_flash_clicked=self.on_flash_clicked, )
) self.toolbar.set_selected_vm(self.selected_vm)
self.toolbar.set_is_selected(self.selected_vm is not None) self.add(self.toolbar)
self.add(self.toolbar)
self.add( self.add(
ClanListView( ClanListView(
@@ -146,11 +143,7 @@ class ClanList(Gtk.Box):
self.remount_edit_view() self.remount_edit_view()
def on_select_vm(self, vm: VMBase) -> None: def on_select_vm(self, vm: VMBase) -> None:
if self.show_toolbar: self.toolbar.set_selected_vm(vm)
if vm is None:
self.toolbar.set_is_selected(False)
else:
self.toolbar.set_is_selected(True)
self.set_selected(vm) self.set_selected(vm)
self.selected_vm = vm self.selected_vm = vm
@@ -188,11 +181,11 @@ class ClanListToolbar(Gtk.Toolbar):
self.flash_button.connect("clicked", on_flash_clicked) self.flash_button.connect("clicked", on_flash_clicked)
self.add(self.flash_button) self.add(self.flash_button)
def set_is_selected(self, s: bool) -> None: def set_selected_vm(self, vm: VMBase | None) -> None:
if s: if vm:
self.edit_button.set_sensitive(True) self.edit_button.set_sensitive(True)
self.start_button.set_sensitive(True) self.start_button.set_sensitive(vm.status == VMStatus.STOPPED)
self.stop_button.set_sensitive(True) self.stop_button.set_sensitive(vm.status == VMStatus.RUNNING)
else: else:
self.edit_button.set_sensitive(False) self.edit_button.set_sensitive(False)
self.start_button.set_sensitive(False) self.start_button.set_sensitive(False)

View File

@@ -57,9 +57,17 @@ class OverviewWindow(Gtk.ApplicationWindow):
widget = self.stack.get_child_by_name("list") widget = self.stack.get_child_by_name("list")
if widget: if widget:
widget.destroy() 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( clan_list = ClanList(
vms=[vm.base for vm in get_initial_vms(self.cbs.running_vms())], vms=vms,
cbs=self.cbs, cbs=self.cbs,
remount_list=self.remount_list_view, remount_list=self.remount_list_view,
remount_edit=self.remount_edit_view, remount_edit=self.remount_edit_view,