Manager: Cache listview icon and color objects to improve performance

This commit is contained in:
RichardG867
2025-08-20 15:45:20 -03:00
parent 2eb8630578
commit 14172b3d39
2 changed files with 32 additions and 14 deletions

View File

@@ -34,6 +34,15 @@ VMManagerListViewDelegate::VMManagerListViewDelegate(QObject *parent)
: QStyledItemDelegate(parent),
m_ptr(new VMManagerListViewDelegateStyle)
{
default_icon = QIcon(":/settings/qt/icons/86Box-gray.ico");
stop_icon = QApplication::style()->standardIcon(QStyle::SP_MediaStop);
running_icon = QIcon(":/menuicons/qt/icons/run.ico");
stopped_icon = QIcon(":/menuicons/qt/icons/acpi_shutdown.ico");
paused_icon = QIcon(":/menuicons/qt/icons/pause.ico");
unknown_icon = QApplication::style()->standardIcon(QStyle::SP_MessageBoxQuestion);
highlight_color = QColor("#616161");
bg_color = QColor("#272727");
}
VMManagerListViewDelegate::~VMManagerListViewDelegate()
@@ -56,34 +65,33 @@ void VMManagerListViewDelegate::paint(QPainter *painter, const QStyleOptionViewI
-m_ptr->margins.bottom()));
// The status icon represents the current state of the vm. Initially set to a default state.
QIcon status_icon = QApplication::style()->standardIcon(QStyle::SP_MediaStop);
auto process_variant = index.data(VMManagerModel::Roles::ProcessStatus);
auto process_status = process_variant.value<VMManagerSystem::ProcessStatus>();
// The main icon, configurable. Falls back to default if it cannot be loaded.
auto customIcom = index.data(VMManagerModel::Roles::Icon).toString();
opt.icon = QIcon(":/settings/qt/icons/86Box-gray.ico");
if(!customIcom.isEmpty()) {
if (const auto customPixmap = QPixmap(customIcom); !customPixmap.isNull()) {
auto customIcon = index.data(VMManagerModel::Roles::Icon).toString();
opt.icon = default_icon;
if (!customIcon.isEmpty()) {
const auto customPixmap = QPixmap(customIcon);
if (!customPixmap.isNull())
opt.icon = customPixmap;
}
}
// opt.icon = QIcon(":/settings/qt/icons/86Box-gray.ico");
// Set the status icon based on the process status
QIcon status_icon;
switch(process_status) {
case VMManagerSystem::ProcessStatus::Running:
status_icon = QIcon(":/menuicons/qt/icons/run.ico");
status_icon = running_icon;
break;
case VMManagerSystem::ProcessStatus::Stopped:
status_icon = QIcon(":/menuicons/qt/icons/acpi_shutdown.ico");
status_icon = stopped_icon;
break;
case VMManagerSystem::ProcessStatus::PausedWaiting:
case VMManagerSystem::ProcessStatus::RunningWaiting:
case VMManagerSystem::ProcessStatus::Paused:
status_icon = QIcon(":/menuicons/qt/icons/pause.ico");
status_icon = paused_icon;
break;
default:
status_icon = QApplication::style()->standardIcon(QStyle::SP_MessageBoxQuestion);
status_icon = unknown_icon;
}
@@ -105,13 +113,13 @@ void VMManagerListViewDelegate::paint(QPainter *painter, const QStyleOptionViewI
// When selected, only draw the highlighted part until the horizontal separator
int offset = 2;
auto highlightRect = rect.adjusted(0, 0, 0, -offset);
painter->fillRect(highlightRect, windows_light_mode ? palette.highlight().color() : QColor("#616161"));
painter->fillRect(highlightRect, windows_light_mode ? palette.highlight().color() : highlight_color);
// Then fill the remainder with the normal color
auto regularRect = rect.adjusted(0, rect.height()-offset, 0, 0);
painter->fillRect(regularRect, windows_light_mode ? palette.light().color() : QColor("#272727"));
painter->fillRect(regularRect, windows_light_mode ? palette.light().color() : bg_color);
} else {
// Otherwise just draw the background color as usual
painter->fillRect(rect, windows_light_mode ? palette.light().color() : QColor("#272727"));
painter->fillRect(rect, windows_light_mode ? palette.light().color() : bg_color);
}
// Draw bottom line. Last line gets a different color

View File

@@ -63,5 +63,15 @@ public:
const QModelIndex &index) const override;
private:
VMManagerListViewDelegateStyle *m_ptr;
QIcon default_icon;
QIcon stop_icon;
QIcon running_icon;
QIcon stopped_icon;
QIcon paused_icon;
QIcon unknown_icon;
QColor bg_color;
QColor highlight_color;
};
#endif // QT_VMMANAGER_LISTVIEWDELEGATE_H