fix: load world size async

Signed-off-by: Trial97 <alexandru.tripon97@gmail.com>
This commit is contained in:
Trial97 2025-04-17 23:31:25 +03:00
parent 6e00f94a57
commit efeaefbf2e
No known key found for this signature in database
GPG Key ID: 55EF5DA53DB36318
4 changed files with 51 additions and 18 deletions

View File

@ -198,22 +198,6 @@ bool putLevelDatDataToFS(const QFileInfo& file, QByteArray& data)
return f.commit();
}
int64_t calculateWorldSize(const QFileInfo& file)
{
if (file.isFile() && file.suffix() == "zip") {
return file.size();
} else if (file.isDir()) {
QDirIterator it(file.absoluteFilePath(), QDir::Files, QDirIterator::Subdirectories);
int64_t total = 0;
while (it.hasNext()) {
it.next();
total += it.fileInfo().size();
}
return total;
}
return -1;
}
World::World(const QFileInfo& file)
{
repath(file);
@ -223,7 +207,6 @@ void World::repath(const QFileInfo& file)
{
m_containerFile = file;
m_folderName = file.fileName();
m_size = calculateWorldSize(file);
if (file.isFile() && file.suffix() == "zip") {
m_iconFile = QString();
readFromZip(file);
@ -531,3 +514,8 @@ bool World::isMoreThanOneHardLink() const
}
return FS::hardLinkCount(m_containerFile.absoluteFilePath()) > 1;
}
void World::setSize(int64_t size)
{
m_size = size;
}

View File

@ -54,6 +54,8 @@ class World {
bool rename(const QString& to);
bool install(const QString& to, const QString& name = QString());
void setSize(int64_t size);
// WEAK compare operator - used for replacing worlds
bool operator==(const World& other) const;

View File

@ -37,13 +37,14 @@
#include <FileSystem.h>
#include <QDebug>
#include <QDirIterator>
#include <QFileSystemWatcher>
#include <QMimeData>
#include <QString>
#include <QThreadPool>
#include <QUrl>
#include <QUuid>
#include <Qt>
#include "Application.h"
WorldList::WorldList(const QString& dir, BaseInstance* instance) : QAbstractListModel(), m_instance(instance), m_dir(dir)
{
@ -103,6 +104,7 @@ bool WorldList::update()
beginResetModel();
m_worlds.swap(newWorlds);
endResetModel();
loadWorldsAsync();
return true;
}
@ -416,4 +418,44 @@ bool WorldList::dropMimeData(const QMimeData* data,
return false;
}
int64_t calculateWorldSize(const QFileInfo& file)
{
if (file.isFile() && file.suffix() == "zip") {
return file.size();
} else if (file.isDir()) {
QDirIterator it(file.absoluteFilePath(), QDir::Files, QDirIterator::Subdirectories);
int64_t total = 0;
while (it.hasNext()) {
it.next();
total += it.fileInfo().size();
}
return total;
}
return -1;
}
void WorldList::loadWorldsAsync()
{
for (int i = 0; i < m_worlds.size(); ++i) {
auto file = m_worlds.at(i).container();
int row = i;
QThreadPool::globalInstance()->start([this, file, row]() mutable {
auto size = calculateWorldSize(file);
QMetaObject::invokeMethod(
this,
[this, size, row, file]() {
if (row < m_worlds.size() && m_worlds[row].container() == file) {
m_worlds[row].setSize(size);
// Notify views
QModelIndex modelIndex = index(row);
emit dataChanged(modelIndex, modelIndex, { SizeRole });
}
},
Qt::QueuedConnection);
});
}
}
#include "WorldList.moc"

View File

@ -86,6 +86,7 @@ class WorldList : public QAbstractListModel {
private slots:
void directoryChanged(QString path);
void loadWorldsAsync();
signals:
void changed();