forked from qt-creator/qt-creator
Modeling: Improve performance adding component model
Change-Id: I01dc0bcee200a239bd2b33ee97dc75569ded91a3 Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
@@ -116,6 +116,7 @@ class UpdateIncludeDependenciesVisitor :
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
void setModelController(qmt::ModelController *modelController);
|
void setModelController(qmt::ModelController *modelController);
|
||||||
|
void updateFilePaths();
|
||||||
void visitMComponent(qmt::MComponent *component);
|
void visitMComponent(qmt::MComponent *component);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -130,6 +131,7 @@ private:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
qmt::ModelController *m_modelController = 0;
|
qmt::ModelController *m_modelController = 0;
|
||||||
|
QMultiHash<QString, Node> m_filePaths;
|
||||||
};
|
};
|
||||||
|
|
||||||
void UpdateIncludeDependenciesVisitor::setModelController(qmt::ModelController *modelController)
|
void UpdateIncludeDependenciesVisitor::setModelController(qmt::ModelController *modelController)
|
||||||
@@ -137,6 +139,16 @@ void UpdateIncludeDependenciesVisitor::setModelController(qmt::ModelController *
|
|||||||
m_modelController = modelController;
|
m_modelController = modelController;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UpdateIncludeDependenciesVisitor::updateFilePaths()
|
||||||
|
{
|
||||||
|
m_filePaths.clear();
|
||||||
|
for (const ProjectExplorer::Project *project : ProjectExplorer::SessionManager::projects()) {
|
||||||
|
ProjectExplorer::ProjectNode *projectNode = project->rootProjectNode();
|
||||||
|
if (projectNode)
|
||||||
|
collectElementPaths(projectNode, &m_filePaths);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void UpdateIncludeDependenciesVisitor::visitMComponent(qmt::MComponent *component)
|
void UpdateIncludeDependenciesVisitor::visitMComponent(qmt::MComponent *component)
|
||||||
{
|
{
|
||||||
CppTools::CppModelManager *cppModelManager = CppTools::CppModelManager::instance();
|
CppTools::CppModelManager *cppModelManager = CppTools::CppModelManager::instance();
|
||||||
@@ -254,12 +266,6 @@ bool UpdateIncludeDependenciesVisitor::haveMatchingStereotypes(const qmt::MObjec
|
|||||||
|
|
||||||
QStringList UpdateIncludeDependenciesVisitor::findFilePathOfComponent(const qmt::MComponent *component)
|
QStringList UpdateIncludeDependenciesVisitor::findFilePathOfComponent(const qmt::MComponent *component)
|
||||||
{
|
{
|
||||||
QMultiHash<QString, Node> filePaths;
|
|
||||||
for (const ProjectExplorer::Project *project : ProjectExplorer::SessionManager::projects()) {
|
|
||||||
ProjectExplorer::ProjectNode *projectNode = project->rootProjectNode();
|
|
||||||
if (projectNode)
|
|
||||||
collectElementPaths(projectNode, &filePaths);
|
|
||||||
}
|
|
||||||
QStringList elementPath;
|
QStringList elementPath;
|
||||||
const qmt::MObject *ancestor = component->owner();
|
const qmt::MObject *ancestor = component->owner();
|
||||||
while (ancestor) {
|
while (ancestor) {
|
||||||
@@ -268,7 +274,7 @@ QStringList UpdateIncludeDependenciesVisitor::findFilePathOfComponent(const qmt:
|
|||||||
}
|
}
|
||||||
QStringList bestFilePaths;
|
QStringList bestFilePaths;
|
||||||
int maxPathLength = 1;
|
int maxPathLength = 1;
|
||||||
foreach (const Node &node, filePaths.values(component->name())) {
|
foreach (const Node &node, m_filePaths.values(component->name())) {
|
||||||
int i = elementPath.size() - 1;
|
int i = elementPath.size() - 1;
|
||||||
int j = node.m_elementPath.size() - 1;
|
int j = node.m_elementPath.size() - 1;
|
||||||
while (i >= 0 && j >= 0 && elementPath.at(i) == node.m_elementPath.at(j)) {
|
while (i >= 0 && j >= 0 && elementPath.at(i) == node.m_elementPath.at(j)) {
|
||||||
@@ -378,6 +384,23 @@ void ComponentViewController::setDiagramSceneController(qmt::DiagramSceneControl
|
|||||||
void ComponentViewController::createComponentModel(const ProjectExplorer::FolderNode *folderNode,
|
void ComponentViewController::createComponentModel(const ProjectExplorer::FolderNode *folderNode,
|
||||||
qmt::MDiagram *diagram,
|
qmt::MDiagram *diagram,
|
||||||
const QString anchorFolder)
|
const QString anchorFolder)
|
||||||
|
{
|
||||||
|
d->diagramSceneController->modelController()->startResetModel();
|
||||||
|
doCreateComponentModel(folderNode, diagram, anchorFolder);
|
||||||
|
d->diagramSceneController->modelController()->finishResetModel(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ComponentViewController::updateIncludeDependencies(qmt::MPackage *rootPackage)
|
||||||
|
{
|
||||||
|
d->diagramSceneController->modelController()->startResetModel();
|
||||||
|
UpdateIncludeDependenciesVisitor visitor;
|
||||||
|
visitor.setModelController(d->diagramSceneController->modelController());
|
||||||
|
visitor.updateFilePaths();
|
||||||
|
rootPackage->accept(&visitor);
|
||||||
|
d->diagramSceneController->modelController()->finishResetModel(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ComponentViewController::doCreateComponentModel(const ProjectExplorer::FolderNode *folderNode, qmt::MDiagram *diagram, const QString anchorFolder)
|
||||||
{
|
{
|
||||||
foreach (const ProjectExplorer::FileNode *fileNode, folderNode->fileNodes()) {
|
foreach (const ProjectExplorer::FileNode *fileNode, folderNode->fileNodes()) {
|
||||||
QString componentName = qmt::NameController::convertFileNameToElementName(fileNode->filePath().toString());
|
QString componentName = qmt::NameController::convertFileNameToElementName(fileNode->filePath().toString());
|
||||||
@@ -422,17 +445,10 @@ void ComponentViewController::createComponentModel(const ProjectExplorer::Folder
|
|||||||
}
|
}
|
||||||
|
|
||||||
foreach (const ProjectExplorer::FolderNode *subNode, folderNode->folderNodes())
|
foreach (const ProjectExplorer::FolderNode *subNode, folderNode->folderNodes())
|
||||||
createComponentModel(subNode, diagram, anchorFolder);
|
doCreateComponentModel(subNode, diagram, anchorFolder);
|
||||||
auto containerNode = dynamic_cast<const ProjectExplorer::ContainerNode *>(folderNode);
|
auto containerNode = dynamic_cast<const ProjectExplorer::ContainerNode *>(folderNode);
|
||||||
if (containerNode)
|
if (containerNode)
|
||||||
createComponentModel(containerNode->rootProjectNode(), diagram, anchorFolder);
|
doCreateComponentModel(containerNode->rootProjectNode(), diagram, anchorFolder);
|
||||||
}
|
|
||||||
|
|
||||||
void ComponentViewController::updateIncludeDependencies(qmt::MPackage *rootPackage)
|
|
||||||
{
|
|
||||||
UpdateIncludeDependenciesVisitor visitor;
|
|
||||||
visitor.setModelController(d->diagramSceneController->modelController());
|
|
||||||
rootPackage->accept(&visitor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
|
|||||||
@@ -58,6 +58,9 @@ public:
|
|||||||
void updateIncludeDependencies(qmt::MPackage *rootPackage);
|
void updateIncludeDependencies(qmt::MPackage *rootPackage);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void doCreateComponentModel(const ProjectExplorer::FolderNode *folderNode,
|
||||||
|
qmt::MDiagram *diagram, const QString anchorFolder);
|
||||||
|
|
||||||
ComponentViewControllerPrivate *d;
|
ComponentViewControllerPrivate *d;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user