Skip to content

Commit 2342dbe

Browse files
committed
Merge branch 'fix_launcher_ui_freeze' into 'master'
Make launcher UI on content files selection more responsive (#8478) See merge request OpenMW/openmw!4682
2 parents 6ef3c08 + 157e8c7 commit 2342dbe

File tree

4 files changed

+48
-18
lines changed

4 files changed

+48
-18
lines changed

apps/launcher/datafilespage.cpp

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1001,7 +1001,11 @@ bool Launcher::DataFilesPage::showDeleteMessageBox(const QString& text)
10011001

10021002
void Launcher::DataFilesPage::slotAddonDataChanged()
10031003
{
1004-
QStringList selectedFiles = selectedFilePaths();
1004+
const ContentSelectorModel::ContentFileList items = mSelector->selectedFiles();
1005+
QStringList selectedFiles;
1006+
for (const ContentSelectorModel::EsmFile* item : items)
1007+
selectedFiles.append(item->filePath());
1008+
10051009
if (mSelectedFiles != selectedFiles)
10061010
{
10071011
const std::lock_guard lock(mReloadCellsMutex);
@@ -1013,6 +1017,7 @@ void Launcher::DataFilesPage::slotAddonDataChanged()
10131017

10141018
void Launcher::DataFilesPage::reloadCells()
10151019
{
1020+
QStringList selectedFiles;
10161021
std::unique_lock lock(mReloadCellsMutex);
10171022

10181023
while (true)
@@ -1025,16 +1030,26 @@ void Launcher::DataFilesPage::reloadCells()
10251030
if (!std::exchange(mReloadCells, false))
10261031
continue;
10271032

1028-
QStringList selectedFiles = mSelectedFiles;
1033+
const QStringList newSelectedFiles = mSelectedFiles;
10291034

10301035
lock.unlock();
10311036

1032-
CellNameLoader cellNameLoader;
1033-
QSet<QString> set = cellNameLoader.getCellNames(selectedFiles);
1034-
QStringList cellNamesList(set.begin(), set.end());
1035-
std::sort(cellNamesList.begin(), cellNamesList.end());
1037+
QStringList filteredFiles;
1038+
for (const QString& v : newSelectedFiles)
1039+
if (QFile::exists(v))
1040+
filteredFiles.append(v);
1041+
1042+
if (selectedFiles != filteredFiles)
1043+
{
1044+
selectedFiles = std::move(filteredFiles);
1045+
1046+
CellNameLoader cellNameLoader;
1047+
QSet<QString> set = cellNameLoader.getCellNames(selectedFiles);
1048+
QStringList cellNamesList(set.begin(), set.end());
1049+
std::sort(cellNamesList.begin(), cellNamesList.end());
10361050

1037-
emit signalLoadedCellsChanged(std::move(cellNamesList));
1051+
emit signalLoadedCellsChanged(std::move(cellNamesList));
1052+
}
10381053

10391054
lock.lock();
10401055

components/contentselector/model/contentmodel.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <QDirIterator>
1414
#include <QFont>
1515
#include <QIODevice>
16+
#include <QProgressDialog>
1617

1718
#include <components/esm/format.hpp>
1819
#include <components/esm3/esmreader.hpp>
@@ -696,10 +697,14 @@ bool ContentSelectorModel::ContentModel::isLoadOrderError(const EsmFile* file) c
696697

697698
void ContentSelectorModel::ContentModel::setContentList(const QStringList& fileList)
698699
{
700+
QProgressDialog progressDialog("Setting content list", {}, 0, static_cast<int>(fileList.size()));
701+
progressDialog.setWindowModality(Qt::WindowModal);
702+
progressDialog.setValue(0);
703+
699704
int previousPosition = -1;
700-
for (const QString& filepath : fileList)
705+
for (qsizetype i = 0, n = fileList.size(); i < n; ++i)
701706
{
702-
const EsmFile* file = item(filepath);
707+
const EsmFile* file = item(fileList[i]);
703708
if (setCheckState(file, true))
704709
{
705710
// setCheckState already gracefully handles builtIn and fromAnotherConfigFile
@@ -714,7 +719,10 @@ void ContentSelectorModel::ContentModel::setContentList(const QStringList& fileL
714719
previousPosition = filePosition;
715720
}
716721
}
722+
723+
progressDialog.setValue(static_cast<int>(i + 1));
717724
}
725+
718726
refreshModel();
719727
}
720728

components/contentselector/view/contentselector.cpp

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <QClipboard>
88
#include <QMenu>
99
#include <QModelIndex>
10+
#include <QProgressDialog>
1011
#include <QSortFilterProxyModel>
1112

1213
ContentSelectorView::ContentSelector::ContentSelector(QWidget* parent, bool showOMWScripts)
@@ -292,27 +293,33 @@ void ContentSelectorView::ContentSelector::slotShowContextMenu(const QPoint& pos
292293
mContextMenu->exec(globalPos);
293294
}
294295

295-
void ContentSelectorView::ContentSelector::setCheckStateForMultiSelectedItems(bool checked)
296+
void ContentSelectorView::ContentSelector::setCheckStateForMultiSelectedItems(Qt::CheckState checkState)
296297
{
297-
Qt::CheckState checkState = checked ? Qt::Checked : Qt::Unchecked;
298-
for (const QModelIndex& index : ui->addonView->selectionModel()->selectedIndexes())
298+
const QModelIndexList selectedIndexes = ui->addonView->selectionModel()->selectedIndexes();
299+
300+
QProgressDialog progressDialog("Updating content selection", {}, 0, static_cast<int>(selectedIndexes.size()));
301+
progressDialog.setWindowModality(Qt::WindowModal);
302+
progressDialog.setValue(0);
303+
304+
for (qsizetype i = 0, n = selectedIndexes.size(); i < n; ++i)
299305
{
300-
QModelIndex sourceIndex = mAddonProxyModel->mapToSource(index);
306+
const QModelIndex sourceIndex = mAddonProxyModel->mapToSource(selectedIndexes[i]);
307+
301308
if (mContentModel->data(sourceIndex, Qt::CheckStateRole).toInt() != checkState)
302-
{
303309
mContentModel->setData(sourceIndex, checkState, Qt::CheckStateRole);
304-
}
310+
311+
progressDialog.setValue(static_cast<int>(i + 1));
305312
}
306313
}
307314

308315
void ContentSelectorView::ContentSelector::slotUncheckMultiSelectedItems()
309316
{
310-
setCheckStateForMultiSelectedItems(false);
317+
setCheckStateForMultiSelectedItems(Qt::Unchecked);
311318
}
312319

313320
void ContentSelectorView::ContentSelector::slotCheckMultiSelectedItems()
314321
{
315-
setCheckStateForMultiSelectedItems(true);
322+
setCheckStateForMultiSelectedItems(Qt::Checked);
316323
}
317324

318325
void ContentSelectorView::ContentSelector::slotCopySelectedItemsPaths()

components/contentselector/view/contentselector.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ namespace ContentSelectorView
6969
void buildAddonView();
7070
void buildContextMenu();
7171
void setGameFileSelected(int index, bool selected);
72-
void setCheckStateForMultiSelectedItems(bool checked);
72+
void setCheckStateForMultiSelectedItems(Qt::CheckState checkState);
7373

7474
signals:
7575
void signalCurrentGamefileIndexChanged(int);

0 commit comments

Comments
 (0)