From d3d7bd33f8eb4996cf198c430bb2e4fa4bf518eb Mon Sep 17 00:00:00 2001 From: nmzik Date: Sat, 12 Sep 2026 17:28:00 +0400 Subject: [PATCH] launcher: Add game size column --- .../forms/configuration_list_widget.ui | 5 +++ src/launcher/src/configurationItem.cpp | 36 +++++++++++++++++++ src/launcher/src/configurationListWidget.cpp | 8 +++-- 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/launcher/forms/configuration_list_widget.ui b/src/launcher/forms/configuration_list_widget.ui index 54f1fac53..da469e489 100644 --- a/src/launcher/forms/configuration_list_widget.ui +++ b/src/launcher/forms/configuration_list_widget.ui @@ -218,6 +218,11 @@ Firmware Version + + + Size + + Path diff --git a/src/launcher/src/configurationItem.cpp b/src/launcher/src/configurationItem.cpp index 9836b9a9f..497cf3ac1 100644 --- a/src/launcher/src/configurationItem.cpp +++ b/src/launcher/src/configurationItem.cpp @@ -5,12 +5,15 @@ #include #include #include +#include #include #include +#include #include #include #include #include +#include #include #include #include @@ -18,6 +21,7 @@ #include #include #include +#include namespace { @@ -26,6 +30,7 @@ enum Column { SerialColumn, GameVersionColumn, FirmwareVersionColumn, + SizeColumn, PathColumn, StatusColumn, CommentsColumn, @@ -155,6 +160,34 @@ ConfigurationItem::ConfigurationItem(std::unique_ptr info, QTreeW Update(); SetRunning(false); + + setData(SizeColumn, Qt::UserRole, qint64(-1)); + setText(SizeColumn, QStringLiteral("\u2014")); + auto* watcher = new QFutureWatcher(this); + connect(watcher, &QFutureWatcher::finished, this, [this, watcher]() { + const auto bytes = watcher->result(); + setData(SizeColumn, Qt::UserRole, bytes); + if (bytes >= 0) { + setText(SizeColumn, + QLocale().formattedDataSize(bytes, 2, QLocale::DataSizeTraditionalFormat)); + } + watcher->deleteLater(); + }); + watcher->setFuture(QtConcurrent::run([path = m_info->basedir]() -> qint64 { + if (path.isEmpty() || !QDir(path).exists()) { + return -1; + } + qint64 bytes = 0; + QDirIterator files(path, QDir::Files | QDir::Hidden | QDir::System | QDir::NoSymLinks, + QDirIterator::Subdirectories); + while (files.hasNext()) { + files.next(); + if (files.fileInfo().isFile()) { + bytes += files.fileInfo().size(); + } + } + return bytes; + })); } ConfigurationItem::~ConfigurationItem() = default; @@ -193,6 +226,9 @@ bool ConfigurationItem::operator<(const QTreeWidgetItem& other) const { const int column = treeWidget() != nullptr ? treeWidget()->sortColumn() : NameColumn; switch (column) { case NameColumn: return GetSortText(*m_info) < GetSortText(*other_item->m_info); + case SizeColumn: + return data(SizeColumn, Qt::UserRole).toLongLong() < + other.data(SizeColumn, Qt::UserRole).toLongLong(); case StatusColumn: return GetStatusText(m_info->game_status) < GetStatusText(other_item->m_info->game_status); diff --git a/src/launcher/src/configurationListWidget.cpp b/src/launcher/src/configurationListWidget.cpp index 182042125..de608000c 100644 --- a/src/launcher/src/configurationListWidget.cpp +++ b/src/launcher/src/configurationListWidget.cpp @@ -61,9 +61,10 @@ constexpr int GAME_NAME_COLUMN = 0; constexpr int GAME_SERIAL_COLUMN = 1; constexpr int GAME_VERSION_COLUMN = 2; constexpr int GAME_FIRMWARE_VERSION_COLUMN = 3; -constexpr int GAME_PATH_COLUMN = 4; -constexpr int GAME_STATUS_COLUMN = 5; -constexpr int GAME_COMMENT_COLUMN = 6; +constexpr int GAME_SIZE_COLUMN = 4; +constexpr int GAME_PATH_COLUMN = 5; +constexpr int GAME_STATUS_COLUMN = 6; +constexpr int GAME_COMMENT_COLUMN = 7; static QString NormalizeGameDirectory(const QString& dir) { const auto trimmed = dir.trimmed(); @@ -217,6 +218,7 @@ ConfigurationListWidget::ConfigurationListWidget(QWidget* parent) m_ui->cfgs_list->setColumnWidth(GAME_SERIAL_COLUMN, 110); m_ui->cfgs_list->setColumnWidth(GAME_VERSION_COLUMN, 120); m_ui->cfgs_list->setColumnWidth(GAME_FIRMWARE_VERSION_COLUMN, 150); + m_ui->cfgs_list->setColumnWidth(GAME_SIZE_COLUMN, 100); m_ui->cfgs_list->setColumnWidth(GAME_PATH_COLUMN, 320); m_ui->cfgs_list->setColumnWidth(GAME_STATUS_COLUMN, 150); m_ui->cfgs_list->setColumnWidth(GAME_COMMENT_COLUMN, 240);