From bdc0e2924135328deaa4ac3635880dbd1348ff2c Mon Sep 17 00:00:00 2001 From: dt Date: Thu, 18 Nov 2010 17:31:30 +0100 Subject: [PATCH] FlatModel: The simplified tree did not react to hasBuildTarget changes Task-Nr: QTCREATORBUG-3014 Task-Nr: QTCREATORBUG-2821 --- src/plugins/projectexplorer/projectmodels.cpp | 32 ++++++++++++++++++- src/plugins/projectexplorer/projectmodels.h | 2 ++ src/plugins/projectexplorer/projectnodes.cpp | 12 +++++++ src/plugins/projectexplorer/projectnodes.h | 6 ++++ src/plugins/qt4projectmanager/qt4nodes.cpp | 16 +++++++++- src/plugins/qt4projectmanager/qt4nodes.h | 1 + 6 files changed, 67 insertions(+), 2 deletions(-) diff --git a/src/plugins/projectexplorer/projectmodels.cpp b/src/plugins/projectexplorer/projectmodels.cpp index f57acb0c08a..f7440b53bc8 100644 --- a/src/plugins/projectexplorer/projectmodels.cpp +++ b/src/plugins/projectexplorer/projectmodels.cpp @@ -145,6 +145,12 @@ FlatModel::FlatModel(SessionNode *rootNode, QObject *parent) NodesWatcher *watcher = new NodesWatcher(this); m_rootNode->registerWatcher(watcher); + connect(watcher, SIGNAL(aboutToHasBuildTargetsChanged(ProjectExplorer::ProjectNode*)), + this, SLOT(aboutToHasBuildTargetsChanged(ProjectExplorer::ProjectNode*))); + + connect(watcher, SIGNAL(hasBuildTargetsChanged(ProjectExplorer::ProjectNode*)), + this, SLOT(hasBuildTargetsChanged(ProjectExplorer::ProjectNode*))); + connect(watcher, SIGNAL(foldersAboutToBeAdded(FolderNode *, const QList &)), this, SLOT(foldersAboutToBeAdded(FolderNode *, const QList &))); connect(watcher, SIGNAL(foldersAdded()), @@ -508,7 +514,6 @@ bool FlatModel::filter(Node *node) const if (m_filterGeneratedFiles) isHidden = fileNode->isGenerated(); } - return isHidden; } @@ -694,6 +699,31 @@ void FlatModel::removed(FolderNode* parentNode, const QList &newNodeList) } } +void FlatModel::aboutToHasBuildTargetsChanged(ProjectExplorer::ProjectNode* node) +{ + if (!m_filterProjects) + return; + FolderNode *folder = visibleFolderNode(node->parentFolderNode()); + QList newNodeList = childNodes(folder, QSet() << node); + removed(folder, newNodeList); + + QList staleFolders; + recursiveAddFolderNodesImpl(node, &staleFolders); + foreach (Node *n, staleFolders) + if (FolderNode *fn = qobject_cast(n)) + m_childNodes.remove(fn); +} + +void FlatModel::hasBuildTargetsChanged(ProjectExplorer::ProjectNode *node) +{ + if (!m_filterProjects) + return; + // we are only interested if we filter + FolderNode *folder = visibleFolderNode(node->parentFolderNode()); + QList newNodeList = childNodes(folder); + added(folder, newNodeList); +} + void FlatModel::foldersAboutToBeAdded(FolderNode *parentFolder, const QList &newFolders) { Q_UNUSED(newFolders) diff --git a/src/plugins/projectexplorer/projectmodels.h b/src/plugins/projectexplorer/projectmodels.h index 810c6d50f52..52a976b958a 100644 --- a/src/plugins/projectexplorer/projectmodels.h +++ b/src/plugins/projectexplorer/projectmodels.h @@ -78,6 +78,8 @@ public slots: void setGeneratedFilesFilterEnabled(bool filter); private slots: + void aboutToHasBuildTargetsChanged(ProjectExplorer::ProjectNode *node); + void hasBuildTargetsChanged(ProjectExplorer::ProjectNode *node); void foldersAboutToBeAdded(FolderNode *parentFolder, const QList &newFolders); void foldersAdded(); diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index 581c19b62c7..28e848aa41d 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -241,6 +241,18 @@ QList ProjectNode::subProjectNodes() const return m_subProjectNodes; } +void ProjectNode::aboutToChangeHasBuildTargets() +{ + foreach (NodesWatcher *watcher, watchers()) + emit watcher->aboutToChangeHasBuildTargets(this); +} + +void ProjectNode::hasBuildTargetsChanged() +{ + foreach (NodesWatcher *watcher, watchers()) + emit watcher->hasBuildTargetsChanged(this); +} + /*! \function bool ProjectNode::addSubProjects(const QStringList &) */ diff --git a/src/plugins/projectexplorer/projectnodes.h b/src/plugins/projectexplorer/projectnodes.h index 62a7f2970f6..6d46acaee22 100644 --- a/src/plugins/projectexplorer/projectnodes.h +++ b/src/plugins/projectexplorer/projectnodes.h @@ -178,6 +178,8 @@ public: // determines if the project will be shown in the flat view // TODO find a better name + void aboutToChangeHasBuildTargets(); + void hasBuildTargetsChanged(); virtual bool hasBuildTargets() const = 0; virtual QList supportedActions(Node *node) const = 0; @@ -270,6 +272,10 @@ public: explicit NodesWatcher(QObject *parent = 0); signals: + // projects + void aboutToChangeHasBuildTargets(ProjectExplorer::ProjectNode*); + void hasBuildTargetsChanged(ProjectExplorer::ProjectNode *node); + // folders & projects void foldersAboutToBeAdded(FolderNode *parentFolder, const QList &newFolders); diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp index e43286d371d..317bdd2f854 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.cpp +++ b/src/plugins/qt4projectmanager/qt4nodes.cpp @@ -1296,7 +1296,12 @@ void Qt4ProFileNode::buildStateChanged(ProjectExplorer::Project *project) bool Qt4ProFileNode::hasBuildTargets() const { - return (projectType() == ApplicationTemplate) || (projectType() == LibraryTemplate); + return hasBuildTargets(projectType()); +} + +bool Qt4ProFileNode::hasBuildTargets(Qt4ProjectType projectType) const +{ + return (projectType == ApplicationTemplate || projectType == LibraryTemplate); } Qt4ProjectType Qt4ProFileNode::projectType() const @@ -1476,7 +1481,16 @@ void Qt4ProFileNode::applyEvaluate(bool parseResult, bool async) Qt4ProjectType oldType = m_projectType; // probably all subfiles/projects have changed anyway ... clear(); + bool changesHasBuildTargets = hasBuildTargets() xor hasBuildTargets(projectType); + + if (changesHasBuildTargets) + aboutToChangeHasBuildTargets(); + m_projectType = projectType; + + if (changesHasBuildTargets) + hasBuildTargetsChanged(); + // really emit here? or at the end? Nobody is connected to this signal at the moment // so we kind of can ignore that question for now foreach (NodesWatcher *watcher, watchers()) diff --git a/src/plugins/qt4projectmanager/qt4nodes.h b/src/plugins/qt4projectmanager/qt4nodes.h index b31adea4bb5..01fcc3da806 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.h +++ b/src/plugins/qt4projectmanager/qt4nodes.h @@ -303,6 +303,7 @@ public: bool validParse() const; + bool hasBuildTargets(Qt4ProjectType projectType) const; public slots: void asyncUpdate();