From 6ee2e66b56ed6463dc8142f8729bef0f9a07a18f Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Fri, 8 Aug 2025 01:36:24 +0500 Subject: [PATCH] Fix the details screen after deleting every machine --- src/qt/qt_vmmanager_main.cpp | 20 ++++++++++++++++++-- src/qt/qt_vmmanager_system.hpp | 1 + 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/qt/qt_vmmanager_main.cpp b/src/qt/qt_vmmanager_main.cpp index 484696954..b55e2be2a 100644 --- a/src/qt/qt_vmmanager_main.cpp +++ b/src/qt/qt_vmmanager_main.cpp @@ -188,11 +188,19 @@ VMManagerMain::currentSelectionChanged(const QModelIndex ¤t, return; } - disconnect(selected_sysconfig, &VMManagerSystem::configurationChanged, this, &VMManagerMain::onConfigUpdated); + /* hack to prevent strange segfaults when adding a machine after + removing all machines previously */ + if (selected_sysconfig->config_signal_connected == true) { + disconnect(selected_sysconfig, &VMManagerSystem::configurationChanged, this, &VMManagerMain::onConfigUpdated); + selected_sysconfig->config_signal_connected = false; + } const auto mapped_index = proxy_model->mapToSource(current); selected_sysconfig = vm_model->getConfigObjectForIndex(mapped_index); vm_details->updateData(selected_sysconfig); - connect(selected_sysconfig, &VMManagerSystem::configurationChanged, this, &VMManagerMain::onConfigUpdated); + if (selected_sysconfig->config_signal_connected == false) { + connect(selected_sysconfig, &VMManagerSystem::configurationChanged, this, &VMManagerMain::onConfigUpdated); + selected_sysconfig->config_signal_connected = true; + } // Emit that the selection changed, include with the process state emit selectionChanged(current, selected_sysconfig->process->state()); @@ -456,6 +464,14 @@ VMManagerMain::deleteSystem(VMManagerSystem *sysconfig) config->remove(sysconfig->uuid); vm_model->removeConfigFromModel(sysconfig); delete sysconfig; + + if (vm_model->rowCount(QModelIndex()) <= 0) { + /* no machines left - get rid of the last machine's leftovers */ + ui->detailsArea->layout()->removeWidget(vm_details); + delete vm_details; + vm_details = new VMManagerDetails(); + ui->detailsArea->layout()->addWidget(vm_details); + } } } diff --git a/src/qt/qt_vmmanager_system.hpp b/src/qt/qt_vmmanager_system.hpp index 27b9fda57..5914e46cb 100644 --- a/src/qt/qt_vmmanager_system.hpp +++ b/src/qt/qt_vmmanager_system.hpp @@ -136,6 +136,7 @@ public: QProcess *process = new QProcess(); bool window_obscured; + bool config_signal_connected = false; QString getDisplayValue(VMManager::Display::Name key); QFileInfoList getScreenshots();