ProjectManager: Remove SessionNode

Instead, get root project nodes directly from the project.

Change-Id: I5cf95a7dce1fa29c1adc26013ad03cc017f38a6d
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
hjk
2017-03-17 12:26:00 +01:00
parent 312784a930
commit ebae6426f8
15 changed files with 165 additions and 270 deletions

View File

@@ -198,8 +198,6 @@ void PxNodeController::addExplorerNode(const ProjectExplorer::Node *node,
menu->popup(QCursor::pos()); menu->popup(QCursor::pos());
break; break;
} }
case ProjectExplorer::NodeType::Session:
break;
} }
} }

View File

@@ -80,9 +80,6 @@ QString PxNodeUtilities::calcRelativePath(const ProjectExplorer::Node *node,
case ProjectExplorer::NodeType::Project: case ProjectExplorer::NodeType::Project:
nodePath = node->filePath().toString(); nodePath = node->filePath().toString();
break; break;
case ProjectExplorer::NodeType::Session:
QTC_ASSERT(false, return QString());
break;
} }
return qmt::NameController::calcRelativePath(nodePath, anchorFolder); return qmt::NameController::calcRelativePath(nodePath, anchorFolder);

View File

@@ -39,6 +39,9 @@
#include <coreplugin/idocument.h> #include <coreplugin/idocument.h>
#include <coreplugin/icontext.h> #include <coreplugin/icontext.h>
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <coreplugin/iversioncontrol.h>
#include <coreplugin/vcsmanager.h>
#include <projectexplorer/buildmanager.h> #include <projectexplorer/buildmanager.h>
#include <projectexplorer/kitmanager.h> #include <projectexplorer/kitmanager.h>
#include <projectexplorer/projecttree.h> #include <projectexplorer/projecttree.h>
@@ -80,18 +83,52 @@ const char PLUGIN_SETTINGS_KEY[] = "ProjectExplorer.Project.PluginSettings";
} // namespace } // namespace
namespace ProjectExplorer { 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<ProjectAction> supportedActions(Node *) const final
{
return {};
}
private:
Project *m_project;
};
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
// Project // Project
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
class ProjectPrivate class ProjectPrivate
{ {
public: public:
ProjectPrivate(Project *owner) : m_containerNode(owner) {}
~ProjectPrivate(); ~ProjectPrivate();
Core::Id m_id; Core::Id m_id;
Core::IDocument *m_document = nullptr; Core::IDocument *m_document = nullptr;
ProjectNode *m_rootProjectNode = nullptr; ProjectNode *m_rootProjectNode = nullptr;
ContainerNode m_containerNode;
QList<Target *> m_targets; QList<Target *> m_targets;
Target *m_activeTarget = nullptr; Target *m_activeTarget = nullptr;
EditorConfiguration m_editorConfiguration; EditorConfiguration m_editorConfiguration;
@@ -117,7 +154,7 @@ ProjectPrivate::~ProjectPrivate()
delete m_accessor; delete m_accessor;
} }
Project::Project() : d(new ProjectPrivate) Project::Project() : d(new ProjectPrivate(this))
{ {
d->m_macroExpander.setDisplayName(tr("Project")); d->m_macroExpander.setDisplayName(tr("Project"));
d->m_macroExpander.registerVariable("Project:Name", tr("Project Name"), d->m_macroExpander.registerVariable("Project:Name", tr("Project Name"),
@@ -427,8 +464,11 @@ void Project::setRootProjectNode(ProjectNode *root)
ProjectTree::applyTreeManager(root); ProjectTree::applyTreeManager(root);
d->m_rootProjectNode = root; d->m_rootProjectNode = root;
emit projectTreeChanged(this, QPrivateSignal()); if (root)
// Do not delete oldNode! The ProjectTree owns that! d->m_rootProjectNode->setParentFolderNode(&d->m_containerNode);
ProjectTree::emitSubtreeChanged(d->m_rootProjectNode);
delete d->m_rootProjectNode;
} }
Target *Project::restoreTarget(const QVariantMap &data) Target *Project::restoreTarget(const QVariantMap &data)
@@ -532,6 +572,11 @@ ProjectNode *Project::rootProjectNode() const
return d->m_rootProjectNode; return d->m_rootProjectNode;
} }
ProjectNode *Project::containerNode() const
{
return &d->m_containerNode;
}
Project::RestoreResult Project::fromMap(const QVariantMap &map, QString *errorMessage) Project::RestoreResult Project::fromMap(const QVariantMap &map, QString *errorMessage)
{ {
Q_UNUSED(errorMessage); Q_UNUSED(errorMessage);

View File

@@ -81,6 +81,7 @@ public:
static Utils::FileName projectDirectory(const Utils::FileName &top); static Utils::FileName projectDirectory(const Utils::FileName &top);
virtual ProjectNode *rootProjectNode() const; virtual ProjectNode *rootProjectNode() const;
ProjectNode *containerNode() const;
bool hasActiveBuildSettings() const; bool hasActiveBuildSettings() const;
@@ -142,7 +143,6 @@ public:
Utils::MacroExpander *macroExpander() const; Utils::MacroExpander *macroExpander() const;
signals: signals:
void projectTreeChanged(Project *project, QPrivateSignal);
void displayNameChanged(); void displayNameChanged();
void fileListChanged(); void fileListChanged();

View File

@@ -71,7 +71,7 @@ static bool sortWrapperNodes(const WrapperNode *w1, const WrapperNode *w2)
} }
FlatModel::FlatModel(QObject *parent) FlatModel::FlatModel(QObject *parent)
: TreeModel<WrapperNode, WrapperNode>(new WrapperNode(SessionManager::sessionNode()), parent) : TreeModel<WrapperNode, WrapperNode>(new WrapperNode(nullptr), parent)
{ {
ProjectTree *tree = ProjectTree::instance(); ProjectTree *tree = ProjectTree::instance();
connect(tree, &ProjectTree::subtreeChanged, this, &FlatModel::update); connect(tree, &ProjectTree::subtreeChanged, this, &FlatModel::update);
@@ -93,17 +93,7 @@ QVariant FlatModel::data(const QModelIndex &index, int role) const
FolderNode *folderNode = node->asFolderNode(); FolderNode *folderNode = node->asFolderNode();
switch (role) { switch (role) {
case Qt::DisplayRole: { case Qt::DisplayRole: {
QString name = node->displayName(); result = node->displayName();
if (node->nodeType() == NodeType::Project
&& node->parentFolderNode()
&& node->parentFolderNode()->nodeType() == NodeType::Session) {
const QString vcsTopic = static_cast<ProjectNode *>(node)->vcsTopic();
if (!vcsTopic.isEmpty())
name += QLatin1String(" [") + vcsTopic + QLatin1Char(']');
}
result = name;
break; break;
} }
case Qt::EditRole: { case Qt::EditRole: {
@@ -124,7 +114,7 @@ QVariant FlatModel::data(const QModelIndex &index, int role) const
case Qt::FontRole: { case Qt::FontRole: {
QFont font; QFont font;
if (Project *project = SessionManager::startupProject()) { if (Project *project = SessionManager::startupProject()) {
if (node == SessionManager::nodeForProject(project)) if (node == project->containerNode())
font.setBold(true); font.setBold(true);
} }
result = font; result = font;
@@ -187,23 +177,44 @@ void FlatModel::update()
void FlatModel::rebuildModel() void FlatModel::rebuildModel()
{ {
QList<Project *> projects = SessionManager::projects();
Utils::sort(projects, [](Project *p1, Project *p2) {
const int displayNameResult = caseFriendlyCompare(p1->displayName(), p2->displayName());
if (displayNameResult != 0)
return displayNameResult < 0;
return p1 < p2; // sort by pointer value
});
QSet<Node *> seen; QSet<Node *> seen;
rootItem()->removeChildren(); rootItem()->removeChildren();
for (Node *node : SessionManager::sessionNode()->nodes()) { for (Project *project : projects) {
if (ProjectNode *projectNode = node->asProjectNode()) { WrapperNode *container = new WrapperNode(project->containerNode());
if (!seen.contains(projectNode))
addProjectNode(rootItem(), projectNode, &seen); ProjectNode *projectNode = project->rootProjectNode();
if (projectNode) {
addFolderNode(container, projectNode, &seen);
} else {
FileNode *projectFileNode = new FileNode(project->projectFilePath(), FileType::Project, false);
seen.insert(projectFileNode);
container->appendChild(new WrapperNode(projectFileNode));
} }
container->sortChildren(&sortWrapperNodes);
rootItem()->appendChild(container);
} }
rootItem()->sortChildren(&sortWrapperNodes);
forAllItems([this](WrapperNode *node) { forAllItems([this](WrapperNode *node) {
const QString path = node->m_node->filePath().toString(); if (node->m_node) {
const QString displayName = node->m_node->displayName(); const QString path = node->m_node->filePath().toString();
ExpandData ed(path, displayName); const QString displayName = node->m_node->displayName();
if (m_toExpand.contains(ed)) ExpandData ed(path, displayName);
if (m_toExpand.contains(ed))
emit requestExpansion(node->index());
} else {
emit requestExpansion(node->index()); emit requestExpansion(node->index());
}
}); });
} }
@@ -227,7 +238,7 @@ ExpandData FlatModel::expandDataForNode(const Node *node) const
void FlatModel::handleProjectAdded(Project *project) void FlatModel::handleProjectAdded(Project *project)
{ {
Node *node = SessionManager::nodeForProject(project); Node *node = project->rootProjectNode();
m_toExpand.insert(expandDataForNode(node)); m_toExpand.insert(expandDataForNode(node));
if (WrapperNode *wrapper = wrapperForNode(node)) { if (WrapperNode *wrapper = wrapperForNode(node)) {
wrapper->forFirstLevelChildren([this](WrapperNode *child) { wrapper->forFirstLevelChildren([this](WrapperNode *child) {
@@ -251,21 +262,6 @@ void FlatModel::saveExpandData()
SessionManager::setValue(QLatin1String("ProjectTree.ExpandData"), data); SessionManager::setValue(QLatin1String("ProjectTree.ExpandData"), data);
} }
void FlatModel::addProjectNode(WrapperNode *parent, ProjectNode *projectNode, QSet<Node *> *seen)
{
seen->insert(projectNode);
auto node = new WrapperNode(projectNode);
parent->appendChild(node);
addFolderNode(node, projectNode, seen);
for (Node *subNode : projectNode->nodes()) {
if (ProjectNode *subProjectNode = subNode->asProjectNode()) {
if (!seen->contains(subProjectNode))
addProjectNode(node, subProjectNode, seen);
}
}
node->sortChildren(&sortWrapperNodes);
}
void FlatModel::addFolderNode(WrapperNode *parent, FolderNode *folderNode, QSet<Node *> *seen) void FlatModel::addFolderNode(WrapperNode *parent, FolderNode *folderNode, QSet<Node *> *seen)
{ {
const QList<FolderNode *> subFolderNodes = folderNode->folderNodes(); const QList<FolderNode *> subFolderNodes = folderNode->folderNodes();
@@ -374,16 +370,6 @@ const QLoggingCategory &FlatModel::logger()
return logger; return logger;
} }
bool isSorted(const QList<Node *> &nodes)
{
int size = nodes.size();
for (int i = 0; i < size -1; ++i) {
if (!sortNodes(nodes.at(i), nodes.at(i+1)))
return false;
}
return true;
}
namespace Internal { namespace Internal {
int caseFriendlyCompare(const QString &a, const QString &b) int caseFriendlyCompare(const QString &a, const QString &b)

View File

@@ -94,7 +94,6 @@ private:
void update(); void update();
void rebuildModel(); void rebuildModel();
void addProjectNode(WrapperNode *parent, ProjectNode *projectNode, QSet<Node *> *seen);
void addFolderNode(WrapperNode *parent, FolderNode *folderNode, QSet<Node *> *seen); void addFolderNode(WrapperNode *parent, FolderNode *folderNode, QSet<Node *> *seen);
ExpandData expandDataForNode(const Node *node) const; ExpandData expandDataForNode(const Node *node) const;

View File

@@ -214,9 +214,12 @@ bool Node::isEnabled() const
QList<ProjectAction> Node::supportedActions(Node *node) const QList<ProjectAction> Node::supportedActions(Node *node) const
{ {
QList<ProjectAction> list = parentFolderNode()->supportedActions(node); if (FolderNode *folder = parentFolderNode()) {
list.append(InheritedFromParent); QList<ProjectAction> list = folder->supportedActions(node);
return list; list.append(InheritedFromParent);
return list;
}
return {};
} }
void Node::setEnabled(bool enabled) void Node::setEnabled(bool enabled)
@@ -702,18 +705,6 @@ ProjectNode::ProjectNode(const Utils::FileName &projectFilePath) :
setDisplayName(projectFilePath.fileName()); setDisplayName(projectFilePath.fileName());
} }
QString ProjectNode::vcsTopic() const
{
const QFileInfo fi = filePath().toFileInfo();
const QString dir = fi.isDir() ? fi.absoluteFilePath() : fi.absolutePath();
if (Core::IVersionControl *const vc =
Core::VcsManager::findVersionControlForDirectory(dir))
return vc->vcsTopic(dir);
return QString();
}
bool ProjectNode::canAddSubProject(const QString &proFilePath) const bool ProjectNode::canAddSubProject(const QString &proFilePath) const
{ {
Q_UNUSED(proFilePath) Q_UNUSED(proFilePath)
@@ -797,28 +788,4 @@ bool FolderNode::isEmpty() const
return m_nodes.isEmpty(); return m_nodes.isEmpty();
} }
/*!
\class ProjectExplorer::SessionNode
*/
SessionNode::SessionNode() :
FolderNode(Utils::FileName::fromString("session"), NodeType::Session)
{ }
QList<ProjectAction> SessionNode::supportedActions(Node *node) const
{
Q_UNUSED(node)
return QList<ProjectAction>();
}
bool SessionNode::showInSimpleTree() const
{
return true;
}
QString SessionNode::addFileFilter() const
{
return QString::fromLatin1("*.c; *.cc; *.cpp; *.cp; *.cxx; *.c++; *.h; *.hh; *.hpp; *.hxx;");
}
} // namespace ProjectExplorer } // namespace ProjectExplorer

View File

@@ -40,14 +40,12 @@ namespace Utils { class MimeType; }
namespace ProjectExplorer { namespace ProjectExplorer {
class RunConfiguration; class RunConfiguration;
class SessionManager;
enum class NodeType : quint16 { enum class NodeType : quint16 {
File = 1, File = 1,
Folder, Folder,
VirtualFolder, VirtualFolder,
Project, Project
Session
}; };
// File types common for qt projects // File types common for qt projects
@@ -275,8 +273,6 @@ private:
class PROJECTEXPLORER_EXPORT ProjectNode : public FolderNode class PROJECTEXPLORER_EXPORT ProjectNode : public FolderNode
{ {
public: public:
QString vcsTopic() const;
virtual bool canAddSubProject(const QString &proFilePath) const; virtual bool canAddSubProject(const QString &proFilePath) const;
virtual bool addSubProject(const QString &proFile); virtual bool addSubProject(const QString &proFile);
virtual bool removeSubProject(const QString &proFilePath); virtual bool removeSubProject(const QString &proFilePath);
@@ -298,24 +294,7 @@ public:
const ProjectNode *asProjectNode() const final { return this; } const ProjectNode *asProjectNode() const final { return this; }
protected: protected:
// this is just the in-memory representation, a subclass
// will add the persistent stuff
explicit ProjectNode(const Utils::FileName &projectFilePath); explicit ProjectNode(const Utils::FileName &projectFilePath);
friend class SessionManager;
};
// Documentation inside.
class PROJECTEXPLORER_EXPORT SessionNode : public FolderNode
{
public:
SessionNode();
private:
QList<ProjectAction> supportedActions(Node *node) const final;
QString addFileFilter() const final;
bool showInSimpleTree() const final;
}; };
} // namespace ProjectExplorer } // namespace ProjectExplorer

View File

@@ -261,9 +261,6 @@ void ProjectTree::updateContext()
void ProjectTree::emitSubtreeChanged(FolderNode *node) void ProjectTree::emitSubtreeChanged(FolderNode *node)
{ {
if (!SessionManager::sessionNode()->isAncesterOf(node))
return;
emit s_instance->subtreeChanged(node); emit s_instance->subtreeChanged(node);
} }
@@ -318,16 +315,15 @@ bool ProjectTree::hasFocus(ProjectTreeWidget *widget)
void ProjectTree::showContextMenu(ProjectTreeWidget *focus, const QPoint &globalPos, Node *node) void ProjectTree::showContextMenu(ProjectTreeWidget *focus, const QPoint &globalPos, Node *node)
{ {
QMenu *contextMenu = nullptr; QMenu *contextMenu = nullptr;
Project *project = SessionManager::projectForNode(node);
emit s_instance->aboutToShowContextMenu(project, node);
if (!node) if (!node) {
node = SessionManager::sessionNode(); contextMenu = Core::ActionManager::actionContainer(Constants::M_SESSIONCONTEXT)->menu();
if (node->nodeType() != NodeType::Session) { } else {
Project *project = SessionManager::projectForNode(node);
emit s_instance->aboutToShowContextMenu(project, node);
switch (node->nodeType()) { switch (node->nodeType()) {
case NodeType::Project: case NodeType::Project:
if (node->parentFolderNode() == SessionManager::sessionNode()) if (node->parentFolderNode())
contextMenu = Core::ActionManager::actionContainer(Constants::M_PROJECTCONTEXT)->menu(); contextMenu = Core::ActionManager::actionContainer(Constants::M_PROJECTCONTEXT)->menu();
else else
contextMenu = Core::ActionManager::actionContainer(Constants::M_SUBPROJECTCONTEXT)->menu(); contextMenu = Core::ActionManager::actionContainer(Constants::M_SUBPROJECTCONTEXT)->menu();
@@ -342,10 +338,6 @@ void ProjectTree::showContextMenu(ProjectTreeWidget *focus, const QPoint &global
default: default:
qWarning("ProjectExplorerPlugin::showContextMenu - Missing handler for node type"); qWarning("ProjectExplorerPlugin::showContextMenu - Missing handler for node type");
} }
} else { // session item
emit s_instance->aboutToShowContextMenu(nullptr, node);
contextMenu = Core::ActionManager::actionContainer(Constants::M_SESSIONCONTEXT)->menu();
} }
if (contextMenu && contextMenu->actions().count() > 0) { if (contextMenu && contextMenu->actions().count() > 0) {

View File

@@ -70,6 +70,9 @@ public:
void collapseAll(); void collapseAll();
// for nodes to emit signals, do not call unless you are a node
static void emitSubtreeChanged(FolderNode *node);
signals: signals:
void currentProjectChanged(ProjectExplorer::Project *project); void currentProjectChanged(ProjectExplorer::Project *project);
void currentNodeChanged(); void currentNodeChanged();
@@ -80,9 +83,6 @@ signals:
void aboutToShowContextMenu(ProjectExplorer::Project *project, void aboutToShowContextMenu(ProjectExplorer::Project *project,
ProjectExplorer::Node *node); ProjectExplorer::Node *node);
public: // for nodes to emit signals, do not call unless you are a node
static void emitSubtreeChanged(FolderNode *node);
private: private:
void sessionChanged(); void sessionChanged();
void focusChanged(); void focusChanged();

View File

@@ -275,23 +275,27 @@ Node *ProjectTreeWidget::nodeForFile(const Utils::FileName &fileName)
Node *bestNode = nullptr; Node *bestNode = nullptr;
int bestNodeExpandCount = INT_MAX; int bestNodeExpandCount = INT_MAX;
SessionManager::sessionNode()->forEachGenericNode([&](Node *node) { for (Project *project : SessionManager::projects()) {
if (node->filePath() == fileName) { if (ProjectNode *projectNode = project->rootProjectNode()) {
if (!bestNode) { projectNode->forEachGenericNode([&](Node *node) {
bestNode = node; if (node->filePath() == fileName) {
bestNodeExpandCount = ProjectTreeWidget::expandedCount(node); if (!bestNode) {
} else if (node->nodeType() < bestNode->nodeType()) { bestNode = node;
bestNode = node; bestNodeExpandCount = ProjectTreeWidget::expandedCount(node);
bestNodeExpandCount = ProjectTreeWidget::expandedCount(node); } else if (node->nodeType() < bestNode->nodeType()) {
} else if (node->nodeType() == bestNode->nodeType()) { bestNode = node;
int nodeExpandCount = ProjectTreeWidget::expandedCount(node); bestNodeExpandCount = ProjectTreeWidget::expandedCount(node);
if (nodeExpandCount < bestNodeExpandCount) { } else if (node->nodeType() == bestNode->nodeType()) {
bestNode = node; int nodeExpandCount = ProjectTreeWidget::expandedCount(node);
bestNodeExpandCount = ProjectTreeWidget::expandedCount(node); if (nodeExpandCount < bestNodeExpandCount) {
bestNode = node;
bestNodeExpandCount = ProjectTreeWidget::expandedCount(node);
}
}
} }
} });
} }
}); }
return bestNode; return bestNode;
} }

View File

@@ -26,6 +26,7 @@
#include "projectwizardpage.h" #include "projectwizardpage.h"
#include "ui_projectwizardpage.h" #include "ui_projectwizardpage.h"
#include "project.h"
#include "projectexplorer.h" #include "projectexplorer.h"
#include "session.h" #include "session.h"
@@ -300,18 +301,14 @@ ProjectWizardPage::~ProjectWizardPage()
{ {
disconnect(m_ui->projectComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), disconnect(m_ui->projectComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
this, &ProjectWizardPage::projectChanged); this, &ProjectWizardPage::projectChanged);
delete m_model;
delete m_ui; delete m_ui;
} }
void ProjectWizardPage::setModel(Utils::TreeModel<> *model) void ProjectWizardPage::setModel(Utils::TreeModel<> *model)
{ {
delete m_model;
m_model = model;
// TODO see OverViewCombo and OverView for click event filter // TODO see OverViewCombo and OverView for click event filter
m_ui->projectComboBox->setModel(model); m_ui->projectComboBox->setModel(model);
bool enabled = m_model->rowCount(QModelIndex()) > 1; bool enabled = m_model.rowCount(QModelIndex()) > 1;
m_ui->projectComboBox->setEnabled(enabled); m_ui->projectComboBox->setEnabled(enabled);
expandTree(QModelIndex()); expandTree(QModelIndex());
@@ -324,9 +321,9 @@ bool ProjectWizardPage::expandTree(const QModelIndex &root)
expand = true; expand = true;
// Check children // Check children
int count = m_model->rowCount(root); int count = m_model.rowCount(root);
for (int i = 0; i < count; ++i) { for (int i = 0; i < count; ++i) {
if (expandTree(m_model->index(i, 0, root))) if (expandTree(m_model.index(i, 0, root)))
expand = true; expand = true;
} }
@@ -346,7 +343,7 @@ bool ProjectWizardPage::expandTree(const QModelIndex &root)
void ProjectWizardPage::setBestNode(AddNewTree *tree) void ProjectWizardPage::setBestNode(AddNewTree *tree)
{ {
QModelIndex index = tree ? m_model->indexForItem(tree) : QModelIndex(); QModelIndex index = tree ? m_model.indexForItem(tree) : QModelIndex();
m_ui->projectComboBox->setCurrentIndex(index); m_ui->projectComboBox->setCurrentIndex(index);
while (index.isValid()) { while (index.isValid()) {
@@ -454,28 +451,22 @@ void ProjectWizardPage::initializeProjectTree(Node *context, const QStringList &
{ {
BestNodeSelector selector(m_commonDirectory, paths); BestNodeSelector selector(m_commonDirectory, paths);
AddNewTree *tree; TreeItem *root = m_model.rootItem();
SessionNode *root = SessionManager::sessionNode(); root->removeChildren();
QList<AddNewTree *> children; for (Project *project : SessionManager::projects()) {
if (ProjectNode *pn = project->rootProjectNode()) {
for (Node *node : root->nodes()) {
if (ProjectNode *pn = node->asProjectNode()) {
if (kind == IWizardFactory::ProjectWizard) { if (kind == IWizardFactory::ProjectWizard) {
if (AddNewTree *child = buildAddProjectTree(pn, paths.first(), context, &selector)) if (AddNewTree *child = buildAddProjectTree(pn, paths.first(), context, &selector))
children.append(child); root->appendChild(child);
} else { } else {
if (AddNewTree *child = buildAddFilesTree(pn, paths, context, &selector)) if (AddNewTree *child = buildAddFilesTree(pn, paths, context, &selector))
children.append(child); root->appendChild(child);
} }
} }
} }
root->prependChild(createNoneNode(&selector));
children.prepend(createNoneNode(&selector));
tree = new AddNewTree(root, children, root->displayName());
setAdditionalInfo(selector.deployingProjects()); setAdditionalInfo(selector.deployingProjects());
setModel(new TreeModel<>(tree));
setBestNode(selector.bestChoice()); setBestNode(selector.bestChoice());
setAddingSubProject(action == AddSubProject); setAddingSubProject(action == AddSubProject);
} }

View File

@@ -95,7 +95,7 @@ private:
Ui::WizardPage *m_ui; Ui::WizardPage *m_ui;
QStringList m_projectToolTips; QStringList m_projectToolTips;
Utils::TreeModel<> *m_model = nullptr; Utils::TreeModel<> m_model;
QList<Core::IVersionControl*> m_activeVersionControls; QList<Core::IVersionControl*> m_activeVersionControls;
QString m_commonDirectory; QString m_commonDirectory;

View File

@@ -92,13 +92,7 @@ public:
static QString sessionTitle(const QString &filePath); static QString sessionTitle(const QString &filePath);
bool hasProjects() const { return !m_projects.isEmpty(); } bool hasProjects() const { return !m_projects.isEmpty(); }
bool hasProject(Project *p) const
{
return Utils::contains(m_projects,
[p](const QPair<Project *, ProjectNode *> &pair) { return pair.first == p; });
}
SessionNode m_sessionNode;
QString m_sessionName = QLatin1String("default"); QString m_sessionName = QLatin1String("default");
bool m_virginSession = true; bool m_virginSession = true;
bool m_loadingSession = false; bool m_loadingSession = false;
@@ -110,7 +104,7 @@ public:
mutable QHash<Project *, QStringList> m_projectFileCache; mutable QHash<Project *, QStringList> m_projectFileCache;
Project *m_startupProject = nullptr; Project *m_startupProject = nullptr;
QList<QPair<Project *,ProjectNode*>> m_projects; QList<Project *> m_projects;
QStringList m_failedProjects; QStringList m_failedProjects;
QMap<QString, QStringList> m_depMap; QMap<QString, QStringList> m_depMap;
QMap<QString, QVariant> m_values; QMap<QString, QVariant> m_values;
@@ -188,36 +182,6 @@ void SessionManager::clearProjectFileCache()
d->m_projectFileCache.clear(); d->m_projectFileCache.clear();
} }
void SessionManager::updateProjectTree(Project *pro)
{
if (!pro)
return;
QPair<Project *, ProjectNode *> *currentPair = nullptr;
for (QPair<Project *, ProjectNode *> &pair : d->m_projects) {
if (pair.first == pro) {
currentPair = &pair;
break;
}
}
if (!currentPair)
return; // Project was already de-registered and is shutting down
ProjectNode *const oldNode = currentPair->second;
ProjectNode *newNode = pro->rootProjectNode();
if (!newNode) {
// Set up generic project structure if the project does not provide any!
newNode = new ProjectNode(pro->projectDirectory());
newNode->setDisplayName(pro->displayName());
newNode->addNode(new FileNode(pro->projectFilePath(), FileType::Project, false));
}
d->m_sessionNode.replaceSubtree(oldNode, newNode);
currentPair->second = newNode;
}
bool SessionManagerPrivate::recursiveDependencyCheck(const QString &newDep, const QString &checkDep) const bool SessionManagerPrivate::recursiveDependencyCheck(const QString &newDep, const QString &checkDep) const
{ {
if (newDep == checkDep) if (newDep == checkDep)
@@ -393,8 +357,8 @@ void SessionManager::setActiveDeployConfiguration(Target *target, DeployConfigur
void SessionManager::setStartupProject(Project *startupProject) void SessionManager::setStartupProject(Project *startupProject)
{ {
QTC_ASSERT((!startupProject) QTC_ASSERT(!startupProject
|| (startupProject && hasProject(startupProject)), return); || (startupProject && d->m_projects.contains(startupProject)), return);
if (d->m_startupProject == startupProject) if (d->m_startupProject == startupProject)
return; return;
@@ -413,13 +377,11 @@ void SessionManager::addProject(Project *pro)
QTC_ASSERT(pro, return); QTC_ASSERT(pro, return);
d->m_virginSession = false; d->m_virginSession = false;
QTC_ASSERT(!hasProject(pro), return); QTC_ASSERT(!d->m_projects.contains(pro), return);
d->m_projects.append(qMakePair(pro, nullptr)); d->m_projects.append(pro);
m_instance->updateProjectTree(pro);
connect(pro, &Project::fileListChanged, m_instance, &SessionManager::clearProjectFileCache); connect(pro, &Project::fileListChanged, m_instance, &SessionManager::clearProjectFileCache);
connect(pro, &Project::projectTreeChanged, m_instance, &SessionManager::updateProjectTree);
emit m_instance->projectAdded(pro); emit m_instance->projectAdded(pro);
configureEditors(pro); configureEditors(pro);
@@ -522,8 +484,7 @@ void SessionManager::closeAllProjects()
const QList<Project *> SessionManager::projects() const QList<Project *> SessionManager::projects()
{ {
return Utils::transform(d->m_projects, return d->m_projects;
[](const QPair<Project *, ProjectNode *> &pair) { return pair.first; });
} }
bool SessionManager::hasProjects() bool SessionManager::hasProjects()
@@ -533,7 +494,7 @@ bool SessionManager::hasProjects()
bool SessionManager::hasProject(Project *p) bool SessionManager::hasProject(Project *p)
{ {
return d->hasProject(p); return d->m_projects.contains(p);
} }
QStringList SessionManagerPrivate::dependencies(const QString &proName) const QStringList SessionManagerPrivate::dependencies(const QString &proName) const
@@ -604,8 +565,8 @@ QStringList SessionManagerPrivate::dependenciesOrder() const
QStringList ordered; QStringList ordered;
// copy the map to a temporary list // copy the map to a temporary list
for (const QPair<Project *, ProjectNode *> &pro : m_projects) { for (const Project *pro : m_projects) {
const QString proName = pro.first->projectFilePath().toString(); const QString proName = pro->projectFilePath().toString();
unordered << QPair<QString, QStringList>(proName, m_depMap.value(proName)); unordered << QPair<QString, QStringList>(proName, m_depMap.value(proName));
} }
@@ -658,13 +619,17 @@ QList<Project *> SessionManager::projectOrder(const Project *project)
Node *SessionManager::nodeForFile(const Utils::FileName &fileName) Node *SessionManager::nodeForFile(const Utils::FileName &fileName)
{ {
Node *node = nullptr; Node *node = nullptr;
sessionNode()->forEachGenericNode([&](Node *n) { for (Project *project : d->m_projects) {
if (n->filePath() == fileName) { if (ProjectNode *projectNode = project->rootProjectNode()) {
// prefer file nodes projectNode->forEachGenericNode([&](Node *n) {
if (!node || (node->nodeType() != NodeType::File && n->nodeType() == NodeType::File)) if (n->filePath() == fileName) {
node = n; // prefer file nodes
if (!node || (node->nodeType() != NodeType::File && n->nodeType() == NodeType::File))
node = n;
}
});
} }
}); }
return node; return node;
} }
@@ -673,25 +638,16 @@ Project *SessionManager::projectForNode(Node *node)
if (!node) if (!node)
return nullptr; return nullptr;
FolderNode *rootProjectNode = node->asFolderNode(); FolderNode *folder = node->asFolderNode();
if (!rootProjectNode) if (!folder)
rootProjectNode = node->parentFolderNode(); folder = node->parentFolderNode();
while (rootProjectNode && rootProjectNode->parentFolderNode() != &d->m_sessionNode) while (folder && folder->parentFolderNode())
rootProjectNode = rootProjectNode->parentFolderNode(); folder = folder->parentFolderNode();
for (const QPair<Project *, ProjectNode *> &pair : d->m_projects) { for (Project *pro : d->m_projects) {
if (pair.second == rootProjectNode) if (pro->containerNode() == folder)
return pair.first; return pro;
}
return nullptr;
}
Node *SessionManager::nodeForProject(Project *project)
{
for (const QPair<Project *,ProjectNode*> &pair : d->m_projects) {
if (pair.first == project)
return pair.second;
} }
return nullptr; return nullptr;
} }
@@ -771,17 +727,9 @@ void SessionManager::removeProjects(QList<Project *> remove)
// Delete projects // Delete projects
foreach (Project *pro, remove) { foreach (Project *pro, remove) {
pro->saveSettings(); pro->saveSettings();
pro->setRootProjectNode(nullptr); // Deregister project with sessionnode!
// Remove the project node: // Remove the project node:
Node *projectNode = nodeForProject(pro); d->m_projects.removeOne(pro);
d->m_sessionNode.removeNode(projectNode);
d->m_projects
= Utils::filtered(d->m_projects, [pro](const QPair<Project *, ProjectNode *> &pair)
{
return pair.first != pro;
});
if (pro == d->m_startupProject) if (pro == d->m_startupProject)
setStartupProject(nullptr); setStartupProject(nullptr);
@@ -965,9 +913,9 @@ void SessionManagerPrivate::restoreStartupProject(const PersistentSettingsReader
{ {
const QString startupProject = reader.restoreValue(QLatin1String("StartupProject")).toString(); const QString startupProject = reader.restoreValue(QLatin1String("StartupProject")).toString();
if (!startupProject.isEmpty()) { if (!startupProject.isEmpty()) {
for (const QPair<Project *, ProjectNode *> &pro : m_projects) { for (Project *pro : m_projects) {
if (pro.first->projectFilePath().toString() == startupProject) { if (pro->projectFilePath().toString() == startupProject) {
m_instance->setStartupProject(pro.first); m_instance->setStartupProject(pro);
break; break;
} }
} }
@@ -976,7 +924,7 @@ void SessionManagerPrivate::restoreStartupProject(const PersistentSettingsReader
if (!startupProject.isEmpty()) if (!startupProject.isEmpty())
qWarning() << "Could not find startup project" << startupProject; qWarning() << "Could not find startup project" << startupProject;
if (hasProjects()) if (hasProjects())
m_instance->setStartupProject(m_projects.first().first); m_instance->setStartupProject(m_projects.first());
} }
} }
@@ -1140,11 +1088,6 @@ QString SessionManager::lastSession()
return ICore::settings()->value(QLatin1String("ProjectExplorer/StartupSession")).toString(); return ICore::settings()->value(QLatin1String("ProjectExplorer/StartupSession")).toString();
} }
SessionNode *SessionManager::sessionNode()
{
return &d->m_sessionNode;
}
void SessionManager::reportProjectLoadingProgress() void SessionManager::reportProjectLoadingProgress()
{ {
d->sessionLoadingProgress(); d->sessionLoadingProgress();

View File

@@ -44,7 +44,6 @@ class Target;
class BuildConfiguration; class BuildConfiguration;
class DeployConfiguration; class DeployConfiguration;
class Node; class Node;
class SessionNode;
enum class SetActive { Cascade, NoCascade }; enum class SetActive { Cascade, NoCascade };
@@ -113,10 +112,7 @@ public:
// NBS rewrite projectOrder (dependency management) // NBS rewrite projectOrder (dependency management)
static QList<Project *> projectOrder(const Project *project = 0); static QList<Project *> projectOrder(const Project *project = 0);
static SessionNode *sessionNode();
static Project *projectForNode(Node *node); static Project *projectForNode(Node *node);
static Node *nodeForProject(Project *project);
static Node *nodeForFile(const Utils::FileName &fileName); static Node *nodeForFile(const Utils::FileName &fileName);
static Project *projectForFile(const Utils::FileName &fileName); static Project *projectForFile(const Utils::FileName &fileName);
@@ -126,8 +122,7 @@ public:
static bool loadingSession(); static bool loadingSession();
signals: signals:
void projectAdded(ProjectExplorer::Project *project); void projectAdded(ProjectExplorer::Project *project); void aboutToRemoveProject(ProjectExplorer::Project *project);
void aboutToRemoveProject(ProjectExplorer::Project *project);
void projectDisplayNameChanged(ProjectExplorer::Project *project); void projectDisplayNameChanged(ProjectExplorer::Project *project);
void projectRemoved(ProjectExplorer::Project *project); void projectRemoved(ProjectExplorer::Project *project);
@@ -145,7 +140,6 @@ signals: // for tests only
private: private:
static void saveActiveMode(Core::Id mode); static void saveActiveMode(Core::Id mode);
void clearProjectFileCache(); void clearProjectFileCache();
void updateProjectTree(Project *pro);
static void configureEditor(Core::IEditor *editor, const QString &fileName); static void configureEditor(Core::IEditor *editor, const QString &fileName);
static void markSessionFileDirty(bool makeDefaultVirginDirty = true); static void markSessionFileDirty(bool makeDefaultVirginDirty = true);
static void configureEditors(Project *project); static void configureEditors(Project *project);