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 <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!
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user