diff --git a/src/plugins/qmldesigner/components/componentcore/resourcegenerator.cpp b/src/plugins/qmldesigner/components/componentcore/resourcegenerator.cpp index 24047f650f1..97a00a10f40 100644 --- a/src/plugins/qmldesigner/components/componentcore/resourcegenerator.cpp +++ b/src/plugins/qmldesigner/components/componentcore/resourcegenerator.cpp @@ -13,6 +13,7 @@ #include #include +#include #include @@ -143,41 +144,17 @@ void generateMenuEntry(QObject *parent) exportMenu->addAction(cmd2, QmlProjectManager::Constants::G_EXPORT_GENERATE); } -bool skipSuffix(const QString &fileName) -{ - const QStringList suffixes = {".pri", - ".pro", - ".user", - ".qrc", - ".qds", - "CMakeLists.txt", - ".db", - ".tmp", - ".TMP", - ".metainfo", - ".qtds", - ".db-shm", - ".db-wal"}; - - for (const auto &suffix : suffixes) - if (fileName.endsWith(suffix)) - return true; - - return false; -} - QStringList getProjectFileList() { const ProjectExplorer::Project *project = ProjectExplorer::ProjectManager::startupProject(); const FilePaths paths = project->files(ProjectExplorer::Project::AllFiles); - const QDir dir(project->projectFilePath().parentDir().toString()); QStringList selectedFileList; - + const Utils::FilePath dir(project->projectFilePath().parentDir()); for (const FilePath &path : paths) { - QString relativePath = dir.relativeFilePath(path.toString()); - if (!skipSuffix(relativePath)) - selectedFileList.append(relativePath); + const Utils::FilePath relativePath = path.relativePathFrom(dir); + if (QmlProjectManager::isResource(relativePath)) + selectedFileList.append(relativePath.path()); } return selectedFileList; diff --git a/src/plugins/qmldesigner/components/componentcore/resourcegenerator.h b/src/plugins/qmldesigner/components/componentcore/resourcegenerator.h index 67847634274..e183657b0c5 100644 --- a/src/plugins/qmldesigner/components/componentcore/resourcegenerator.h +++ b/src/plugins/qmldesigner/components/componentcore/resourcegenerator.h @@ -11,7 +11,6 @@ namespace QmlDesigner::ResourceGenerator { QMLDESIGNERCOMPONENTS_EXPORT void generateMenuEntry(QObject *parent); QMLDESIGNERCOMPONENTS_EXPORT QStringList getProjectFileList(); -QMLDESIGNERCOMPONENTS_EXPORT bool skipSuffix(const QString &fileName); QMLDESIGNERCOMPONENTS_EXPORT bool createQrcFile(const Utils::FilePath &qrcFilePath); QMLDESIGNERCOMPONENTS_EXPORT bool createQmlrcFile(const Utils::FilePath &qmlrcFilePath); diff --git a/src/plugins/qmlprojectmanager/CMakeLists.txt b/src/plugins/qmlprojectmanager/CMakeLists.txt index 77f3932609a..2cbf409e041 100644 --- a/src/plugins/qmlprojectmanager/CMakeLists.txt +++ b/src/plugins/qmlprojectmanager/CMakeLists.txt @@ -46,19 +46,21 @@ extend_qtc_plugin(QmlProjectManager cmakewriter.cpp cmakewriter.h cmakewriterv0.cpp cmakewriterv0.h cmakewriterv1.cpp cmakewriterv1.h + filetypes.cpp filetypes.h boilerplate.qrc ) add_qtc_library(QmlProjectManagerLib OBJECT - CONDITION Qt6_VERSION VERSION_GREATER_EQUAL 6.4.3 + CONDITION WITH_TESTS AND Qt6_VERSION VERSION_GREATER_EQUAL 6.4.3 EXCLUDE_FROM_INSTALL + DEFINES QMLPROJECTMANAGER_STATIC_LIBRARY DEPENDS QmlJS Utils ProjectExplorer INCLUDES ${CMAKE_CURRENT_LIST_DIR} - SOURCES_PREFIX ${CMAKE_CURRENT_LIST_DIR}/buildsystem SOURCES - projectitem/filefilteritems.cpp projectitem/filefilteritems.h - projectitem/qmlprojectitem.cpp projectitem/qmlprojectitem.h - projectitem/converters.cpp projectitem/converters.h + buildsystem/projectitem/filefilteritems.cpp buildsystem/projectitem/filefilteritems.h + buildsystem/projectitem/qmlprojectitem.cpp buildsystem/projectitem/qmlprojectitem.h + buildsystem/projectitem/converters.cpp buildsystem/projectitem/converters.h + cmakegen/filetypes.cpp cmakegen/filetypes.h ) diff --git a/src/plugins/qmlprojectmanager/buildsystem/projectitem/converters.cpp b/src/plugins/qmlprojectmanager/buildsystem/projectitem/converters.cpp index 82653dba841..e98a8446091 100644 --- a/src/plugins/qmlprojectmanager/buildsystem/projectitem/converters.cpp +++ b/src/plugins/qmlprojectmanager/buildsystem/projectitem/converters.cpp @@ -3,6 +3,7 @@ #include "converters.h" #include "utils/algorithm.h" +#include "cmakegen/filetypes.h" #include @@ -10,17 +11,10 @@ namespace QmlProjectManager::Converters { const static QStringList qmlFilesFilter{QStringLiteral("*.qml")}; const static QStringList javaScriptFilesFilter{QStringLiteral("*.js"), QStringLiteral("*.ts")}; -const static QStringList imageFilesFilter{QStringLiteral("*.jpeg"), - QStringLiteral("*.jpg"), - QStringLiteral("*.png"), - QStringLiteral("*.svg"), - QStringLiteral("*.hdr"), - QStringLiteral("*.ktx"), - QStringLiteral("*.bmp"), - QStringLiteral("*.ttf"), - QStringLiteral("*.tiff"), - QStringLiteral("*.webp"), - QStringLiteral("*.gif")}; + +const QStringList imageFilesFilter() { + return imageFiles([](const QString& suffix) { return "*." + suffix; }); +} QString jsonValueToString(const QJsonValue &val, int indentationLevel, bool indented); @@ -123,7 +117,7 @@ QString jsonToQmlProject(const QJsonObject &rootObject) if (nodeName.toLower() == "qmlfiles") { filter = qmlFilesFilter; } else if (nodeName.toLower() == "imagefiles") { - filter = imageFilesFilter; + filter = imageFilesFilter(); } else if (nodeName.toLower() == "javascriptfiles") { filter = javaScriptFilesFilter; } @@ -459,7 +453,7 @@ QJsonObject qmlProjectTojson(const Utils::FilePath &projectFile) } else if (childNodeName == "javascriptfiles") { inserter(javaScriptFilesFilter); } else if (childNodeName == "imagefiles") { - inserter(imageFilesFilter); + inserter(imageFilesFilter()); } } diff --git a/src/plugins/qmlprojectmanager/cmakegen/cmakegenerator.cpp b/src/plugins/qmlprojectmanager/cmakegen/cmakegenerator.cpp index 6864c36c608..d53588b05ad 100644 --- a/src/plugins/qmlprojectmanager/cmakegen/cmakegenerator.cpp +++ b/src/plugins/qmlprojectmanager/cmakegen/cmakegenerator.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include "cmakegenerator.h" +#include "filetypes.h" #include "qmlprojectmanager/qmlproject.h" #include "qmlprojectmanager/qmlprojectconstants.h" @@ -197,21 +198,6 @@ void CMakeGenerator::update(const QSet &added, const QSet &rem createSourceFiles(); } -bool CMakeGenerator::isQml(const Utils::FilePath &path) const -{ - const QString suffix = path.suffix(); - return suffix == "qml" || suffix == "ui.qml"; -} - -bool CMakeGenerator::isResource(const Utils::FilePath &path) const -{ - static const QStringList suffixes = { - "json", "mesh", "dae", "qad", "hints", "png", "hdr", "ttf", "jpg", - "jpeg", "js", "qsb", "frag", "frag.qsb", "vert", "vert.qsb", "svg", - "ktx", "bmp", "gif", "webp", "tiff"}; - return suffixes.contains(path.suffix(), Qt::CaseInsensitive); -} - bool CMakeGenerator::ignore(const Utils::FilePath &path) const { if (path.isFile()) { @@ -386,9 +372,9 @@ bool findFileWithGetter(const Utils::FilePath &file, const NodePtr &node, const bool CMakeGenerator::findFile(const NodePtr &node, const Utils::FilePath &file) const { - if (isResource(file)) { - return findFileWithGetter(file, node, [](const NodePtr &n) { return n->resources; }); - } else if (isQml(file)) { + if (isAssetFile(file)) { + return findFileWithGetter(file, node, [](const NodePtr &n) { return n->assets; }); + } else if (isQmlFile(file)) { if (findFileWithGetter(file, node, [](const NodePtr &n) { return n->files; })) return true; else if (findFileWithGetter(file, node, [](const NodePtr &n) { return n->singletons; })) @@ -407,10 +393,10 @@ void CMakeGenerator::insertFile(NodePtr &node, const Utils::FilePath &path) cons readQmlDir(path, node); } else if (path.suffix() == "cpp") { node->sources.push_back(path); - } else if (isQml(path)) { + } else if (isQmlFile(path)) { node->files.push_back(path); - } else if (isResource(path)) { - node->resources.push_back(path); + } else if (isAssetFile(path)) { + node->assets.push_back(path); } } @@ -421,15 +407,14 @@ void CMakeGenerator::removeFile(NodePtr &node, const Utils::FilePath &path) cons node->singletons.clear(); node->uri = ""; node->name = path.parentDir().fileName(); - - } else if (isQml(path)) { + } else if (isQmlFile(path)) { auto iter = std::find(node->files.begin(), node->files.end(), path); if (iter != node->files.end()) node->files.erase(iter); - } else if (isResource(path)) { - auto iter = std::find(node->resources.begin(), node->resources.end(), path); - if (iter != node->resources.end()) - node->resources.erase(iter); + } else if (isAssetFile(path)) { + auto iter = std::find(node->assets.begin(), node->assets.end(), path); + if (iter != node->assets.end()) + node->assets.erase(iter); } } @@ -475,7 +460,7 @@ void CMakeGenerator::printNodeTree(const NodePtr &generatorNode, size_t indent) qDebug() << addIndent(indent) << "directory: " << generatorNode->dir; qDebug() << addIndent(indent) << "files: " << generatorNode->files; qDebug() << addIndent(indent) << "singletons: " << generatorNode->singletons; - qDebug() << addIndent(indent) << "resources: " << generatorNode->resources; + qDebug() << addIndent(indent) << "assets: " << generatorNode->assets; qDebug() << addIndent(indent) << "sources: " << generatorNode->sources; for (const auto &child : generatorNode->subdirs) @@ -547,7 +532,7 @@ void CMakeGenerator::compareWithFileSystem(const NodePtr &node) const if (ignore(next.parentDir())) continue; - if (isResource(next) && !findFile(next) && !ignore(next)) + if (isAssetFile(next) && !findFile(next) && !ignore(next)) files.push_back(next); } diff --git a/src/plugins/qmlprojectmanager/cmakegen/cmakegenerator.h b/src/plugins/qmlprojectmanager/cmakegen/cmakegenerator.h index ca8525426d7..e552f154203 100644 --- a/src/plugins/qmlprojectmanager/cmakegen/cmakegenerator.h +++ b/src/plugins/qmlprojectmanager/cmakegen/cmakegenerator.h @@ -45,8 +45,6 @@ public: void updateMenuAction(); private: - bool isQml(const Utils::FilePath &path) const; - bool isResource(const Utils::FilePath &path) const; bool ignore(const Utils::FilePath &path) const; bool checkUri(const QString& uri, const Utils::FilePath &path) const; diff --git a/src/plugins/qmlprojectmanager/cmakegen/cmakewriter.cpp b/src/plugins/qmlprojectmanager/cmakegen/cmakewriter.cpp index 687a6265f85..81701cd4bc0 100644 --- a/src/plugins/qmlprojectmanager/cmakegen/cmakewriter.cpp +++ b/src/plugins/qmlprojectmanager/cmakegen/cmakewriter.cpp @@ -98,9 +98,9 @@ std::vector CMakeWriter::singletons(const NodePtr &node) const return files(node, [](const NodePtr &n) { return n->singletons; }); } -std::vector CMakeWriter::resources(const NodePtr &node) const +std::vector CMakeWriter::assets(const NodePtr &node) const { - return files(node, [](const NodePtr &n) { return n->resources; }); + return files(node, [](const NodePtr &n) { return n->assets; }); } std::vector CMakeWriter::sources(const NodePtr &node) const @@ -229,7 +229,7 @@ std::tuple CMakeWriter::makeResourcesBlocks(const NodePtr &nod QString resourceFiles; std::vector bigResources; - for (const Utils::FilePath &path : resources(node)) { + for (const Utils::FilePath &path : assets(node)) { if (path.fileSize() > 5000000) { bigResources.push_back(makeRelative(node, path)); continue; diff --git a/src/plugins/qmlprojectmanager/cmakegen/cmakewriter.h b/src/plugins/qmlprojectmanager/cmakegen/cmakewriter.h index a37ec67522f..14eb512f9c4 100644 --- a/src/plugins/qmlprojectmanager/cmakegen/cmakewriter.h +++ b/src/plugins/qmlprojectmanager/cmakegen/cmakewriter.h @@ -32,7 +32,7 @@ struct Node std::vector> subdirs; std::vector files; std::vector singletons; - std::vector resources; + std::vector assets; std::vector sources; }; @@ -76,7 +76,7 @@ protected: std::vector files(const NodePtr &node, const FileGetter &getter) const; std::vector qmlFiles(const NodePtr &node) const; std::vector singletons(const NodePtr &node) const; - std::vector resources(const NodePtr &node) const; + std::vector assets(const NodePtr &node) const; std::vector sources(const NodePtr &node) const; std::vector plugins(const NodePtr &node) const; diff --git a/src/plugins/qmlprojectmanager/cmakegen/cmakewriterv0.cpp b/src/plugins/qmlprojectmanager/cmakegen/cmakewriterv0.cpp index 5cb17d1e1bf..b6861a4493d 100644 --- a/src/plugins/qmlprojectmanager/cmakegen/cmakewriterv0.cpp +++ b/src/plugins/qmlprojectmanager/cmakegen/cmakewriterv0.cpp @@ -21,7 +21,7 @@ CMakeWriterV0::CMakeWriterV0(CMakeGenerator *parent) bool CMakeWriterV0::isPlugin(const NodePtr &node) const { if (node->type == Node::Type::App) - return !node->files.empty() || !node->singletons.empty() || !node->resources.empty(); + return !node->files.empty() || !node->singletons.empty() || !node->assets.empty(); return CMakeWriter::isPlugin(node); } diff --git a/src/plugins/qmlprojectmanager/cmakegen/filetypes.cpp b/src/plugins/qmlprojectmanager/cmakegen/filetypes.cpp new file mode 100644 index 00000000000..a6ee4cd15f6 --- /dev/null +++ b/src/plugins/qmlprojectmanager/cmakegen/filetypes.cpp @@ -0,0 +1,52 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include "filetypes.h" + +namespace QmlProjectManager { + +QStringList imageFiles(const std::function &transformer) +{ + static const QStringList suffixes = { + "bmp", "dae", "gif", "hdr", "ico", + "jpeg", "jpg", "ktx", "pbm", "pgm", + "png", "ppm", "svg", "svgz", "tif", + "tiff", "ttf", "webp", "xbm", "xpm" + }; + + if (transformer) { + QStringList result; + for (const QString& suffix : suffixes) + result << transformer(suffix); + return result; + } + return suffixes; +} + +bool isQmlFile(const Utils::FilePath &path) +{ + const QString suffix = path.suffix(); + return suffix == "qml" || suffix == "ui.qml"; +} + +bool isAssetFile(const Utils::FilePath &path) +{ + static const QStringList suffixes = { + "js", "ts", "json", "hints", "mesh", "qad", "qsb", "frag", + "frag.qsb", "vert", "vert.qsb", "mng" + }; + return + suffixes.contains(path.suffix(), Qt::CaseInsensitive) || + imageFiles().contains(path.suffix(), Qt::CaseInsensitive); +} + +bool isResource(const Utils::FilePath &path) +{ + auto isOtherFile = [](const Utils::FilePath &p) -> bool { + static QStringList suffixes = { "qmlproject", "conf" }; + return p.fileName() == "qmldir" || suffixes.contains(p.suffix()); + }; + return isQmlFile(path) || isAssetFile(path) || isOtherFile(path); +} + +} // namespace QmlProjectManager. diff --git a/src/plugins/qmlprojectmanager/cmakegen/filetypes.h b/src/plugins/qmlprojectmanager/cmakegen/filetypes.h new file mode 100644 index 00000000000..efe07df118c --- /dev/null +++ b/src/plugins/qmlprojectmanager/cmakegen/filetypes.h @@ -0,0 +1,17 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include + +#include + +namespace QmlProjectManager { + +QMLPROJECTMANAGER_EXPORT QStringList imageFiles( + const std::function &transformer = nullptr); + +QMLPROJECTMANAGER_EXPORT bool isQmlFile(const Utils::FilePath &path); +QMLPROJECTMANAGER_EXPORT bool isAssetFile(const Utils::FilePath &path); +QMLPROJECTMANAGER_EXPORT bool isResource(const Utils::FilePath &path); + +} // namespace QmlProjectManager. diff --git a/src/plugins/qmlprojectmanager/qmlprojectmanager.qbs b/src/plugins/qmlprojectmanager/qmlprojectmanager.qbs index 0fa49b5102a..b723fe4a4c1 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectmanager.qbs +++ b/src/plugins/qmlprojectmanager/qmlprojectmanager.qbs @@ -51,6 +51,7 @@ QtcPlugin { "cmakewriter.cpp", "cmakewriter.h", "cmakewriterv0.cpp", "cmakewriterv0.h", "cmakewriterv1.cpp", "cmakewriterv1.h" + "filetypes.cpp", "filetypes.h" ] } diff --git a/tests/unit/tests/unittests/qmlprojectmanager/data/converter/test-set-1/testfile.qmltojson b/tests/unit/tests/unittests/qmlprojectmanager/data/converter/test-set-1/testfile.qmltojson index c5e94ef04ea..d6e453fbfb1 100644 --- a/tests/unit/tests/unittests/qmlprojectmanager/data/converter/test-set-1/testfile.qmltojson +++ b/tests/unit/tests/unittests/qmlprojectmanager/data/converter/test-set-1/testfile.qmltojson @@ -70,17 +70,26 @@ "files": [ ], "filters": [ + "*.bmp", + "*.dae", + "*.gif", + "*.hdr", + "*.ico", "*.jpeg", "*.jpg", - "*.png", - "*.svg", - "*.hdr", "*.ktx", - "*.bmp", - "*.ttf", + "*.pbm", + "*.pgm", + "*.png", + "*.ppm", + "*.svg", + "*.svgz", + "*.tif", "*.tiff", + "*.ttf", "*.webp", - "*.gif" + "*.xbm", + "*.xpm" ], "mcuProperties": { }, @@ -93,17 +102,26 @@ "files": [ ], "filters": [ + "*.bmp", + "*.dae", + "*.gif", + "*.hdr", + "*.ico", "*.jpeg", "*.jpg", - "*.png", - "*.svg", - "*.hdr", "*.ktx", - "*.bmp", - "*.ttf", + "*.pbm", + "*.pgm", + "*.png", + "*.ppm", + "*.svg", + "*.svgz", + "*.tif", "*.tiff", + "*.ttf", "*.webp", - "*.gif" + "*.xbm", + "*.xpm" ], "mcuProperties": { }, diff --git a/tests/unit/tests/unittests/qmlprojectmanager/data/converter/test-set-2/testfile.qmltojson b/tests/unit/tests/unittests/qmlprojectmanager/data/converter/test-set-2/testfile.qmltojson index 46f0b34973a..da44366174b 100644 --- a/tests/unit/tests/unittests/qmlprojectmanager/data/converter/test-set-2/testfile.qmltojson +++ b/tests/unit/tests/unittests/qmlprojectmanager/data/converter/test-set-2/testfile.qmltojson @@ -40,17 +40,26 @@ "files": [ ], "filters": [ + "*.bmp", + "*.dae", + "*.gif", + "*.hdr", + "*.ico", "*.jpeg", "*.jpg", - "*.png", - "*.svg", - "*.hdr", "*.ktx", - "*.bmp", - "*.ttf", + "*.pbm", + "*.pgm", + "*.png", + "*.ppm", + "*.svg", + "*.svgz", + "*.tif", "*.tiff", + "*.ttf", "*.webp", - "*.gif" + "*.xbm", + "*.xpm" ], "mcuProperties": { }, diff --git a/tests/unit/tests/unittests/qmlprojectmanager/data/converter/test-set-3/testfile.qmltojson b/tests/unit/tests/unittests/qmlprojectmanager/data/converter/test-set-3/testfile.qmltojson index c5e94ef04ea..d6e453fbfb1 100644 --- a/tests/unit/tests/unittests/qmlprojectmanager/data/converter/test-set-3/testfile.qmltojson +++ b/tests/unit/tests/unittests/qmlprojectmanager/data/converter/test-set-3/testfile.qmltojson @@ -70,17 +70,26 @@ "files": [ ], "filters": [ + "*.bmp", + "*.dae", + "*.gif", + "*.hdr", + "*.ico", "*.jpeg", "*.jpg", - "*.png", - "*.svg", - "*.hdr", "*.ktx", - "*.bmp", - "*.ttf", + "*.pbm", + "*.pgm", + "*.png", + "*.ppm", + "*.svg", + "*.svgz", + "*.tif", "*.tiff", + "*.ttf", "*.webp", - "*.gif" + "*.xbm", + "*.xpm" ], "mcuProperties": { }, @@ -93,17 +102,26 @@ "files": [ ], "filters": [ + "*.bmp", + "*.dae", + "*.gif", + "*.hdr", + "*.ico", "*.jpeg", "*.jpg", - "*.png", - "*.svg", - "*.hdr", "*.ktx", - "*.bmp", - "*.ttf", + "*.pbm", + "*.pgm", + "*.png", + "*.ppm", + "*.svg", + "*.svgz", + "*.tif", "*.tiff", + "*.ttf", "*.webp", - "*.gif" + "*.xbm", + "*.xpm" ], "mcuProperties": { }, diff --git a/tests/unit/tests/unittests/qmlprojectmanager/data/converter/test-set-mcu-1/testfile.qmltojson b/tests/unit/tests/unittests/qmlprojectmanager/data/converter/test-set-mcu-1/testfile.qmltojson index c7736561b27..557bcb80fb1 100644 --- a/tests/unit/tests/unittests/qmlprojectmanager/data/converter/test-set-mcu-1/testfile.qmltojson +++ b/tests/unit/tests/unittests/qmlprojectmanager/data/converter/test-set-mcu-1/testfile.qmltojson @@ -43,17 +43,26 @@ "files": [ ], "filters": [ + "*.bmp", + "*.dae", + "*.gif", + "*.hdr", + "*.ico", "*.jpeg", "*.jpg", - "*.png", - "*.svg", - "*.hdr", "*.ktx", - "*.bmp", - "*.ttf", + "*.pbm", + "*.pgm", + "*.png", + "*.ppm", + "*.svg", + "*.svgz", + "*.tif", "*.tiff", + "*.ttf", "*.webp", - "*.gif" + "*.xbm", + "*.xpm" ], "mcuProperties": { },