From 9366ddd60d83f3d0ef9984aaaedba1ed71e2cc79 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Wed, 24 Dec 2025 01:09:48 -0300 Subject: [PATCH] Manager: Improve machine load times by caching details labels --- src/qt/qt_vmmanager_details.cpp | 4 ++ src/qt/qt_vmmanager_detailsection.cpp | 80 ++++++++++++++++++--------- src/qt/qt_vmmanager_detailsection.hpp | 1 + 3 files changed, 58 insertions(+), 27 deletions(-) diff --git a/src/qt/qt_vmmanager_details.cpp b/src/qt/qt_vmmanager_details.cpp index 396997e7d..59491d89e 100644 --- a/src/qt/qt_vmmanager_details.cpp +++ b/src/qt/qt_vmmanager_details.cpp @@ -263,6 +263,8 @@ VMManagerDetails::updateConfig(VMManagerSystem *passed_sysconfig) // * First you clear it with VMManagerDetailSection::clear() // * Then you add each line with VMManagerDetailSection::addSection() + setUpdatesEnabled(false); + // System systemSection->clear(); systemSection->addSection("Machine", passed_sysconfig->getDisplayValue(VMManager::Display::Name::Machine)); @@ -320,6 +322,8 @@ VMManagerDetails::updateConfig(VMManagerSystem *passed_sysconfig) inputSection->setSections(); portsSection->setSections(); otherSection->setSections(); + + setUpdatesEnabled(true); } void diff --git a/src/qt/qt_vmmanager_detailsection.cpp b/src/qt/qt_vmmanager_detailsection.cpp index 0b19f77cd..a025abb06 100644 --- a/src/qt/qt_vmmanager_detailsection.cpp +++ b/src/qt/qt_vmmanager_detailsection.cpp @@ -39,6 +39,10 @@ VMManagerDetailSection:: ui->setupUi(this); frameGridLayout = new QGridLayout(); + frameGridLayout->setContentsMargins(getMargins(MarginSection::DisplayGrid)); + ui->detailFrame->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); + ui->detailFrame->setLayout(frameGridLayout); + // Create the collapse button, set the name and add it to the layout collapseButton = new CollapseButton(); setSectionName(sectionName); @@ -128,6 +132,8 @@ VMManagerDetailSection:: innerFrameLayout->addWidget(buttonWidget); innerFrameLayout->addWidget(frame); setLayout(outerFrameLayout); + + usedRows = 0; } VMManagerDetailSection::~VMManagerDetailSection() @@ -156,6 +162,7 @@ VMManagerDetailSection::setupMainLayout() delete mainLayout; mainLayout = new QVBoxLayout; } + void VMManagerDetailSection::setSections() { @@ -172,52 +179,71 @@ VMManagerDetailSection::setSections() continue; } - const auto labelValue = new QLabel(); - labelValue->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); - labelValue->setTextInteractionFlags(labelValue->textInteractionFlags() | Qt::TextSelectableByMouse); - labelValue->setText(line); - frameGridLayout->addWidget(labelValue, row, 1, Qt::AlignLeft); + auto item = frameGridLayout->itemAtPosition(row, 1); + auto label = item ? ((QLabel *) item->widget()) : nullptr; + if (label) { + label->setVisible(true); + } else { + label = new QLabel(); + label->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); + label->setTextInteractionFlags(label->textInteractionFlags() | Qt::TextSelectableByMouse); + frameGridLayout->addWidget(label, row, 1, Qt::AlignLeft); + } + label->setText(line); + item = frameGridLayout->itemAtPosition(row, 0); if (!labelKey) { - labelKey = new QLabel(); - labelKey->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); - labelKey->setTextInteractionFlags(labelValue->textInteractionFlags()); + if (item) + labelKey = (QLabel *) item->widget(); + if (labelKey) { + labelKey->setVisible(true); + } else { + labelKey = new QLabel(); + labelKey->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); + labelKey->setText(QCoreApplication::translate("", QString(section.name + ":").toUtf8().data())); + frameGridLayout->addWidget(labelKey, row, 0, Qt::AlignLeft); + } labelKey->setText(QCoreApplication::translate("", QString(section.name + ":").toUtf8().data())); - frameGridLayout->addWidget(labelKey, row, 0, Qt::AlignLeft); + } else if (item) { + label = (QLabel *) item->widget(); + if (label) + label->setVisible(false); + } + + item = frameGridLayout->itemAtPosition(row, 2); + if (!item || !item->widget()) { + const auto hSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum); + frameGridLayout->addItem(hSpacer, row, 2); } - const auto hSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum); - frameGridLayout->addItem(hSpacer, row, 2); empty = false; row++; } } + int prevUsedRows = usedRows; + usedRows = row; + for (; row < prevUsedRows; row++) { + for (int i = 0; i <= 2; i++) { + auto item = frameGridLayout->itemAtPosition(row, i); + if (item) { + auto widget = item->widget(); + if (widget) + widget->setVisible(false); + } + } + } + collapseButton->setContent(ui->detailFrame); if (!empty) setVisible(true); } + void VMManagerDetailSection::clear() { sections.clear(); setVisible(false); - - // Clear everything out - if (frameGridLayout) { - while (frameGridLayout->count()) { - QLayoutItem *cur_item = frameGridLayout->takeAt(0); - if (cur_item->widget()) - delete cur_item->widget(); - delete cur_item; - } - } - - delete frameGridLayout; - frameGridLayout = new QGridLayout(); - frameGridLayout->setContentsMargins(getMargins(MarginSection::DisplayGrid)); - ui->detailFrame->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); - ui->detailFrame->setLayout(frameGridLayout); } #ifdef Q_OS_WINDOWS diff --git a/src/qt/qt_vmmanager_detailsection.hpp b/src/qt/qt_vmmanager_detailsection.hpp index 71a3c992e..39ec51f16 100644 --- a/src/qt/qt_vmmanager_detailsection.hpp +++ b/src/qt/qt_vmmanager_detailsection.hpp @@ -91,6 +91,7 @@ private: static QMargins getMargins(MarginSection section); QString sectionName; + int usedRows; struct DetailSection { QString name;