From 563b5033f87810288192e1a15fd918ec6cc2dee7 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 28 Feb 2017 14:13:41 +0100 Subject: [PATCH] Qmake: Fix build/run qmake from context menu again This got broken when refactoring the project nodes. Change-Id: Iae4614f4a367cefeba3f70faaf19bc2f8994fb0f Reviewed-by: hjk Reviewed-by: Tim Jenssen --- .../qmakeprojectmanager.cpp | 53 +++++++++---------- .../qmakeprojectmanager/qmakeprojectmanager.h | 8 +-- .../qmakeprojectmanagerplugin.cpp | 20 +++---- .../qmakeprojectmanagerplugin.h | 1 - 4 files changed, 40 insertions(+), 42 deletions(-) diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectmanager.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectmanager.cpp index b2797b13a0f..e2563f14224 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectmanager.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeprojectmanager.cpp @@ -88,30 +88,31 @@ ProjectExplorer::Project *QmakeManager::openProject(const QString &fileName, QSt Node *QmakeManager::contextNode() { - Node *node = ProjectTree::currentNode(); - if (!node) - return nullptr; - auto subPriFileNode = dynamic_cast(node); - return subPriFileNode ? subPriFileNode->proFileNode() : node->parentProjectNode(); + return ProjectTree::currentNode(); } -QmakeProject *QmakeManager::contextProject() +Project *QmakeManager::contextProject() { - return qobject_cast(ProjectTree::currentProject()); + return ProjectTree::currentProject(); } -FileNode *QmakeManager::contextFile() +static QmakeProFileNode *buildableFileProFile(Node *node) { - Node *node = ProjectTree::currentNode(); - - QmakeProFileNode *subProjectNode = nullptr; if (node) { auto subPriFileNode = dynamic_cast(node); if (!subPriFileNode) subPriFileNode = dynamic_cast(node->parentProjectNode()); if (subPriFileNode) - subProjectNode = subPriFileNode->proFileNode(); + return subPriFileNode->proFileNode(); } + return nullptr; +} + +FileNode *QmakeManager::contextBuildableFileNode() +{ + Node *node = contextNode(); + + QmakeProFileNode *subProjectNode = buildableFileProFile(node); FileNode *fileNode = node ? node->asFileNode() : nullptr; bool buildFilePossible = subProjectNode && fileNode && (fileNode->fileType() == ProjectExplorer::FileType::Source); @@ -127,7 +128,7 @@ void QmakeManager::addLibrary() void QmakeManager::addLibraryContextMenu() { - Node *node = ProjectTree::currentNode(); + Node *node = contextNode(); if (dynamic_cast(node)) addLibraryImpl(node->filePath().toString(), nullptr); } @@ -157,7 +158,6 @@ void QmakeManager::addLibraryImpl(const QString &fileName, BaseTextEditor *edito editor->insert(snippet); } - void QmakeManager::runQMake() { runQMakeImpl(SessionManager::startupProject(), nullptr); @@ -175,8 +175,7 @@ void QmakeManager::runQMakeImpl(ProjectExplorer::Project *p, ProjectExplorer::No QmakeProject *qmakeProject = qobject_cast(p); QTC_ASSERT(qmakeProject, return); - if (!qmakeProject->activeTarget() || - !qmakeProject->activeTarget()->activeBuildConfiguration()) + if (!qmakeProject->activeTarget() || !qmakeProject->activeTarget()->activeBuildConfiguration()) return; QmakeBuildConfiguration *bc = static_cast(qmakeProject->activeTarget()->activeBuildConfiguration()); @@ -187,7 +186,7 @@ void QmakeManager::runQMakeImpl(ProjectExplorer::Project *p, ProjectExplorer::No //found qmakeStep, now use it qs->setForced(true); - if (node != 0 && node != qmakeProject->rootProjectNode()) + if (node && node != qmakeProject->rootProjectNode()) if (QmakeProFileNode *profile = dynamic_cast(node)) bc->setSubNodeBuild(profile); @@ -230,11 +229,13 @@ void QmakeManager::buildFile() void QmakeManager::handleSubDirContextMenu(QmakeManager::Action action, bool isFileBuild) { - handleSubDirContextMenu(action, isFileBuild, contextProject(), contextNode(), contextFile()); + handleSubDirContextMenu(action, isFileBuild, contextProject(), + buildableFileProFile(contextNode()), contextBuildableFileNode()); } void QmakeManager::handleSubDirContextMenu(QmakeManager::Action action, bool isFileBuild, - Project *contextProject, Node *contextNode, FileNode *contextFile) + Project *contextProject, Node *contextNode, + FileNode *buildableFile) { QTC_ASSERT(contextProject, return); Target *target = contextProject->activeTarget(); @@ -245,20 +246,16 @@ void QmakeManager::handleSubDirContextMenu(QmakeManager::Action action, bool isF if (!bc) return; - if (!contextNode || !contextFile) + if (!contextNode || !buildableFile) isFileBuild = false; - if (contextNode) { - if (QmakePriFileNode *prifile = dynamic_cast(contextNode)) { - if (QmakeProFileNode *profile = prifile->proFileNode()) { - if (profile != contextProject->rootProjectNode() || isFileBuild) - bc->setSubNodeBuild(profile); - } - } + if (QmakeProFileNode *profile = dynamic_cast(contextNode)) { + if (profile != contextProject->rootProjectNode() || isFileBuild) + bc->setSubNodeBuild(profile); } if (isFileBuild) - bc->setFileNodeBuild(contextFile); + bc->setFileNodeBuild(buildableFile); if (ProjectExplorerPlugin::saveModifiedFiles()) { const Core::Id buildStep = ProjectExplorer::Constants::BUILDSTEPS_BUILD; const Core::Id cleanStep = ProjectExplorer::Constants::BUILDSTEPS_CLEAN; diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectmanager.h b/src/plugins/qmakeprojectmanager/qmakeprojectmanager.h index a49b9253620..a32cb665ef7 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectmanager.h +++ b/src/plugins/qmakeprojectmanager/qmakeprojectmanager.h @@ -57,8 +57,8 @@ public: // Context information used in the slot implementations static ProjectExplorer::Node *contextNode(); - static QmakeProject *contextProject(); - static ProjectExplorer::FileNode *contextFile(); + static ProjectExplorer::Project *contextProject(); + static ProjectExplorer::FileNode *contextBuildableFileNode(); enum Action { BUILD, REBUILD, CLEAN }; @@ -77,8 +77,8 @@ private: void handleSubDirContextMenu(Action action, bool isFileBuild); void handleSubDirContextMenu(QmakeManager::Action action, bool isFileBuild, ProjectExplorer::Project *contextProject, - ProjectExplorer::Node *contextNode, - ProjectExplorer::FileNode *contextFile); + ProjectExplorer::Node *contextProFileNode, + ProjectExplorer::FileNode *buildableFile); void addLibraryImpl(const QString &fileName, TextEditor::BaseTextEditor *editor); void runQMakeImpl(ProjectExplorer::Project *p, ProjectExplorer::Node *node); }; diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp index 8dce028a93b..33102fa7e16 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp @@ -71,10 +71,6 @@ using namespace QmakeProjectManager::Internal; using namespace QmakeProjectManager; using namespace ProjectExplorer; -QmakeProjectManagerPlugin::~QmakeProjectManagerPlugin() -{ -} - bool QmakeProjectManagerPlugin::initialize(const QStringList &arguments, QString *errorMessage) { Q_UNUSED(arguments) @@ -318,17 +314,23 @@ void QmakeProjectManagerPlugin::updateContextActions() Project *project = ProjectTree::currentProject(); m_addLibraryActionContextMenu->setEnabled(dynamic_cast(node)); - FileNode *proFileNode = QmakeManager::contextFile(); - QmakeProject *qmakeProject = QmakeManager::contextProject(); - Node *subProjectNode = QmakeManager::contextNode(); + auto proFileNode = dynamic_cast(node); + QmakeProject *qmakeProject = qobject_cast(QmakeManager::contextProject()); + QmakeProFileNode *subProjectNode = nullptr; + if (node) { + auto subPriFileNode = dynamic_cast(node); + if (!subPriFileNode) + subPriFileNode = dynamic_cast(node->parentProjectNode()); + subProjectNode = subPriFileNode ? subPriFileNode->proFileNode() : nullptr; + } FileNode *fileNode = node ? node->asFileNode() : nullptr; bool buildFilePossible = subProjectNode && fileNode && (fileNode->fileType() == FileType::Source); - bool subProjectActionsVisible = qmakeProject && subProjectNode && (subProjectNode != qmakeProject->rootProjectNode()); + bool subProjectActionsVisible = qmakeProject && proFileNode && (proFileNode != qmakeProject->rootProjectNode()); QString subProjectName; if (subProjectActionsVisible) - subProjectName = subProjectNode->displayName(); + subProjectName = proFileNode->displayName(); m_buildSubProjectAction->setParameter(subProjectName); m_rebuildSubProjectAction->setParameter(subProjectName); diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.h b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.h index fe06f440f52..73e60b4bac8 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.h +++ b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.h @@ -51,7 +51,6 @@ class QmakeProjectManagerPlugin : public ExtensionSystem::IPlugin Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "QmakeProjectManager.json") public: - ~QmakeProjectManagerPlugin(); bool initialize(const QStringList &arguments, QString *errorMessage); void extensionsInitialized();