ProjectTree: Add a way to register managers for subtrees

Change-Id: I4694bb7dbe75b67946cdb5d8ca8b5a3ff1e40659
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Tobias Hunger
2017-03-10 10:20:53 +01:00
parent 393cb16a20
commit c63805668f
3 changed files with 27 additions and 14 deletions

View File

@@ -41,6 +41,7 @@
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <projectexplorer/buildmanager.h> #include <projectexplorer/buildmanager.h>
#include <projectexplorer/kitmanager.h> #include <projectexplorer/kitmanager.h>
#include <projectexplorer/projecttree.h>
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/macroexpander.h> #include <utils/macroexpander.h>
@@ -430,6 +431,8 @@ void Project::setRootProjectNode(ProjectNode *root)
if (d->m_rootProjectNode == root) if (d->m_rootProjectNode == root)
return; return;
ProjectTree::applyTreeManager(root);
d->m_rootProjectNode = root; d->m_rootProjectNode = root;
emit projectTreeChanged(this, QPrivateSignal()); emit projectTreeChanged(this, QPrivateSignal());
// Do not delete oldNode! The ProjectTree owns that! // Do not delete oldNode! The ProjectTree owns that!

View File

@@ -261,8 +261,9 @@ void ProjectTree::updateContext()
void ProjectTree::emitSubtreeChanged(FolderNode *node) void ProjectTree::emitSubtreeChanged(FolderNode *node)
{ {
if (!s_instance->isInNodeHierarchy(node)) if (!SessionManager::sessionNode()->isAncesterOf(node))
return; return;
emit s_instance->subtreeChanged(node); emit s_instance->subtreeChanged(node);
} }
@@ -358,7 +359,6 @@ void ProjectTree::showContextMenu(ProjectTreeWidget *focus, const QPoint &global
void ProjectTree::highlightProject(Project *project, const QString &message) void ProjectTree::highlightProject(Project *project, const QString &message)
{ {
Core::ModeManager::activateMode(Core::Constants::MODE_EDIT); Core::ModeManager::activateMode(Core::Constants::MODE_EDIT);
// Shows and focusses a project tree // Shows and focusses a project tree
@@ -368,20 +368,24 @@ void ProjectTree::highlightProject(Project *project, const QString &message)
projectTreeWidget->showMessage(project->rootProjectNode(), message); projectTreeWidget->showMessage(project->rootProjectNode(), message);
} }
void ProjectTree::registerTreeManager(const TreeManagerFunction &treeChange)
{
if (treeChange)
s_instance->m_treeManagers.append(treeChange);
}
void ProjectTree::applyTreeManager(FolderNode *folder)
{
if (!folder)
return;
for (TreeManagerFunction &f : s_instance->m_treeManagers)
f(folder);
}
void ProjectTree::hideContextMenu() void ProjectTree::hideContextMenu()
{ {
m_focusForContextMenu = nullptr; m_focusForContextMenu = nullptr;
} }
bool ProjectTree::isInNodeHierarchy(Node *n)
{
Node *sessionNode = SessionManager::sessionNode();
do {
if (n == sessionNode)
return true;
n = n->parentFolderNode();
} while (n);
return false;
}
} // namespace ProjectExplorer } // namespace ProjectExplorer

View File

@@ -29,6 +29,8 @@
#include <coreplugin/icontext.h> #include <coreplugin/icontext.h>
#include <functional>
namespace ProjectExplorer { namespace ProjectExplorer {
class FileNode; class FileNode;
class FolderNode; class FolderNode;
@@ -62,6 +64,10 @@ public:
static void highlightProject(Project *project, const QString &message); static void highlightProject(Project *project, const QString &message);
using TreeManagerFunction = std::function<void(FolderNode *)>;
static void registerTreeManager(const TreeManagerFunction &treeChange);
static void applyTreeManager(FolderNode *folder);
void collapseAll(); void collapseAll();
signals: signals:
@@ -92,11 +98,11 @@ private:
void updateExternalFileWarning(); void updateExternalFileWarning();
static bool hasFocus(Internal::ProjectTreeWidget *widget); static bool hasFocus(Internal::ProjectTreeWidget *widget);
void hideContextMenu(); void hideContextMenu();
bool isInNodeHierarchy(Node *n);
private: private:
static ProjectTree *s_instance; static ProjectTree *s_instance;
QList<QPointer<Internal::ProjectTreeWidget>> m_projectTreeWidgets; QList<QPointer<Internal::ProjectTreeWidget>> m_projectTreeWidgets;
QVector<TreeManagerFunction> m_treeManagers;
QPointer<Node> m_currentNode; QPointer<Node> m_currentNode;
Project *m_currentProject = nullptr; Project *m_currentProject = nullptr;
Internal::ProjectTreeWidget *m_focusForContextMenu = nullptr; Internal::ProjectTreeWidget *m_focusForContextMenu = nullptr;