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);