From ebae6426f8246f21ac6354147d67efcde782c624 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 17 Mar 2017 12:26:00 +0100 Subject: ProjectManager: Remove SessionNode Instead, get root project nodes directly from the project. Change-Id: I5cf95a7dce1fa29c1adc26013ad03cc017f38a6d Reviewed-by: Tobias Hunger --- src/plugins/projectexplorer/project.cpp | 53 ++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 4 deletions(-) (limited to 'src/plugins/projectexplorer/project.cpp') diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index 7d283d3901..fee9f07f35 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -39,6 +39,9 @@ #include #include #include +#include +#include + #include #include #include @@ -80,18 +83,52 @@ const char PLUGIN_SETTINGS_KEY[] = "ProjectExplorer.Project.PluginSettings"; } // namespace namespace ProjectExplorer { + +class ContainerNode : public ProjectNode +{ +public: + ContainerNode(Project *project) + : ProjectNode(Utils::FileName()), + m_project(project) + {} + + QString displayName() const final + { + QString name = m_project->displayName(); + + const QFileInfo fi = m_project->projectFilePath().toFileInfo(); + const QString dir = fi.isDir() ? fi.absoluteFilePath() : fi.absolutePath(); + if (Core::IVersionControl *vc = Core::VcsManager::findVersionControlForDirectory(dir)) { + QString vcsTopic = vc->vcsTopic(dir); + if (!vcsTopic.isEmpty()) + name += " [" + vcsTopic + ']'; + } + + return name; + } + + QList supportedActions(Node *) const final + { + return {}; + } + +private: + Project *m_project; +}; + // ------------------------------------------------------------------------- // Project // ------------------------------------------------------------------------- - class ProjectPrivate { public: + ProjectPrivate(Project *owner) : m_containerNode(owner) {} ~ProjectPrivate(); Core::Id m_id; Core::IDocument *m_document = nullptr; ProjectNode *m_rootProjectNode = nullptr; + ContainerNode m_containerNode; QList m_targets; Target *m_activeTarget = nullptr; EditorConfiguration m_editorConfiguration; @@ -117,7 +154,7 @@ ProjectPrivate::~ProjectPrivate() delete m_accessor; } -Project::Project() : d(new ProjectPrivate) +Project::Project() : d(new ProjectPrivate(this)) { d->m_macroExpander.setDisplayName(tr("Project")); d->m_macroExpander.registerVariable("Project:Name", tr("Project Name"), @@ -427,8 +464,11 @@ void Project::setRootProjectNode(ProjectNode *root) ProjectTree::applyTreeManager(root); d->m_rootProjectNode = root; - emit projectTreeChanged(this, QPrivateSignal()); - // Do not delete oldNode! The ProjectTree owns that! + if (root) + d->m_rootProjectNode->setParentFolderNode(&d->m_containerNode); + ProjectTree::emitSubtreeChanged(d->m_rootProjectNode); + + delete d->m_rootProjectNode; } Target *Project::restoreTarget(const QVariantMap &data) @@ -532,6 +572,11 @@ ProjectNode *Project::rootProjectNode() const return d->m_rootProjectNode; } +ProjectNode *Project::containerNode() const +{ + return &d->m_containerNode; +} + Project::RestoreResult Project::fromMap(const QVariantMap &map, QString *errorMessage) { Q_UNUSED(errorMessage); -- cgit v1.2.3 From 00a02dc1f8eed35f4ea5f1502ba256fb9f1ffb91 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 21 Mar 2017 14:42:24 +0100 Subject: ProjectExplorer: Fix crash when setting root project node Change-Id: I13954bffd06bee2aaf248d26cf358a0cc674d139 Reviewed-by: hjk --- src/plugins/projectexplorer/project.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'src/plugins/projectexplorer/project.cpp') diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index fee9f07f35..e8b68a4560 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -463,12 +463,13 @@ void Project::setRootProjectNode(ProjectNode *root) ProjectTree::applyTreeManager(root); + ProjectNode *oldNode = d->m_rootProjectNode; d->m_rootProjectNode = root; if (root) - d->m_rootProjectNode->setParentFolderNode(&d->m_containerNode); - ProjectTree::emitSubtreeChanged(d->m_rootProjectNode); + root->setParentFolderNode(&d->m_containerNode); + ProjectTree::emitSubtreeChanged(root); - delete d->m_rootProjectNode; + delete oldNode; } Target *Project::restoreTarget(const QVariantMap &data) -- cgit v1.2.3