diff --git a/src/plugins/projectexplorer/projectmodels.cpp b/src/plugins/projectexplorer/projectmodels.cpp index f57acb0c08ab9eb908c91c0009c6a6b5e6d24a2d..f7440b53bc8f1665b542aa228e439d288cb8b351 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<FolderNode*> &)), this, SLOT(foldersAboutToBeAdded(FolderNode *, const QList<FolderNode*> &))); 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<Node*> &newNodeList) } } +void FlatModel::aboutToHasBuildTargetsChanged(ProjectExplorer::ProjectNode* node) +{ + if (!m_filterProjects) + return; + FolderNode *folder = visibleFolderNode(node->parentFolderNode()); + QList<Node *> newNodeList = childNodes(folder, QSet<Node *>() << node); + removed(folder, newNodeList); + + QList<Node *> staleFolders; + recursiveAddFolderNodesImpl(node, &staleFolders); + foreach (Node *n, staleFolders) + if (FolderNode *fn = qobject_cast<FolderNode *>(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<Node *> newNodeList = childNodes(folder); + added(folder, newNodeList); +} + void FlatModel::foldersAboutToBeAdded(FolderNode *parentFolder, const QList<FolderNode*> &newFolders) { Q_UNUSED(newFolders) diff --git a/src/plugins/projectexplorer/projectmodels.h b/src/plugins/projectexplorer/projectmodels.h index 810c6d50f52e3fcd78b4888f3f1026b1a4990558..52a976b958af5f483df045c45494bfc2719dde03 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<FolderNode*> &newFolders); void foldersAdded(); diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index 581c19b62c7e5bbe496c7c3ec15701e15bf63d08..28e848aa41d8246b0a120dd5327895f04347b242 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -241,6 +241,18 @@ QList<ProjectNode*> 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 62a7f2970f60da1fc65d7752c379a4fe76ddbde4..6d46acaee2235e23408634c90225f3bad6a5c9a4 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<ProjectAction> 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<FolderNode*> &newFolders); diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp index e43286d371d283f0156bea1b32978abc86fb4884..317bdd2f85434a9384ca6181e39eadb221e5bf0a 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 b31adea4bb5775e546a3e88bf56e4284772bdf4c..01fcc3da80624e6ef5e1a165cdedd426cb4335fb 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();