QmlDesigner: Fix invalid path hang up

Fix issue where an invalid path results in QDir being set to "." which
in some cases results in iterating a huge amount of files ultimately
causing QtDS to stall.

Task-number: QDS-9437
Change-Id: I0f868f1a94341fbd4d18e98de012ecd5d2a6423a
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
(cherry picked from commit 9b4decf9af)
This commit is contained in:
Henning Gruendl
2023-03-16 10:55:47 +01:00
committed by Tim Jenssen
parent ee72b1099b
commit 9f725de283
2 changed files with 20 additions and 25 deletions

View File

@@ -51,7 +51,7 @@ void FileResourcesModel::setModelNodeBackend(const QVariant &modelNodeBackend)
QmlDesigner::DocumentManager::currentProjectDirPath().toFileInfo().absoluteFilePath()); QmlDesigner::DocumentManager::currentProjectDirPath().toFileInfo().absoluteFilePath());
} }
setupModel(); refreshModel();
emit modelNodeBackendChanged(); emit modelNodeBackendChanged();
} }
@@ -78,7 +78,7 @@ void FileResourcesModel::setFileName(const QUrl &fileName)
void FileResourcesModel::setPath(const QUrl &url) void FileResourcesModel::setPath(const QUrl &url)
{ {
m_path = url; m_path = url;
setupModel(); refreshModel();
emit pathChanged(url); emit pathChanged(url);
} }
@@ -99,7 +99,7 @@ void FileResourcesModel::setFilter(const QString &filter)
return; return;
m_filter = filter; m_filter = filter;
setupModel(); refreshModel();
emit filterChanged(filter); emit filterChanged(filter);
} }
@@ -201,33 +201,30 @@ bool filterMetaIcons(const QString &fileName)
return true; return true;
} }
void FileResourcesModel::setupModel()
{
m_dirPath = QDir(m_path.toLocalFile());
refreshModel();
}
void FileResourcesModel::refreshModel() void FileResourcesModel::refreshModel()
{ {
m_model.clear(); m_model.clear();
QStringList filterList = m_filter.split(QLatin1Char(' ')); if (m_path.isValid()) {
const QDir dirPath = QDir(m_path.toLocalFile());
const QStringList filterList = m_filter.split(QLatin1Char(' '));
QDirIterator it(m_dirPath.absolutePath(), filterList, QDir::Files, QDirIterator::Subdirectories); QDirIterator it(dirPath.absolutePath(), filterList, QDir::Files, QDirIterator::Subdirectories);
while (it.hasNext()) { while (it.hasNext()) {
QString absolutePath = it.next(); const QString absolutePath = it.next();
if (filterMetaIcons(absolutePath)) { if (filterMetaIcons(absolutePath)) {
QString relativeFilePath = m_docPath.relativeFilePath(absolutePath); const QString relativeFilePath = m_docPath.relativeFilePath(absolutePath);
m_model.append( m_model.append(
FileResourcesItem(absolutePath, FileResourcesItem(absolutePath,
relativeFilePath, relativeFilePath,
relativeFilePath.mid(relativeFilePath.lastIndexOf('/') + 1))); relativeFilePath.mid(relativeFilePath.lastIndexOf('/') + 1)));
}
} }
}
Utils::sort(m_model, [](const FileResourcesItem &i1, const FileResourcesItem &i2) { Utils::sort(m_model, [](const FileResourcesItem &i1, const FileResourcesItem &i2) {
return i1.fileName().toLower() < i2.fileName().toLower(); return i1.fileName().toLower() < i2.fileName().toLower();
}); });
}
emit modelChanged(); emit modelChanged();
} }

View File

@@ -67,7 +67,6 @@ public:
QString filter() const; QString filter() const;
QList<FileResourcesItem> model() const; QList<FileResourcesItem> model() const;
void setupModel();
void refreshModel(); void refreshModel();
Q_INVOKABLE void openFileDialog(); Q_INVOKABLE void openFileDialog();
@@ -89,7 +88,6 @@ private:
private: private:
QUrl m_fileName; QUrl m_fileName;
QUrl m_path; QUrl m_path;
QDir m_dirPath;
QDir m_docPath; QDir m_docPath;
QString m_filter; QString m_filter;
QString m_currentPath; QString m_currentPath;