forked from qt-creator/qt-creator
ProjectTree: Add a way to register managers for subtrees
Change-Id: I4694bb7dbe75b67946cdb5d8ca8b5a3ff1e40659 Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
@@ -41,6 +41,7 @@
|
||||
#include <coreplugin/icore.h>
|
||||
#include <projectexplorer/buildmanager.h>
|
||||
#include <projectexplorer/kitmanager.h>
|
||||
#include <projectexplorer/projecttree.h>
|
||||
|
||||
#include <utils/algorithm.h>
|
||||
#include <utils/macroexpander.h>
|
||||
@@ -430,6 +431,8 @@ void Project::setRootProjectNode(ProjectNode *root)
|
||||
if (d->m_rootProjectNode == root)
|
||||
return;
|
||||
|
||||
ProjectTree::applyTreeManager(root);
|
||||
|
||||
d->m_rootProjectNode = root;
|
||||
emit projectTreeChanged(this, QPrivateSignal());
|
||||
// Do not delete oldNode! The ProjectTree owns that!
|
||||
|
||||
@@ -261,8 +261,9 @@ void ProjectTree::updateContext()
|
||||
|
||||
void ProjectTree::emitSubtreeChanged(FolderNode *node)
|
||||
{
|
||||
if (!s_instance->isInNodeHierarchy(node))
|
||||
if (!SessionManager::sessionNode()->isAncesterOf(node))
|
||||
return;
|
||||
|
||||
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)
|
||||
{
|
||||
|
||||
Core::ModeManager::activateMode(Core::Constants::MODE_EDIT);
|
||||
|
||||
// Shows and focusses a project tree
|
||||
@@ -368,20 +368,24 @@ void ProjectTree::highlightProject(Project *project, const QString &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()
|
||||
{
|
||||
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
|
||||
|
||||
@@ -29,6 +29,8 @@
|
||||
|
||||
#include <coreplugin/icontext.h>
|
||||
|
||||
#include <functional>
|
||||
|
||||
namespace ProjectExplorer {
|
||||
class FileNode;
|
||||
class FolderNode;
|
||||
@@ -62,6 +64,10 @@ public:
|
||||
|
||||
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();
|
||||
|
||||
signals:
|
||||
@@ -92,11 +98,11 @@ private:
|
||||
void updateExternalFileWarning();
|
||||
static bool hasFocus(Internal::ProjectTreeWidget *widget);
|
||||
void hideContextMenu();
|
||||
bool isInNodeHierarchy(Node *n);
|
||||
|
||||
private:
|
||||
static ProjectTree *s_instance;
|
||||
QList<QPointer<Internal::ProjectTreeWidget>> m_projectTreeWidgets;
|
||||
QVector<TreeManagerFunction> m_treeManagers;
|
||||
QPointer<Node> m_currentNode;
|
||||
Project *m_currentProject = nullptr;
|
||||
Internal::ProjectTreeWidget *m_focusForContextMenu = nullptr;
|
||||
|
||||
Reference in New Issue
Block a user