diff options
author | Eike Ziller <eike.ziller@qt.io> | 2017-03-22 10:26:01 +0100 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2017-03-22 10:26:01 +0100 |
commit | edee1e805c13310525a0c01ed4db58f7d16eee5b (patch) | |
tree | 82b55fa6d3c1b6113dce9e41b6592e2b5b422a9e /src/plugins/projectexplorer | |
parent | 4d3c297d024a86201d70d478beffa61176ac1e82 (diff) | |
parent | 26e76d3387c4053a334a08d2b0ca22b9e4b18f6c (diff) |
Merge remote-tracking branch 'origin/4.3'
Change-Id: I266a41de38789922363d1d88e73726cdca608920
Diffstat (limited to 'src/plugins/projectexplorer')
-rw-r--r-- | src/plugins/projectexplorer/project.cpp | 54 | ||||
-rw-r--r-- | src/plugins/projectexplorer/project.h | 2 | ||||
-rw-r--r-- | src/plugins/projectexplorer/projectmodels.cpp | 82 | ||||
-rw-r--r-- | src/plugins/projectexplorer/projectmodels.h | 1 | ||||
-rw-r--r-- | src/plugins/projectexplorer/projectnodes.cpp | 45 | ||||
-rw-r--r-- | src/plugins/projectexplorer/projectnodes.h | 23 | ||||
-rw-r--r-- | src/plugins/projectexplorer/projecttree.cpp | 20 | ||||
-rw-r--r-- | src/plugins/projectexplorer/projecttree.h | 6 | ||||
-rw-r--r-- | src/plugins/projectexplorer/projecttreewidget.cpp | 34 | ||||
-rw-r--r-- | src/plugins/projectexplorer/projectwelcomepage.cpp | 26 | ||||
-rw-r--r-- | src/plugins/projectexplorer/projectwizardpage.cpp | 33 | ||||
-rw-r--r-- | src/plugins/projectexplorer/projectwizardpage.h | 2 | ||||
-rw-r--r-- | src/plugins/projectexplorer/session.cpp | 121 | ||||
-rw-r--r-- | src/plugins/projectexplorer/session.h | 8 |
14 files changed, 186 insertions, 271 deletions
diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index 7d283d3901..e8b68a4560 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -39,6 +39,9 @@ #include <coreplugin/idocument.h> #include <coreplugin/icontext.h> #include <coreplugin/icore.h> +#include <coreplugin/iversioncontrol.h> +#include <coreplugin/vcsmanager.h> + #include <projectexplorer/buildmanager.h> #include <projectexplorer/kitmanager.h> #include <projectexplorer/projecttree.h> @@ -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<ProjectAction> 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<Target *> 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"), @@ -426,9 +463,13 @@ void Project::setRootProjectNode(ProjectNode *root) ProjectTree::applyTreeManager(root); + ProjectNode *oldNode = d->m_rootProjectNode; d->m_rootProjectNode = root; - emit projectTreeChanged(this, QPrivateSignal()); - // Do not delete oldNode! The ProjectTree owns that! + if (root) + root->setParentFolderNode(&d->m_containerNode); + ProjectTree::emitSubtreeChanged(root); + + delete oldNode; } Target *Project::restoreTarget(const QVariantMap &data) @@ -532,6 +573,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); diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h index 3ca35707fc..8de6d9ec21 100644 --- a/src/plugins/projectexplorer/project.h +++ b/src/plugins/projectexplorer/project.h @@ -81,6 +81,7 @@ public: static Utils::FileName projectDirectory(const Utils::FileName &top); virtual ProjectNode *rootProjectNode() const; + ProjectNode *containerNode() const; bool hasActiveBuildSettings() const; @@ -142,7 +143,6 @@ public: Utils::MacroExpander *macroExpander() const; signals: - void projectTreeChanged(Project *project, QPrivateSignal); void displayNameChanged(); void fileListChanged(); diff --git a/src/plugins/projectexplorer/projectmodels.cpp b/src/plugins/projectexplorer/projectmodels.cpp index 1a362da0c5..53be442b19 100644 --- a/src/plugins/projectexplorer/projectmodels.cpp +++ b/src/plugins/projectexplorer/projectmodels.cpp @@ -71,7 +71,7 @@ static bool sortWrapperNodes(const WrapperNode *w1, const WrapperNode *w2) } FlatModel::FlatModel(QObject *parent) - : TreeModel<WrapperNode, WrapperNode>(new WrapperNode(SessionManager::sessionNode()), parent) + : TreeModel<WrapperNode, WrapperNode>(new WrapperNode(nullptr), parent) { ProjectTree *tree = ProjectTree::instance(); connect(tree, &ProjectTree::subtreeChanged, this, &FlatModel::update); @@ -93,17 +93,7 @@ QVariant FlatModel::data(const QModelIndex &index, int role) const FolderNode *folderNode = node->asFolderNode(); switch (role) { case Qt::DisplayRole: { - QString name = 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; + result = node->displayName(); break; } case Qt::EditRole: { @@ -124,7 +114,7 @@ QVariant FlatModel::data(const QModelIndex &index, int role) const case Qt::FontRole: { QFont font; if (Project *project = SessionManager::startupProject()) { - if (node == SessionManager::nodeForProject(project)) + if (node == project->containerNode()) font.setBold(true); } result = font; @@ -187,23 +177,44 @@ void FlatModel::update() 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; rootItem()->removeChildren(); - for (Node *node : SessionManager::sessionNode()->nodes()) { - if (ProjectNode *projectNode = node->asProjectNode()) { - if (!seen.contains(projectNode)) - addProjectNode(rootItem(), projectNode, &seen); + for (Project *project : projects) { + WrapperNode *container = new WrapperNode(project->containerNode()); + + 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) { - const QString path = node->m_node->filePath().toString(); - const QString displayName = node->m_node->displayName(); - ExpandData ed(path, displayName); - if (m_toExpand.contains(ed)) + if (node->m_node) { + const QString path = node->m_node->filePath().toString(); + const QString displayName = node->m_node->displayName(); + ExpandData ed(path, displayName); + if (m_toExpand.contains(ed)) + emit requestExpansion(node->index()); + } else { emit requestExpansion(node->index()); + } }); } @@ -227,7 +238,7 @@ ExpandData FlatModel::expandDataForNode(const Node *node) const void FlatModel::handleProjectAdded(Project *project) { - Node *node = SessionManager::nodeForProject(project); + Node *node = project->rootProjectNode(); m_toExpand.insert(expandDataForNode(node)); if (WrapperNode *wrapper = wrapperForNode(node)) { wrapper->forFirstLevelChildren([this](WrapperNode *child) { @@ -251,21 +262,6 @@ void FlatModel::saveExpandData() 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) { const QList<FolderNode *> subFolderNodes = folderNode->folderNodes(); @@ -374,16 +370,6 @@ const QLoggingCategory &FlatModel::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 { int caseFriendlyCompare(const QString &a, const QString &b) diff --git a/src/plugins/projectexplorer/projectmodels.h b/src/plugins/projectexplorer/projectmodels.h index 25a808ce35..8d177c8b0c 100644 --- a/src/plugins/projectexplorer/projectmodels.h +++ b/src/plugins/projectexplorer/projectmodels.h @@ -94,7 +94,6 @@ private: void update(); void rebuildModel(); - void addProjectNode(WrapperNode *parent, ProjectNode *projectNode, QSet<Node *> *seen); void addFolderNode(WrapperNode *parent, FolderNode *folderNode, QSet<Node *> *seen); ExpandData expandDataForNode(const Node *node) const; diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index 8557b99003..0d3b102522 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -214,9 +214,12 @@ bool Node::isEnabled() const QList<ProjectAction> Node::supportedActions(Node *node) const { - QList<ProjectAction> list = parentFolderNode()->supportedActions(node); - list.append(InheritedFromParent); - return list; + if (FolderNode *folder = parentFolderNode()) { + QList<ProjectAction> list = folder->supportedActions(node); + list.append(InheritedFromParent); + return list; + } + return {}; } void Node::setEnabled(bool enabled) @@ -702,18 +705,6 @@ ProjectNode::ProjectNode(const Utils::FileName &projectFilePath) : 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 { Q_UNUSED(proFilePath) @@ -797,28 +788,4 @@ bool FolderNode::isEmpty() const 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 diff --git a/src/plugins/projectexplorer/projectnodes.h b/src/plugins/projectexplorer/projectnodes.h index fb17b4806e..757529da8b 100644 --- a/src/plugins/projectexplorer/projectnodes.h +++ b/src/plugins/projectexplorer/projectnodes.h @@ -40,14 +40,12 @@ namespace Utils { class MimeType; } namespace ProjectExplorer { class RunConfiguration; -class SessionManager; enum class NodeType : quint16 { File = 1, Folder, VirtualFolder, - Project, - Session + Project }; // File types common for qt projects @@ -275,8 +273,6 @@ private: class PROJECTEXPLORER_EXPORT ProjectNode : public FolderNode { public: - QString vcsTopic() const; - virtual bool canAddSubProject(const QString &proFilePath) const; virtual bool addSubProject(const QString &proFile); virtual bool removeSubProject(const QString &proFilePath); @@ -298,24 +294,7 @@ public: const ProjectNode *asProjectNode() const final { return this; } protected: - // this is just the in-memory representation, a subclass - // will add the persistent stuff 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 diff --git a/src/plugins/projectexplorer/projecttree.cpp b/src/plugins/projectexplorer/projecttree.cpp index 86d8ef1d26..6d32406015 100644 --- a/src/plugins/projectexplorer/projecttree.cpp +++ b/src/plugins/projectexplorer/projecttree.cpp @@ -261,9 +261,6 @@ void ProjectTree::updateContext() void ProjectTree::emitSubtreeChanged(FolderNode *node) { - if (!SessionManager::sessionNode()->isAncesterOf(node)) - return; - emit s_instance->subtreeChanged(node); } @@ -318,16 +315,15 @@ bool ProjectTree::hasFocus(ProjectTreeWidget *widget) void ProjectTree::showContextMenu(ProjectTreeWidget *focus, const QPoint &globalPos, Node *node) { QMenu *contextMenu = nullptr; + Project *project = SessionManager::projectForNode(node); + emit s_instance->aboutToShowContextMenu(project, node); - if (!node) - node = SessionManager::sessionNode(); - if (node->nodeType() != NodeType::Session) { - Project *project = SessionManager::projectForNode(node); - - emit s_instance->aboutToShowContextMenu(project, node); + if (!node) { + contextMenu = Core::ActionManager::actionContainer(Constants::M_SESSIONCONTEXT)->menu(); + } else { switch (node->nodeType()) { case NodeType::Project: - if (node->parentFolderNode() == SessionManager::sessionNode()) + if (node->parentFolderNode()) contextMenu = Core::ActionManager::actionContainer(Constants::M_PROJECTCONTEXT)->menu(); else contextMenu = Core::ActionManager::actionContainer(Constants::M_SUBPROJECTCONTEXT)->menu(); @@ -342,10 +338,6 @@ void ProjectTree::showContextMenu(ProjectTreeWidget *focus, const QPoint &global default: 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) { diff --git a/src/plugins/projectexplorer/projecttree.h b/src/plugins/projectexplorer/projecttree.h index 74f0c53a2c..eb84adf58b 100644 --- a/src/plugins/projectexplorer/projecttree.h +++ b/src/plugins/projectexplorer/projecttree.h @@ -70,6 +70,9 @@ public: void collapseAll(); + // for nodes to emit signals, do not call unless you are a node + static void emitSubtreeChanged(FolderNode *node); + signals: void currentProjectChanged(ProjectExplorer::Project *project); void currentNodeChanged(); @@ -80,9 +83,6 @@ signals: void aboutToShowContextMenu(ProjectExplorer::Project *project, ProjectExplorer::Node *node); -public: // for nodes to emit signals, do not call unless you are a node - static void emitSubtreeChanged(FolderNode *node); - private: void sessionChanged(); void focusChanged(); diff --git a/src/plugins/projectexplorer/projecttreewidget.cpp b/src/plugins/projectexplorer/projecttreewidget.cpp index 67bbf07405..372dbdb757 100644 --- a/src/plugins/projectexplorer/projecttreewidget.cpp +++ b/src/plugins/projectexplorer/projecttreewidget.cpp @@ -275,23 +275,27 @@ Node *ProjectTreeWidget::nodeForFile(const Utils::FileName &fileName) Node *bestNode = nullptr; int bestNodeExpandCount = INT_MAX; - SessionManager::sessionNode()->forEachGenericNode([&](Node *node) { - if (node->filePath() == fileName) { - if (!bestNode) { - bestNode = node; - bestNodeExpandCount = ProjectTreeWidget::expandedCount(node); - } else if (node->nodeType() < bestNode->nodeType()) { - bestNode = node; - bestNodeExpandCount = ProjectTreeWidget::expandedCount(node); - } else if (node->nodeType() == bestNode->nodeType()) { - int nodeExpandCount = ProjectTreeWidget::expandedCount(node); - if (nodeExpandCount < bestNodeExpandCount) { - bestNode = node; - bestNodeExpandCount = ProjectTreeWidget::expandedCount(node); + for (Project *project : SessionManager::projects()) { + if (ProjectNode *projectNode = project->rootProjectNode()) { + projectNode->forEachGenericNode([&](Node *node) { + if (node->filePath() == fileName) { + if (!bestNode) { + bestNode = node; + bestNodeExpandCount = ProjectTreeWidget::expandedCount(node); + } else if (node->nodeType() < bestNode->nodeType()) { + bestNode = node; + bestNodeExpandCount = ProjectTreeWidget::expandedCount(node); + } else if (node->nodeType() == bestNode->nodeType()) { + int nodeExpandCount = ProjectTreeWidget::expandedCount(node); + if (nodeExpandCount < bestNodeExpandCount) { + bestNode = node; + bestNodeExpandCount = ProjectTreeWidget::expandedCount(node); + } + } } - } + }); } - }); + } return bestNode; } diff --git a/src/plugins/projectexplorer/projectwelcomepage.cpp b/src/plugins/projectexplorer/projectwelcomepage.cpp index ebd52104ba..8f9029028e 100644 --- a/src/plugins/projectexplorer/projectwelcomepage.cpp +++ b/src/plugins/projectexplorer/projectwelcomepage.cpp @@ -55,6 +55,8 @@ using namespace Core; using namespace Utils; +const int LINK_HEIGHT = 35; + namespace ProjectExplorer { namespace Internal { @@ -154,13 +156,18 @@ class BaseDelegate : public QAbstractItemDelegate { protected: virtual QString entryType() = 0; + virtual QRect toolTipArea(const QRect &itemRect, const QModelIndex &) const + { + return itemRect; + } bool helpEvent(QHelpEvent *ev, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &idx) final { - const int y = ev->pos().y(); - if (y > option.rect.bottom() - 20) + if (!toolTipArea(option.rect, idx).contains(ev->pos())) { + QToolTip::hideText(); return false; + } QString shortcut; if (idx.row() < m_shortcuts.size()) @@ -188,6 +195,13 @@ class SessionDelegate : public BaseDelegate { protected: QString entryType() override { return tr("session", "Appears in \"Open session <name>\""); } + QRect toolTipArea(const QRect &itemRect, const QModelIndex &idx) const override + { + // in expanded state bottom contains 'Clone', 'Rename', etc links, where the tool tip + // would be confusing + const bool expanded = m_expandedSessions.contains(idx.data(Qt::DisplayRole).toString()); + return expanded ? itemRect.adjusted(0, 0, 0, -LINK_HEIGHT) : itemRect; + } public: SessionDelegate() { @@ -312,7 +326,7 @@ public: QString sessionName = idx.data(Qt::DisplayRole).toString(); if (m_expandedSessions.contains(sessionName)) { QStringList projects = SessionManager::projectsForSessionName(sessionName); - h += projects.size() * 40 + 35; + h += projects.size() * 40 + LINK_HEIGHT; } return QSize(380, h); } @@ -408,7 +422,7 @@ public: painter->drawPixmap(x + 11, y + 3, pixmap("project", Theme::Welcome_ForegroundSecondaryColor)); QString projectName = idx.data(Qt::DisplayRole).toString(); - QString projectPath = idx.data(Qt::UserRole + 1).toString(); + QString projectPath = idx.data(ProjectModel::FilePathRole).toString(); painter->setPen(themeColor(Theme::Welcome_ForegroundSecondaryColor)); painter->setFont(sizedFont(10, option.widget)); @@ -429,7 +443,7 @@ public: QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &idx) const final { QString projectName = idx.data(Qt::DisplayRole).toString(); - QString projectPath = idx.data(Qt::UserRole + 1).toString(); + QString projectPath = idx.data(ProjectModel::FilePathRole).toString(); QFontMetrics fm(sizedFont(13, option.widget)); int width = std::max(fm.width(projectName), fm.width(projectPath)) + 36; return QSize(width, 48); @@ -439,7 +453,7 @@ public: const QStyleOptionViewItem &, const QModelIndex &idx) final { if (ev->type() == QEvent::MouseButtonRelease) { - QString projectFile = idx.data(Qt::UserRole + 1).toString(); + QString projectFile = idx.data(ProjectModel::FilePathRole).toString(); ProjectExplorerPlugin::openProjectWelcomePage(projectFile); return true; } diff --git a/src/plugins/projectexplorer/projectwizardpage.cpp b/src/plugins/projectexplorer/projectwizardpage.cpp index 6a5c2bd261..88756a3599 100644 --- a/src/plugins/projectexplorer/projectwizardpage.cpp +++ b/src/plugins/projectexplorer/projectwizardpage.cpp @@ -26,6 +26,7 @@ #include "projectwizardpage.h" #include "ui_projectwizardpage.h" +#include "project.h" #include "projectexplorer.h" #include "session.h" @@ -300,18 +301,14 @@ ProjectWizardPage::~ProjectWizardPage() { disconnect(m_ui->projectComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, &ProjectWizardPage::projectChanged); - delete m_model; delete m_ui; } void ProjectWizardPage::setModel(Utils::TreeModel<> *model) { - delete m_model; - m_model = model; - // TODO see OverViewCombo and OverView for click event filter m_ui->projectComboBox->setModel(model); - bool enabled = m_model->rowCount(QModelIndex()) > 1; + bool enabled = m_model.rowCount(QModelIndex()) > 1; m_ui->projectComboBox->setEnabled(enabled); expandTree(QModelIndex()); @@ -324,9 +321,9 @@ bool ProjectWizardPage::expandTree(const QModelIndex &root) expand = true; // Check children - int count = m_model->rowCount(root); + int count = m_model.rowCount(root); 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; } @@ -346,7 +343,7 @@ bool ProjectWizardPage::expandTree(const QModelIndex &root) 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); while (index.isValid()) { @@ -454,28 +451,22 @@ void ProjectWizardPage::initializeProjectTree(Node *context, const QStringList & { BestNodeSelector selector(m_commonDirectory, paths); - AddNewTree *tree; - SessionNode *root = SessionManager::sessionNode(); - QList<AddNewTree *> children; - - for (Node *node : root->nodes()) { - if (ProjectNode *pn = node->asProjectNode()) { + TreeItem *root = m_model.rootItem(); + root->removeChildren(); + for (Project *project : SessionManager::projects()) { + if (ProjectNode *pn = project->rootProjectNode()) { if (kind == IWizardFactory::ProjectWizard) { if (AddNewTree *child = buildAddProjectTree(pn, paths.first(), context, &selector)) - children.append(child); + root->appendChild(child); } else { if (AddNewTree *child = buildAddFilesTree(pn, paths, context, &selector)) - children.append(child); + root->appendChild(child); } } } - - children.prepend(createNoneNode(&selector)); - tree = new AddNewTree(root, children, root->displayName()); + root->prependChild(createNoneNode(&selector)); setAdditionalInfo(selector.deployingProjects()); - - setModel(new TreeModel<>(tree)); setBestNode(selector.bestChoice()); setAddingSubProject(action == AddSubProject); } diff --git a/src/plugins/projectexplorer/projectwizardpage.h b/src/plugins/projectexplorer/projectwizardpage.h index ce4f77d625..1516a87cfe 100644 --- a/src/plugins/projectexplorer/projectwizardpage.h +++ b/src/plugins/projectexplorer/projectwizardpage.h @@ -95,7 +95,7 @@ private: Ui::WizardPage *m_ui; QStringList m_projectToolTips; - Utils::TreeModel<> *m_model = nullptr; + Utils::TreeModel<> m_model; QList<Core::IVersionControl*> m_activeVersionControls; QString m_commonDirectory; diff --git a/src/plugins/projectexplorer/session.cpp b/src/plugins/projectexplorer/session.cpp index 2e87aef4ff..9286155bfb 100644 --- a/src/plugins/projectexplorer/session.cpp +++ b/src/plugins/projectexplorer/session.cpp @@ -92,13 +92,7 @@ public: static QString sessionTitle(const QString &filePath); 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"); bool m_virginSession = true; bool m_loadingSession = false; @@ -110,7 +104,7 @@ public: mutable QHash<Project *, QStringList> m_projectFileCache; Project *m_startupProject = nullptr; - QList<QPair<Project *,ProjectNode*>> m_projects; + QList<Project *> m_projects; QStringList m_failedProjects; QMap<QString, QStringList> m_depMap; QMap<QString, QVariant> m_values; @@ -188,36 +182,6 @@ void SessionManager::clearProjectFileCache() 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 { if (newDep == checkDep) @@ -393,8 +357,8 @@ void SessionManager::setActiveDeployConfiguration(Target *target, DeployConfigur void SessionManager::setStartupProject(Project *startupProject) { - QTC_ASSERT((!startupProject) - || (startupProject && hasProject(startupProject)), return); + QTC_ASSERT(!startupProject + || (startupProject && d->m_projects.contains(startupProject)), return); if (d->m_startupProject == startupProject) return; @@ -413,13 +377,11 @@ void SessionManager::addProject(Project *pro) QTC_ASSERT(pro, return); d->m_virginSession = false; - QTC_ASSERT(!hasProject(pro), return); + QTC_ASSERT(!d->m_projects.contains(pro), return); - d->m_projects.append(qMakePair(pro, nullptr)); - m_instance->updateProjectTree(pro); + d->m_projects.append(pro); connect(pro, &Project::fileListChanged, m_instance, &SessionManager::clearProjectFileCache); - connect(pro, &Project::projectTreeChanged, m_instance, &SessionManager::updateProjectTree); emit m_instance->projectAdded(pro); configureEditors(pro); @@ -522,8 +484,7 @@ void SessionManager::closeAllProjects() const QList<Project *> SessionManager::projects() { - return Utils::transform(d->m_projects, - [](const QPair<Project *, ProjectNode *> &pair) { return pair.first; }); + return d->m_projects; } bool SessionManager::hasProjects() @@ -533,7 +494,7 @@ bool SessionManager::hasProjects() bool SessionManager::hasProject(Project *p) { - return d->hasProject(p); + return d->m_projects.contains(p); } QStringList SessionManagerPrivate::dependencies(const QString &proName) const @@ -604,8 +565,8 @@ QStringList SessionManagerPrivate::dependenciesOrder() const QStringList ordered; // copy the map to a temporary list - for (const QPair<Project *, ProjectNode *> &pro : m_projects) { - const QString proName = pro.first->projectFilePath().toString(); + for (const Project *pro : m_projects) { + const QString proName = pro->projectFilePath().toString(); 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 *node = nullptr; - sessionNode()->forEachGenericNode([&](Node *n) { - if (n->filePath() == fileName) { - // prefer file nodes - if (!node || (node->nodeType() != NodeType::File && n->nodeType() == NodeType::File)) - node = n; + for (Project *project : d->m_projects) { + if (ProjectNode *projectNode = project->rootProjectNode()) { + projectNode->forEachGenericNode([&](Node *n) { + if (n->filePath() == fileName) { + // prefer file nodes + if (!node || (node->nodeType() != NodeType::File && n->nodeType() == NodeType::File)) + node = n; + } + }); } - }); + } return node; } @@ -673,25 +638,16 @@ Project *SessionManager::projectForNode(Node *node) if (!node) return nullptr; - FolderNode *rootProjectNode = node->asFolderNode(); - if (!rootProjectNode) - rootProjectNode = node->parentFolderNode(); + FolderNode *folder = node->asFolderNode(); + if (!folder) + folder = node->parentFolderNode(); - while (rootProjectNode && rootProjectNode->parentFolderNode() != &d->m_sessionNode) - rootProjectNode = rootProjectNode->parentFolderNode(); - - for (const QPair<Project *, ProjectNode *> &pair : d->m_projects) { - if (pair.second == rootProjectNode) - return pair.first; - } - return nullptr; -} + while (folder && folder->parentFolderNode()) + folder = folder->parentFolderNode(); -Node *SessionManager::nodeForProject(Project *project) -{ - for (const QPair<Project *,ProjectNode*> &pair : d->m_projects) { - if (pair.first == project) - return pair.second; + for (Project *pro : d->m_projects) { + if (pro->containerNode() == folder) + return pro; } return nullptr; } @@ -771,17 +727,9 @@ void SessionManager::removeProjects(QList<Project *> remove) // Delete projects foreach (Project *pro, remove) { pro->saveSettings(); - pro->setRootProjectNode(nullptr); // Deregister project with sessionnode! // Remove the project node: - Node *projectNode = nodeForProject(pro); - d->m_sessionNode.removeNode(projectNode); - - d->m_projects - = Utils::filtered(d->m_projects, [pro](const QPair<Project *, ProjectNode *> &pair) - { - return pair.first != pro; - }); + d->m_projects.removeOne(pro); if (pro == d->m_startupProject) setStartupProject(nullptr); @@ -965,9 +913,9 @@ void SessionManagerPrivate::restoreStartupProject(const PersistentSettingsReader { const QString startupProject = reader.restoreValue(QLatin1String("StartupProject")).toString(); if (!startupProject.isEmpty()) { - for (const QPair<Project *, ProjectNode *> &pro : m_projects) { - if (pro.first->projectFilePath().toString() == startupProject) { - m_instance->setStartupProject(pro.first); + for (Project *pro : m_projects) { + if (pro->projectFilePath().toString() == startupProject) { + m_instance->setStartupProject(pro); break; } } @@ -976,7 +924,7 @@ void SessionManagerPrivate::restoreStartupProject(const PersistentSettingsReader if (!startupProject.isEmpty()) qWarning() << "Could not find startup project" << startupProject; 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(); } -SessionNode *SessionManager::sessionNode() -{ - return &d->m_sessionNode; -} - void SessionManager::reportProjectLoadingProgress() { d->sessionLoadingProgress(); diff --git a/src/plugins/projectexplorer/session.h b/src/plugins/projectexplorer/session.h index c654efc615..8d6987363a 100644 --- a/src/plugins/projectexplorer/session.h +++ b/src/plugins/projectexplorer/session.h @@ -44,7 +44,6 @@ class Target; class BuildConfiguration; class DeployConfiguration; class Node; -class SessionNode; enum class SetActive { Cascade, NoCascade }; @@ -113,10 +112,7 @@ public: // NBS rewrite projectOrder (dependency management) static QList<Project *> projectOrder(const Project *project = 0); - static SessionNode *sessionNode(); - static Project *projectForNode(Node *node); - static Node *nodeForProject(Project *project); static Node *nodeForFile(const Utils::FileName &fileName); static Project *projectForFile(const Utils::FileName &fileName); @@ -126,8 +122,7 @@ public: static bool loadingSession(); signals: - void projectAdded(ProjectExplorer::Project *project); - void aboutToRemoveProject(ProjectExplorer::Project *project); + void projectAdded(ProjectExplorer::Project *project); void aboutToRemoveProject(ProjectExplorer::Project *project); void projectDisplayNameChanged(ProjectExplorer::Project *project); void projectRemoved(ProjectExplorer::Project *project); @@ -145,7 +140,6 @@ signals: // for tests only private: static void saveActiveMode(Core::Id mode); void clearProjectFileCache(); - void updateProjectTree(Project *pro); static void configureEditor(Core::IEditor *editor, const QString &fileName); static void markSessionFileDirty(bool makeDefaultVirginDirty = true); static void configureEditors(Project *project); |