diff options
Diffstat (limited to 'launcher/minecraft/mod/ResourceFolderModel.cpp')
-rw-r--r-- | launcher/minecraft/mod/ResourceFolderModel.cpp | 46 |
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(); |