From 0fc22b2b2de8d643577095b11717de12036974d7 Mon Sep 17 00:00:00 2001 From: elsid Date: Sun, 4 May 2025 17:19:50 +0200 Subject: [PATCH 1/3] Check selected files existence in the reload cells thread This reduces UI reponse time. --- apps/launcher/datafilespage.cpp | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/apps/launcher/datafilespage.cpp b/apps/launcher/datafilespage.cpp index f5c0694a3b..9f92e8ed0f 100644 --- a/apps/launcher/datafilespage.cpp +++ b/apps/launcher/datafilespage.cpp @@ -1001,7 +1001,11 @@ bool Launcher::DataFilesPage::showDeleteMessageBox(const QString& text) void Launcher::DataFilesPage::slotAddonDataChanged() { - QStringList selectedFiles = selectedFilePaths(); + const ContentSelectorModel::ContentFileList items = mSelector->selectedFiles(); + QStringList selectedFiles; + for (const ContentSelectorModel::EsmFile* item : items) + selectedFiles.append(item->filePath()); + if (mSelectedFiles != selectedFiles) { const std::lock_guard lock(mReloadCellsMutex); @@ -1013,6 +1017,7 @@ void Launcher::DataFilesPage::slotAddonDataChanged() void Launcher::DataFilesPage::reloadCells() { + QStringList selectedFiles; std::unique_lock lock(mReloadCellsMutex); while (true) @@ -1025,16 +1030,26 @@ void Launcher::DataFilesPage::reloadCells() if (!std::exchange(mReloadCells, false)) continue; - QStringList selectedFiles = mSelectedFiles; + const QStringList newSelectedFiles = mSelectedFiles; lock.unlock(); - CellNameLoader cellNameLoader; - QSet set = cellNameLoader.getCellNames(selectedFiles); - QStringList cellNamesList(set.begin(), set.end()); - std::sort(cellNamesList.begin(), cellNamesList.end()); + QStringList filteredFiles; + for (const QString& v : newSelectedFiles) + if (QFile::exists(v)) + filteredFiles.append(v); - emit signalLoadedCellsChanged(std::move(cellNamesList)); + if (selectedFiles != filteredFiles) + { + selectedFiles = std::move(filteredFiles); + + CellNameLoader cellNameLoader; + QSet set = cellNameLoader.getCellNames(selectedFiles); + QStringList cellNamesList(set.begin(), set.end()); + std::sort(cellNamesList.begin(), cellNamesList.end()); + + emit signalLoadedCellsChanged(std::move(cellNamesList)); + } lock.lock(); From 3955428f879da38934f84678c3d72eabaac9e7db Mon Sep 17 00:00:00 2001 From: elsid Date: Sat, 17 May 2025 13:46:06 +0200 Subject: [PATCH 2/3] Show progress dialog on updating content selection --- .../contentselector/view/contentselector.cpp | 23 ++++++++++++------- .../contentselector/view/contentselector.hpp | 2 +- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/components/contentselector/view/contentselector.cpp b/components/contentselector/view/contentselector.cpp index 42851e1e21..f8374b5db5 100644 --- a/components/contentselector/view/contentselector.cpp +++ b/components/contentselector/view/contentselector.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include ContentSelectorView::ContentSelector::ContentSelector(QWidget* parent, bool showOMWScripts) @@ -292,27 +293,33 @@ void ContentSelectorView::ContentSelector::slotShowContextMenu(const QPoint& pos mContextMenu->exec(globalPos); } -void ContentSelectorView::ContentSelector::setCheckStateForMultiSelectedItems(bool checked) +void ContentSelectorView::ContentSelector::setCheckStateForMultiSelectedItems(Qt::CheckState checkState) { - Qt::CheckState checkState = checked ? Qt::Checked : Qt::Unchecked; - for (const QModelIndex& index : ui->addonView->selectionModel()->selectedIndexes()) + const QModelIndexList selectedIndexes = ui->addonView->selectionModel()->selectedIndexes(); + + QProgressDialog progressDialog("Updating content selection", {}, 0, static_cast(selectedIndexes.size())); + progressDialog.setWindowModality(Qt::WindowModal); + progressDialog.setValue(0); + + for (qsizetype i = 0, n = selectedIndexes.size(); i < n; ++i) { - QModelIndex sourceIndex = mAddonProxyModel->mapToSource(index); + const QModelIndex sourceIndex = mAddonProxyModel->mapToSource(selectedIndexes[i]); + if (mContentModel->data(sourceIndex, Qt::CheckStateRole).toInt() != checkState) - { mContentModel->setData(sourceIndex, checkState, Qt::CheckStateRole); - } + + progressDialog.setValue(static_cast(i + 1)); } } void ContentSelectorView::ContentSelector::slotUncheckMultiSelectedItems() { - setCheckStateForMultiSelectedItems(false); + setCheckStateForMultiSelectedItems(Qt::Unchecked); } void ContentSelectorView::ContentSelector::slotCheckMultiSelectedItems() { - setCheckStateForMultiSelectedItems(true); + setCheckStateForMultiSelectedItems(Qt::Checked); } void ContentSelectorView::ContentSelector::slotCopySelectedItemsPaths() diff --git a/components/contentselector/view/contentselector.hpp b/components/contentselector/view/contentselector.hpp index 2fdd38c799..fde2d063c1 100644 --- a/components/contentselector/view/contentselector.hpp +++ b/components/contentselector/view/contentselector.hpp @@ -69,7 +69,7 @@ namespace ContentSelectorView void buildAddonView(); void buildContextMenu(); void setGameFileSelected(int index, bool selected); - void setCheckStateForMultiSelectedItems(bool checked); + void setCheckStateForMultiSelectedItems(Qt::CheckState checkState); signals: void signalCurrentGamefileIndexChanged(int); From 157e8c763c10a24cfb24fe5b738ddcf6faa3c3a8 Mon Sep 17 00:00:00 2001 From: elsid Date: Wed, 21 May 2025 22:07:17 +0200 Subject: [PATCH 3/3] Show progress dialog for setting content list --- components/contentselector/model/contentmodel.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/components/contentselector/model/contentmodel.cpp b/components/contentselector/model/contentmodel.cpp index 4309850f2d..6f5772986e 100644 --- a/components/contentselector/model/contentmodel.cpp +++ b/components/contentselector/model/contentmodel.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -707,10 +708,14 @@ bool ContentSelectorModel::ContentModel::isLoadOrderError(const EsmFile* file) c void ContentSelectorModel::ContentModel::setContentList(const QStringList& fileList) { + QProgressDialog progressDialog("Setting content list", {}, 0, static_cast(fileList.size())); + progressDialog.setWindowModality(Qt::WindowModal); + progressDialog.setValue(0); + int previousPosition = -1; - for (const QString& filepath : fileList) + for (qsizetype i = 0, n = fileList.size(); i < n; ++i) { - const EsmFile* file = item(filepath); + const EsmFile* file = item(fileList[i]); if (setCheckState(file, true)) { // setCheckState already gracefully handles builtIn and fromAnotherConfigFile @@ -725,7 +730,10 @@ void ContentSelectorModel::ContentModel::setContentList(const QStringList& fileL previousPosition = filePosition; } } + + progressDialog.setValue(static_cast(i + 1)); } + refreshModel(); }