Avoid expanding QRC nodes in main thread

For CMake and Qbs projects and users of TreeScanner, where the tree is
already created in a separate thread.

Expanding the QRC nodes means reading and parsing the QRC files, which
can take up a considerable time (second(s)) if there are hundreds of
them in a larger project like Qt Creator.

Task-number: QTCREATORBUG-25783
Change-Id: I5ca818b9f75ea6e8ef23f837cc9e15df7e6630e1
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Reviewed-by: Cristian Adam <cristian.adam@qt.io>
This commit is contained in:
Eike Ziller
2021-06-21 16:14:20 +02:00
parent 9109a6895e
commit 0bcab32657
4 changed files with 13 additions and 0 deletions

View File

@@ -33,6 +33,8 @@
#include <utils/qtcprocess.h> #include <utils/qtcprocess.h>
#include <utils/utilsicons.h> #include <utils/utilsicons.h>
#include <projectexplorer/projecttree.h>
#include <QDir> #include <QDir>
using namespace ProjectExplorer; using namespace ProjectExplorer;
@@ -708,6 +710,7 @@ FileApiQtcData extractData(FileApiData &input,
result.projectParts = generateRawProjectParts(data, sourceDirectory); result.projectParts = generateRawProjectParts(data, sourceDirectory);
auto pair = generateRootProjectNode(data, sourceDirectory, buildDirectory); auto pair = generateRootProjectNode(data, sourceDirectory, buildDirectory);
ProjectTree::applyTreeManager(pair.first.get()); // QRC nodes
result.rootProjectNode = std::move(pair.first); result.rootProjectNode = std::move(pair.first);
result.knownHeaders = std::move(pair.second); result.knownHeaders = std::move(pair.second);

View File

@@ -391,6 +391,11 @@ void ProjectTree::highlightProject(Project *project, const QString &message)
projectTreeWidget->showMessage(project->rootProjectNode(), message); projectTreeWidget->showMessage(project->rootProjectNode(), message);
} }
/*!
Registers the function \a treeChange to be run on a (sub tree of the)
project tree when it is created. The function must be thread-safe, and
applying the function on the same tree a second time must be a no-op.
*/
void ProjectTree::registerTreeManager(const TreeManagerFunction &treeChange) void ProjectTree::registerTreeManager(const TreeManagerFunction &treeChange)
{ {
if (treeChange) if (treeChange)

View File

@@ -27,6 +27,7 @@
#include "projectexplorerconstants.h" #include "projectexplorerconstants.h"
#include "projectnodeshelper.h" #include "projectnodeshelper.h"
#include "projecttree.h"
#include <coreplugin/iversioncontrol.h> #include <coreplugin/iversioncontrol.h>
#include <coreplugin/vcsmanager.h> #include <coreplugin/vcsmanager.h>
@@ -158,6 +159,7 @@ static std::unique_ptr<FolderNode> createFolderNode(const Utils::FilePath &direc
std::unique_ptr<FileNode> node(fn->clone()); std::unique_ptr<FileNode> node(fn->clone());
fileSystemNode->addNestedNode(std::move(node)); fileSystemNode->addNestedNode(std::move(node));
} }
ProjectTree::applyTreeManager(fileSystemNode.get()); // QRC nodes
return fileSystemNode; return fileSystemNode;
} }

View File

@@ -36,6 +36,8 @@
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <projectexplorer/projecttree.h>
using namespace ProjectExplorer; using namespace ProjectExplorer;
using namespace Utils; using namespace Utils;
@@ -230,6 +232,7 @@ QbsProjectNode *QbsNodeTreeBuilder::buildTree(const QString &projectName,
} }
buildSystemFiles->compress(); buildSystemFiles->compress();
root->addNode(std::move(buildSystemFiles)); root->addNode(std::move(buildSystemFiles));
ProjectTree::applyTreeManager(root.get()); // QRC nodes
return root.release(); return root.release();
} }