aboutsummaryrefslogtreecommitdiff
path: root/launcher/minecraft/mod/ResourceFolderModel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'launcher/minecraft/mod/ResourceFolderModel.cpp')
-rw-r--r--launcher/minecraft/mod/ResourceFolderModel.cpp46
1 files changed, 32 insertions, 14 deletions
diff --git a/launcher/minecraft/mod/ResourceFolderModel.cpp b/launcher/minecraft/mod/ResourceFolderModel.cpp
index c27a5e2d..b7213c47 100644
--- a/launcher/minecraft/mod/ResourceFolderModel.cpp
+++ b/launcher/minecraft/mod/ResourceFolderModel.cpp
@@ -24,8 +24,6 @@ bool ResourceFolderModel::startWatching(const QStringList paths)
if (m_is_watching)
return false;
- update();
-
auto couldnt_be_watched = m_watcher.addPaths(paths);
for (auto path : paths) {
if (couldnt_be_watched.contains(path))
@@ -34,6 +32,8 @@ bool ResourceFolderModel::startWatching(const QStringList paths)
qDebug() << "Started watching " << path;
}
+ update();
+
m_is_watching = !m_is_watching;
return m_is_watching;
}
@@ -105,7 +105,8 @@ bool ResourceFolderModel::installResource(QString original_path)
QFileInfo new_path_file_info(new_path);
resource.setFile(new_path_file_info);
- update();
+ if (!m_is_watching)
+ return update();
return true;
}
@@ -123,7 +124,8 @@ bool ResourceFolderModel::installResource(QString original_path)
QFileInfo newpathInfo(new_path);
resource.setFile(newpathInfo);
- update();
+ if (!m_is_watching)
+ return update();
return true;
}
@@ -136,8 +138,13 @@ bool ResourceFolderModel::installResource(QString original_path)
bool ResourceFolderModel::uninstallResource(QString file_name)
{
for (auto& resource : m_resources) {
- if (resource->fileinfo().fileName() == file_name)
- return resource->destroy();
+ if (resource->fileinfo().fileName() == file_name) {
+ auto res = resource->destroy();
+
+ update();
+
+ return res;
+ }
}
return false;
}
@@ -156,13 +163,21 @@ bool ResourceFolderModel::deleteResources(const QModelIndexList& indexes)
}
auto& resource = m_resources.at(i.row());
+
resource->destroy();
}
+
+ update();
+
return true;
}
+static QMutex s_update_task_mutex;
bool ResourceFolderModel::update()
{
+ // We hold a lock here to prevent race conditions on the m_current_update_task reset.
+ QMutexLocker lock(&s_update_task_mutex);
+
// Already updating, so we schedule a future update and return.
if (m_current_update_task) {
m_scheduled_update = true;
@@ -183,7 +198,7 @@ bool ResourceFolderModel::update()
return true;
}
-void ResourceFolderModel::resolveResource(Resource::WeakPtr res)
+void ResourceFolderModel::resolveResource(Resource::Ptr res)
{
if (!res->shouldResolve()) {
return;
@@ -205,6 +220,8 @@ void ResourceFolderModel::resolveResource(Resource::WeakPtr res)
task, &Task::succeeded, this, [=] { onParseSucceeded(ticket, res->internal_id()); }, Qt::ConnectionType::QueuedConnection);
connect(
task, &Task::failed, this, [=] { onParseFailed(ticket, res->internal_id()); }, Qt::ConnectionType::QueuedConnection);
+ connect(
+ task, &Task::finished, this, [=] { m_active_parse_tasks.remove(ticket); }, Qt::ConnectionType::QueuedConnection);
auto* thread_pool = QThreadPool::globalInstance();
thread_pool->start(task);
@@ -229,15 +246,13 @@ void ResourceFolderModel::onUpdateSucceeded()
applyUpdates(current_set, new_set, new_resources);
- update_results.reset();
- m_current_update_task->deleteLater();
m_current_update_task.reset();
- emit updateFinished();
-
if (m_scheduled_update) {
m_scheduled_update = false;
update();
+ } else {
+ emit updateFinished();
}
}
@@ -247,9 +262,6 @@ void ResourceFolderModel::onParseSucceeded(int ticket, QString resource_id)
if (iter == m_active_parse_tasks.constEnd())
return;
- (*iter)->deleteLater();
- m_active_parse_tasks.remove(ticket);
-
int row = m_resources_index[resource_id];
emit dataChanged(index(row), index(row, columnCount(QModelIndex()) - 1));
}
@@ -259,6 +271,12 @@ Task* ResourceFolderModel::createUpdateTask()
return new BasicFolderLoadTask(m_dir);
}
+
+bool ResourceFolderModel::hasPendingParseTasks() const
+{
+ return !m_active_parse_tasks.isEmpty();
+}
+
void ResourceFolderModel::directoryChanged(QString path)
{
update();