qmake: Avoid passing some context menu data by side channels

... and the need temporarily storing them by creating them when needed.

Change-Id: I930dd34bc7682f3d4fb40bd8da132f52ba32414b
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
hjk
2017-02-24 17:10:28 +01:00
parent 3e225628ee
commit 0264053d9b
3 changed files with 41 additions and 60 deletions

View File

@@ -86,34 +86,37 @@ ProjectExplorer::Project *QmakeManager::openProject(const QString &fileName, QSt
return new QmakeProject(this, fileName); return new QmakeProject(this, fileName);
} }
ProjectExplorer::Node *QmakeManager::contextNode() const Node *QmakeManager::contextNode()
{ {
return m_contextNode; Node *node = ProjectTree::currentNode();
if (!node)
return nullptr;
auto subPriFileNode = dynamic_cast<QmakePriFileNode *>(node);
return subPriFileNode ? subPriFileNode->proFileNode() : node->parentProjectNode();
} }
void QmakeManager::setContextNode(ProjectExplorer::Node *node) QmakeProject *QmakeManager::contextProject()
{ {
m_contextNode = node; return qobject_cast<QmakeProject *>(ProjectTree::currentProject());
} }
ProjectExplorer::Project *QmakeManager::contextProject() const FileNode *QmakeManager::contextFile()
{ {
return m_contextProject; Node *node = ProjectTree::currentNode();
}
void QmakeManager::setContextProject(ProjectExplorer::Project *project) QmakeProFileNode *subProjectNode = nullptr;
{ if (node) {
m_contextProject = project; auto subPriFileNode = dynamic_cast<QmakePriFileNode *>(node);
} if (!subPriFileNode)
subPriFileNode = dynamic_cast<QmakePriFileNode *>(node->parentProjectNode());
if (subPriFileNode)
subProjectNode = subPriFileNode->proFileNode();
}
FileNode *fileNode = node ? node->asFileNode() : nullptr;
bool buildFilePossible = subProjectNode && fileNode
&& (fileNode->fileType() == ProjectExplorer::FileType::Source);
ProjectExplorer::FileNode *QmakeManager::contextFile() const return buildFilePossible ? fileNode : nullptr;
{
return m_contextFile;
}
void QmakeManager::setContextFile(ProjectExplorer::FileNode *file)
{
m_contextFile = file;
} }
void QmakeManager::addLibrary() void QmakeManager::addLibrary()
@@ -162,7 +165,7 @@ void QmakeManager::runQMake()
void QmakeManager::runQMakeContextMenu() void QmakeManager::runQMakeContextMenu()
{ {
runQMakeImpl(m_contextProject, m_contextNode); runQMakeImpl(contextProject(), contextNode());
} }
void QmakeManager::runQMakeImpl(ProjectExplorer::Project *p, ProjectExplorer::Node *node) void QmakeManager::runQMakeImpl(ProjectExplorer::Project *p, ProjectExplorer::Node *node)
@@ -227,31 +230,28 @@ void QmakeManager::buildFile()
void QmakeManager::handleSubDirContextMenu(QmakeManager::Action action, bool isFileBuild) void QmakeManager::handleSubDirContextMenu(QmakeManager::Action action, bool isFileBuild)
{ {
handleSubDirContextMenu(action, isFileBuild, m_contextProject, m_contextNode, m_contextFile); handleSubDirContextMenu(action, isFileBuild, contextProject(), contextNode(), contextFile());
} }
void QmakeManager::handleSubDirContextMenu(QmakeManager::Action action, bool isFileBuild, void QmakeManager::handleSubDirContextMenu(QmakeManager::Action action, bool isFileBuild,
ProjectExplorer::Project *contextProject, Project *contextProject, Node *contextNode, FileNode *contextFile)
ProjectExplorer::Node *contextNode,
ProjectExplorer::FileNode *contextFile)
{ {
QmakeProject *qmakeProject = qobject_cast<QmakeProject *>(contextProject); QTC_ASSERT(contextProject, return);
QTC_ASSERT(qmakeProject, return); Target *target = contextProject->activeTarget();
if (!target)
return;
if (!qmakeProject->activeTarget() || QmakeBuildConfiguration *bc = qobject_cast<QmakeBuildConfiguration *>(target->activeBuildConfiguration());
!qmakeProject->activeTarget()->activeBuildConfiguration()) if (!bc)
return; return;
if (!contextNode || !contextFile) if (!contextNode || !contextFile)
isFileBuild = false; isFileBuild = false;
QmakeBuildConfiguration *bc = qobject_cast<QmakeBuildConfiguration *>(qmakeProject->activeTarget()->activeBuildConfiguration());
if (!bc)
return;
if (contextNode) { if (contextNode) {
if (QmakePriFileNode *prifile = dynamic_cast<QmakePriFileNode *>(contextNode)) { if (QmakePriFileNode *prifile = dynamic_cast<QmakePriFileNode *>(contextNode)) {
if (QmakeProFileNode *profile = prifile->proFileNode()) { if (QmakeProFileNode *profile = prifile->proFileNode()) {
if (profile != qmakeProject->rootProjectNode() || isFileBuild) if (profile != contextProject->rootProjectNode() || isFileBuild)
bc->setSubNodeBuild(profile); bc->setSubNodeBuild(profile);
} }
} }

View File

@@ -56,12 +56,9 @@ public:
ProjectExplorer::Project *openProject(const QString &fileName, QString *errorString) override; ProjectExplorer::Project *openProject(const QString &fileName, QString *errorString) override;
// Context information used in the slot implementations // Context information used in the slot implementations
ProjectExplorer::Node *contextNode() const; static ProjectExplorer::Node *contextNode();
void setContextNode(ProjectExplorer::Node *node); static QmakeProject *contextProject();
ProjectExplorer::Project *contextProject() const; static ProjectExplorer::FileNode *contextFile();
void setContextProject(ProjectExplorer::Project *project);
ProjectExplorer::FileNode *contextFile() const;
void setContextFile(ProjectExplorer::FileNode *file);
enum Action { BUILD, REBUILD, CLEAN }; enum Action { BUILD, REBUILD, CLEAN };
@@ -84,10 +81,6 @@ private:
ProjectExplorer::FileNode *contextFile); ProjectExplorer::FileNode *contextFile);
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);
ProjectExplorer::Node *m_contextNode = nullptr;
ProjectExplorer::Project *m_contextProject = nullptr;
ProjectExplorer::FileNode *m_contextFile = nullptr;
}; };
} // namespace QmakeProjectManager } // namespace QmakeProjectManager

