Qmake: Fix build/run qmake from context menu again

This got broken when refactoring the project nodes.

Change-Id: Iae4614f4a367cefeba3f70faaf19bc2f8994fb0f
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Tobias Hunger
2017-02-28 14:13:41 +01:00
parent cd1fd0fba9
commit 563b5033f8
4 changed files with 40 additions and 42 deletions

View File

@@ -88,30 +88,31 @@ ProjectExplorer::Project *QmakeManager::openProject(const QString &fileName, QSt
Node *QmakeManager::contextNode() Node *QmakeManager::contextNode()
{ {
Node *node = ProjectTree::currentNode(); return ProjectTree::currentNode();
if (!node)
return nullptr;
auto subPriFileNode = dynamic_cast<QmakePriFileNode *>(node);
return subPriFileNode ? subPriFileNode->proFileNode() : node->parentProjectNode();
} }
QmakeProject *QmakeManager::contextProject() Project *QmakeManager::contextProject()
{ {
return qobject_cast<QmakeProject *>(ProjectTree::currentProject()); return ProjectTree::currentProject();
} }
FileNode *QmakeManager::contextFile() static QmakeProFileNode *buildableFileProFile(Node *node)
{ {
Node *node = ProjectTree::currentNode();
QmakeProFileNode *subProjectNode = nullptr;
if (node) { if (node) {
auto subPriFileNode = dynamic_cast<QmakePriFileNode *>(node); auto subPriFileNode = dynamic_cast<QmakePriFileNode *>(node);
if (!subPriFileNode) if (!subPriFileNode)
subPriFileNode = dynamic_cast<QmakePriFileNode *>(node->parentProjectNode()); subPriFileNode = dynamic_cast<QmakePriFileNode *>(node->parentProjectNode());
if (subPriFileNode) 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; FileNode *fileNode = node ? node->asFileNode() : nullptr;
bool buildFilePossible = subProjectNode && fileNode bool buildFilePossible = subProjectNode && fileNode
&& (fileNode->fileType() == ProjectExplorer::FileType::Source); && (fileNode->fileType() == ProjectExplorer::FileType::Source);
@@ -127,7 +128,7 @@ void QmakeManager::addLibrary()
void QmakeManager::addLibraryContextMenu() void QmakeManager::addLibraryContextMenu()
{ {
Node *node = ProjectTree::currentNode(); Node *node = contextNode();
if (dynamic_cast<QmakeProFileNode *>(node)) if (dynamic_cast<QmakeProFileNode *>(node))
addLibraryImpl(node->filePath().toString(), nullptr); addLibraryImpl(node->filePath().toString(), nullptr);
} }
@@ -157,7 +158,6 @@ void QmakeManager::addLibraryImpl(const QString &fileName, BaseTextEditor *edito
editor->insert(snippet); editor->insert(snippet);
} }
void QmakeManager::runQMake() void QmakeManager::runQMake()
{ {
runQMakeImpl(SessionManager::startupProject(), nullptr); runQMakeImpl(SessionManager::startupProject(), nullptr);
@@ -175,8 +175,7 @@ void QmakeManager::runQMakeImpl(ProjectExplorer::Project *p, ProjectExplorer::No
QmakeProject *qmakeProject = qobject_cast<QmakeProject *>(p); QmakeProject *qmakeProject = qobject_cast<QmakeProject *>(p);
QTC_ASSERT(qmakeProject, return); QTC_ASSERT(qmakeProject, return);
if (!qmakeProject->activeTarget() || if (!qmakeProject->activeTarget() || !qmakeProject->activeTarget()->activeBuildConfiguration())
!qmakeProject->activeTarget()->activeBuildConfiguration())
return; return;
QmakeBuildConfiguration *bc = static_cast<QmakeBuildConfiguration *>(qmakeProject->activeTarget()->activeBuildConfiguration()); QmakeBuildConfiguration *bc = static_cast<QmakeBuildConfiguration *>(qmakeProject->activeTarget()->activeBuildConfiguration());
@@ -187,7 +186,7 @@ void QmakeManager::runQMakeImpl(ProjectExplorer::Project *p, ProjectExplorer::No
//found qmakeStep, now use it //found qmakeStep, now use it
qs->setForced(true); qs->setForced(true);
if (node != 0 && node != qmakeProject->rootProjectNode()) if (node && node != qmakeProject->rootProjectNode())
if (QmakeProFileNode *profile = dynamic_cast<QmakeProFileNode *>(node)) if (QmakeProFileNode *profile = dynamic_cast<QmakeProFileNode *>(node))
bc->setSubNodeBuild(profile); bc->setSubNodeBuild(profile);
@@ -230,11 +229,13 @@ void QmakeManager::buildFile()
void QmakeManager::handleSubDirContextMenu(QmakeManager::Action action, bool isFileBuild) 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, void QmakeManager::handleSubDirContextMenu(QmakeManager::Action action, bool isFileBuild,
Project *contextProject, Node *contextNode, FileNode *contextFile) Project *contextProject, Node *contextNode,
FileNode *buildableFile)
{ {
QTC_ASSERT(contextProject, return); QTC_ASSERT(contextProject, return);
Target *target = contextProject->activeTarget(); Target *target = contextProject->activeTarget();
@@ -245,20 +246,16 @@ void QmakeManager::handleSubDirContextMenu(QmakeManager::Action action, bool isF
if (!bc) if (!bc)
return; return;
if (!contextNode || !contextFile) if (!contextNode || !buildableFile)
isFileBuild = false; isFileBuild = false;
if (contextNode) { if (QmakeProFileNode *profile = dynamic_cast<QmakeProFileNode *>(contextNode)) {
if (QmakePriFileNode *prifile = dynamic_cast<QmakePriFileNode *>(contextNode)) {
if (QmakeProFileNode *profile = prifile->proFileNode()) {
if (profile != contextProject->rootProjectNode() || isFileBuild) if (profile != contextProject->rootProjectNode() || isFileBuild)
bc->setSubNodeBuild(profile); bc->setSubNodeBuild(profile);
} }
}
}
if (isFileBuild) if (isFileBuild)
bc->setFileNodeBuild(contextFile); bc->setFileNodeBuild(buildableFile);
if (ProjectExplorerPlugin::saveModifiedFiles()) { if (ProjectExplorerPlugin::saveModifiedFiles()) {
const Core::Id buildStep = ProjectExplorer::Constants::BUILDSTEPS_BUILD; const Core::Id buildStep = ProjectExplorer::Constants::BUILDSTEPS_BUILD;
const Core::Id cleanStep = ProjectExplorer::Constants::BUILDSTEPS_CLEAN; const Core::Id cleanStep = ProjectExplorer::Constants::BUILDSTEPS_CLEAN;

View File

@@ -57,8 +57,8 @@ public:
// Context information used in the slot implementations // Context information used in the slot implementations
static ProjectExplorer::Node *contextNode(); static ProjectExplorer::Node *contextNode();
static QmakeProject *contextProject(); static ProjectExplorer::Project *contextProject();
static ProjectExplorer::FileNode *contextFile(); static ProjectExplorer::FileNode *contextBuildableFileNode();
enum Action { BUILD, REBUILD, CLEAN }; enum Action { BUILD, REBUILD, CLEAN };
@@ -77,8 +77,8 @@ private:
void handleSubDirContextMenu(Action action, bool isFileBuild); void handleSubDirContextMenu(Action action, bool isFileBuild);
void handleSubDirContextMenu(QmakeManager::Action action, bool isFileBuild, void handleSubDirContextMenu(QmakeManager::Action action, bool isFileBuild,
ProjectExplorer::Project *contextProject, ProjectExplorer::Project *contextProject,
ProjectExplorer::Node *contextNode, ProjectExplorer::Node *contextProFileNode,
ProjectExplorer::FileNode *contextFile); ProjectExplorer::FileNode *buildableFile);
void addLibraryImpl(const QString &fileName, TextEditor::BaseTextEditor *editor); void addLibraryImpl(const QString &fileName, TextEditor::BaseTextEditor *editor);
void runQMakeImpl(ProjectExplorer::Project *p, ProjectExplorer::Node *node); void runQMakeImpl(ProjectExplorer::Project *p, ProjectExplorer::Node *node);
}; };

View File

@@ -71,10 +71,6 @@ using namespace QmakeProjectManager::Internal;
using namespace QmakeProjectManager; using namespace QmakeProjectManager;
using namespace ProjectExplorer; using namespace ProjectExplorer;
QmakeProjectManagerPlugin::~QmakeProjectManagerPlugin()
{
}
bool QmakeProjectManagerPlugin::initialize(const QStringList &arguments, QString *errorMessage) bool QmakeProjectManagerPlugin::initialize(const QStringList &arguments, QString *errorMessage)
{ {
Q_UNUSED(arguments) Q_UNUSED(arguments)
@@ -318,17 +314,23 @@ void QmakeProjectManagerPlugin::updateContextActions()
Project *project = ProjectTree::currentProject(); Project *project = ProjectTree::currentProject();
m_addLibraryActionContextMenu->setEnabled(dynamic_cast<QmakeProFileNode *>(node)); m_addLibraryActionContextMenu->setEnabled(dynamic_cast<QmakeProFileNode *>(node));
FileNode *proFileNode = QmakeManager::contextFile(); auto proFileNode = dynamic_cast<QmakeProFileNode *>(node);
QmakeProject *qmakeProject = QmakeManager::contextProject(); QmakeProject *qmakeProject = qobject_cast<QmakeProject *>(QmakeManager::contextProject());
Node *subProjectNode = QmakeManager::contextNode(); QmakeProFileNode *subProjectNode = nullptr;
if (node) {
auto subPriFileNode = dynamic_cast<QmakePriFileNode *>(node);
if (!subPriFileNode)
subPriFileNode = dynamic_cast<QmakePriFileNode *>(node->parentProjectNode());
subProjectNode = subPriFileNode ? subPriFileNode->proFileNode() : nullptr;
}
FileNode *fileNode = node ? node->asFileNode() : nullptr; FileNode *fileNode = node ? node->asFileNode() : nullptr;
bool buildFilePossible = subProjectNode && fileNode && (fileNode->fileType() == FileType::Source); bool buildFilePossible = subProjectNode && fileNode && (fileNode->fileType() == FileType::Source);
bool subProjectActionsVisible = qmakeProject && subProjectNode && (subProjectNode != qmakeProject->rootProjectNode()); bool subProjectActionsVisible = qmakeProject && proFileNode && (proFileNode != qmakeProject->rootProjectNode());
QString subProjectName; QString subProjectName;
if (subProjectActionsVisible) if (subProjectActionsVisible)
subProjectName = subProjectNode->displayName(); subProjectName = proFileNode->displayName();
m_buildSubProjectAction->setParameter(subProjectName); m_buildSubProjectAction->setParameter(subProjectName);
m_rebuildSubProjectAction->setParameter(subProjectName); m_rebuildSubProjectAction->setParameter(subProjectName);

View File

@@ -51,7 +51,6 @@ class QmakeProjectManagerPlugin : public ExtensionSystem::IPlugin
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "QmakeProjectManager.json") Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "QmakeProjectManager.json")
public: public:
~QmakeProjectManagerPlugin();
bool initialize(const QStringList &arguments, QString *errorMessage); bool initialize(const QStringList &arguments, QString *errorMessage);
void extensionsInitialized(); void extensionsInitialized();