Modeling: Improve performance adding component model

Change-Id: I01dc0bcee200a239bd2b33ee97dc75569ded91a3
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
Jochen Becher
2017-05-26 16:09:35 +02:00
parent 261bb51ab0
commit dfce06c64d
2 changed files with 35 additions and 16 deletions

View File

@@ -116,6 +116,7 @@ class UpdateIncludeDependenciesVisitor :
public:
void setModelController(qmt::ModelController *modelController);
void updateFilePaths();
void visitMComponent(qmt::MComponent *component);
private:
@@ -130,6 +131,7 @@ private:
private:
qmt::ModelController *m_modelController = 0;
QMultiHash<QString, Node> m_filePaths;
};
void UpdateIncludeDependenciesVisitor::setModelController(qmt::ModelController *modelController)
@@ -137,6 +139,16 @@ void UpdateIncludeDependenciesVisitor::setModelController(qmt::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)
{
CppTools::CppModelManager *cppModelManager = CppTools::CppModelManager::instance();
@@ -254,12 +266,6 @@ bool UpdateIncludeDependenciesVisitor::haveMatchingStereotypes(const qmt::MObjec
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;
const qmt::MObject *ancestor = component->owner();
while (ancestor) {
@@ -268,7 +274,7 @@ QStringList UpdateIncludeDependenciesVisitor::findFilePathOfComponent(const qmt:
}
QStringList bestFilePaths;
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 j = node.m_elementPath.size() - 1;
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,
qmt::MDiagram *diagram,
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()) {
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())
createComponentModel(subNode, diagram, anchorFolder);
doCreateComponentModel(subNode, diagram, anchorFolder);
auto containerNode = dynamic_cast<const ProjectExplorer::ContainerNode *>(folderNode);
if (containerNode)
createComponentModel(containerNode->rootProjectNode(), diagram, anchorFolder);
}
void ComponentViewController::updateIncludeDependencies(qmt::MPackage *rootPackage)
{
UpdateIncludeDependenciesVisitor visitor;
visitor.setModelController(d->diagramSceneController->modelController());
rootPackage->accept(&visitor);
doCreateComponentModel(containerNode->rootProjectNode(), diagram, anchorFolder);
}
} // namespace Internal

View File

@@ -58,6 +58,9 @@ public:
void updateIncludeDependencies(qmt::MPackage *rootPackage);
private:
void doCreateComponentModel(const ProjectExplorer::FolderNode *folderNode,
qmt::MDiagram *diagram, const QString anchorFolder);
ComponentViewControllerPrivate *d;
};