View File

@@ -321,24 +321,12 @@ 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));
auto proFileNode = dynamic_cast<QmakeProFileNode *>(node); FileNode *proFileNode = QmakeManager::contextFile();
auto qmakeProject = qobject_cast<QmakeProject *>(project); QmakeProject *qmakeProject = QmakeManager::contextProject();
QmakeProFileNode *subProjectNode = nullptr; Node *subProjectNode = QmakeManager::contextNode();
if (node) { FileNode *fileNode = node ? node->asFileNode() : nullptr;
auto subPriFileNode = dynamic_cast<QmakePriFileNode *>(node);
if (!subPriFileNode)
subPriFileNode = dynamic_cast<QmakePriFileNode *>(node->parentProjectNode());
if (subPriFileNode)
subProjectNode = subPriFileNode->proFileNode();
}
ProjectExplorer::FileNode *fileNode = node ? node->asFileNode() : nullptr;
bool buildFilePossible = subProjectNode && fileNode
&& (fileNode->fileType() == ProjectExplorer::FileType::Source);
m_qmakeProjectManager->setContextNode(subProjectNode);
m_qmakeProjectManager->setContextProject(qmakeProject);
m_qmakeProjectManager->setContextFile(buildFilePossible ? fileNode : nullptr);
bool buildFilePossible = subProjectNode && fileNode && (fileNode->fileType() == FileType::Source);
bool subProjectActionsVisible = qmakeProject && subProjectNode && (subProjectNode != qmakeProject->rootProjectNode()); bool subProjectActionsVisible = qmakeProject && subProjectNode && (subProjectNode != qmakeProject->rootProjectNode());
QString subProjectName; QString subProjectName;