summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2019-09-24 14:39:50 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2019-10-01 09:27:10 +0000
commit736eef24ca9263339f4c576cba5d4b20fe188045 (patch)
treeeb40889871ded25164d05cc235663c4b64c45ab5
parent85fcd10f90e3ccf8e8c5586fd84161145ef862a0 (diff)
downloadqt-creator-736eef24ca9263339f4c576cba5d4b20fe188045.tar.gz
Designer: Fix look-up of resources for UI files
Commit 81a643ec99, fixing QTCREATORBUG-22412, was too restrictive: UI files in applications have access to resources of library dependencies, so we must consider those. We now only exclude resources from other applications. Note that this will potentially list non-applicable resources, e.g. those from libraries to which our product does not have access. This cannot be reasonably prevented, because not all build systems provide this information. It's also not as bad as missing resources. Fixes: QTCREATORBUG-22909 Fixes: QTCREATORBUG-22962 Change-Id: I51a87402b43c156618982813c408060f300e4e58 Reviewed-by: hjk <hjk@qt.io>
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeprojectnodes.cpp2
-rw-r--r--src/plugins/designer/resourcehandler.cpp33
-rw-r--r--src/plugins/projectexplorer/projectnodes.h9
-rw-r--r--src/plugins/qbsprojectmanager/qbsnodes.cpp9
-rw-r--r--src/plugins/qmakeprojectmanager/qmakenodes.cpp9
5 files changed, 45 insertions, 17 deletions
diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectnodes.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectnodes.cpp
index f14f627b34..deb00e8f95 100644
--- a/src/plugins/cmakeprojectmanager/cmakeprojectnodes.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeprojectnodes.cpp
@@ -173,7 +173,7 @@ CMakeTargetNode::CMakeTargetNode(const Utils::FilePath &directory, const QString
setPriority(Node::DefaultProjectPriority + 900);
setIcon(QIcon(":/projectexplorer/images/build.png")); // TODO: Use proper icon!
setListInProject(false);
- setIsProduct();
+ setProductType(ProductType::Other);
}
QString CMakeTargetNode::generateId(const Utils::FilePath &directory, const QString &target)
diff --git a/src/plugins/designer/resourcehandler.cpp b/src/plugins/designer/resourcehandler.cpp
index 84020f77ee..c01dbc95f6 100644
--- a/src/plugins/designer/resourcehandler.cpp
+++ b/src/plugins/designer/resourcehandler.cpp
@@ -99,26 +99,37 @@ void ResourceHandler::updateResourcesHelper(bool updateProjectResources)
// Find the (sub-)project the file belongs to. We don't want to find resources
// from other parts of the project tree, e.g. via a qmake subdirs project.
- ProjectNode *projectNode = project->rootProjectNode();
- Node * const fileNode = projectNode->findNode([&fileName](const Node *n) {
+ Node * const fileNode = project->rootProjectNode()->findNode([&fileName](const Node *n) {
return n->filePath().toString() == fileName;
});
+ ProjectNode *projectNodeForUiFile = nullptr;
if (fileNode) {
// We do not want qbs groups or qmake .pri files here, as they contain only a subset
// of the relevant files.
- projectNode = fileNode->parentProjectNode();
- while (projectNode && !projectNode->isProduct())
- projectNode = projectNode->parentProjectNode();
+ projectNodeForUiFile = fileNode->parentProjectNode();
+ while (projectNodeForUiFile && !projectNodeForUiFile->isProduct())
+ projectNodeForUiFile = projectNodeForUiFile->parentProjectNode();
}
- if (!projectNode)
- projectNode = project->rootProjectNode();
+ if (!projectNodeForUiFile)
+ projectNodeForUiFile = project->rootProjectNode();
+
+ const auto useQrcFile = [projectNodeForUiFile, project](const Node *qrcNode) {
+ if (projectNodeForUiFile == project->rootProjectNode())
+ return true;
+ ProjectNode *projectNodeForQrcFile = qrcNode->parentProjectNode();
+ while (projectNodeForQrcFile && !projectNodeForQrcFile->isProduct())
+ projectNodeForQrcFile = projectNodeForQrcFile->parentProjectNode();
+ return !projectNodeForQrcFile
+ || projectNodeForQrcFile == projectNodeForUiFile
+ || projectNodeForQrcFile->productType() != ProductType::App;
+ };
QStringList projectQrcFiles;
- projectNode->forEachNode([&](FileNode *node) {
- if (node->fileType() == FileType::Resource)
+ project->rootProjectNode()->forEachNode([&](FileNode *node) {
+ if (node->fileType() == FileType::Resource && useQrcFile(node))
projectQrcFiles.append(node->filePath().toString());
}, [&](FolderNode *node) {
- if (dynamic_cast<ResourceEditor::ResourceTopLevelNode *>(node))
+ if (dynamic_cast<ResourceEditor::ResourceTopLevelNode *>(node) && useQrcFile(node))
projectQrcFiles.append(node->filePath().toString());
});
// Check if the user has chosen to update the lacking resource inside designer
@@ -130,7 +141,7 @@ void ResourceHandler::updateResourcesHelper(bool updateProjectResources)
}
if (!qrcPathsToBeAdded.isEmpty()) {
m_handlingResources = true;
- projectNode->addFiles(qrcPathsToBeAdded);
+ projectNodeForUiFile->addFiles(qrcPathsToBeAdded);
m_handlingResources = false;
projectQrcFiles += qrcPathsToBeAdded;
}
diff --git a/src/plugins/projectexplorer/projectnodes.h b/src/plugins/projectexplorer/projectnodes.h
index ce36882aa9..a214407515 100644
--- a/src/plugins/projectexplorer/projectnodes.h
+++ b/src/plugins/projectexplorer/projectnodes.h
@@ -57,6 +57,8 @@ enum class FileType : quint16 {
FileTypeSize
};
+enum class ProductType { App, Lib, Other, None };
+
enum ProjectAction {
// Special value to indicate that the actions are handled by the parent
InheritedFromParent,
@@ -357,15 +359,16 @@ public:
virtual QVariant data(Core::Id role) const;
virtual bool setData(Core::Id role, const QVariant &value) const;
- bool isProduct() const { return m_isProduct; }
+ bool isProduct() const { return m_productType != ProductType::None; }
+ ProductType productType() const { return m_productType; }
protected:
- void setIsProduct() { m_isProduct = true; }
+ void setProductType(ProductType type) { m_productType = type; }
QString m_target;
private:
- bool m_isProduct = false;
+ ProductType m_productType = ProductType::None;
};
class PROJECTEXPLORER_EXPORT ContainerNode : public FolderNode
diff --git a/src/plugins/qbsprojectmanager/qbsnodes.cpp b/src/plugins/qbsprojectmanager/qbsnodes.cpp
index 62762069b2..4f7f2e5f08 100644
--- a/src/plugins/qbsprojectmanager/qbsnodes.cpp
+++ b/src/plugins/qbsprojectmanager/qbsnodes.cpp
@@ -320,7 +320,14 @@ QbsProductNode::QbsProductNode(const qbs::ProductData &prd) :
{
static QIcon productIcon = Core::FileIconProvider::directoryIcon(Constants::QBS_PRODUCT_OVERLAY_ICON);
setIcon(productIcon);
- setIsProduct();
+ if (m_qbsProductData.isRunnable()) {
+ setProductType(ProductType::App);
+ } else if (m_qbsProductData.type().contains("dynamiclibrary")
+ || m_qbsProductData.type().contains("staticlibrary")) {
+ setProductType(ProductType::Lib);
+ } else {
+ setProductType(ProductType::Other);
+ }
}
bool QbsProductNode::supportsAction(ProjectAction action, const Node *node) const
diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.cpp b/src/plugins/qmakeprojectmanager/qmakenodes.cpp
index a71ab8c3d6..24b6b8cb03 100644
--- a/src/plugins/qmakeprojectmanager/qmakenodes.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakenodes.cpp
@@ -230,7 +230,14 @@ FolderNode::AddNewInformation QmakePriFileNode::addNewInformation(const QStringL
QmakeProFileNode::QmakeProFileNode(QmakeProject *project, const FilePath &filePath, QmakeProFile *pf) :
QmakePriFileNode(project, this, filePath, pf)
{
- setIsProduct();
+ if (projectType() == ProjectType::ApplicationTemplate) {
+ setProductType(ProductType::App);
+ } else if (projectType() == ProjectType::SharedLibraryTemplate
+ || projectType() == ProjectType::StaticLibraryTemplate) {
+ setProductType(ProductType::Lib);
+ } else if (projectType() != ProjectType::SubDirsTemplate) {
+ setProductType(ProductType::Other);
+ }
}
bool QmakeProFileNode::showInSimpleTree() const