From 178ba90376054ff99a562966cc07f35f48b82536 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 21 Dec 2020 15:34:26 +0200 Subject: [PATCH] QmlDesigner: Add import support for sounds and shaders All imported asset types are now imported to type specific folders under the project, similar to what was already done for fonts. Also refactored import registration a bit to reduce code duplication. Fixes: QDS-3326 Change-Id: I2b321590a6339eae9859e9daf154341175842929 Reviewed-by: Mahmoud Badri --- .../componentcore/componentcore_constants.h | 2 + .../componentcore/designeractionmanager.cpp | 40 +++++----- .../componentcore/modelnodeoperations.cpp | 78 +++++++++---------- .../componentcore/modelnodeoperations.h | 2 + 4 files changed, 61 insertions(+), 61 deletions(-) diff --git a/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h b/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h index fd6ffa87696..ae6819b172c 100644 --- a/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h +++ b/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h @@ -206,6 +206,8 @@ const int priorityLast = 60; const char addImagesDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", "Image Files"); const char addFontsDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", "Font Files"); +const char addSoundsDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", "Sound Files"); +const char addShadersDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", "Shader Files"); const char addCustomEffectDialogDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", "Add Custom Effect"); diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp index 46c23449d1e..818cc356e3f 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp @@ -1388,28 +1388,26 @@ void DesignerActionManager::createDefaultDesignerActions() void DesignerActionManager::createDefaultAddResourceHandler() { - registerAddResourceHandler(AddResourceHandler(ComponentCoreConstants::addImagesDisplayString, - "*.png", - ModelNodeOperations::addImageToProject)); - registerAddResourceHandler(AddResourceHandler(ComponentCoreConstants::addImagesDisplayString, - "*.jpg", - ModelNodeOperations::addImageToProject)); - registerAddResourceHandler(AddResourceHandler(ComponentCoreConstants::addImagesDisplayString, - "*.bmp", - ModelNodeOperations::addImageToProject)); - registerAddResourceHandler(AddResourceHandler(ComponentCoreConstants::addImagesDisplayString, - "*.svg", - ModelNodeOperations::addImageToProject)); - registerAddResourceHandler(AddResourceHandler(ComponentCoreConstants::addImagesDisplayString, - "*.hdr", - ModelNodeOperations::addImageToProject)); + auto registerHandlers = [this](const QStringList &exts, AddResourceOperation op, + const QString &category) { + for (const QString &ext : exts) + registerAddResourceHandler(AddResourceHandler(category, ext, op)); + }; - registerAddResourceHandler(AddResourceHandler(ComponentCoreConstants::addFontsDisplayString, - "*.ttf", - ModelNodeOperations::addFontToProject)); - registerAddResourceHandler(AddResourceHandler(ComponentCoreConstants::addFontsDisplayString, - "*.otf", - ModelNodeOperations::addFontToProject)); + // The filters will be displayed in reverse order to these lists in file dialog, + // so declare most common types last + registerHandlers({"*.webp", "*.hdr", "*.svg", "*.bmp", "*.jpg", "*.png"}, + ModelNodeOperations::addImageToProject, + ComponentCoreConstants::addImagesDisplayString); + registerHandlers({"*.otf", "*.ttf"}, + ModelNodeOperations::addFontToProject, + ComponentCoreConstants::addFontsDisplayString); + registerHandlers({"*.wav"}, + ModelNodeOperations::addSoundToProject, + ComponentCoreConstants::addSoundsDisplayString); + registerHandlers({"*.glsl", "*.glslv", "*.glslf", "*.vsh", "*.fsh", "*.vert", "*.frag"}, + ModelNodeOperations::addShaderToProject, + ComponentCoreConstants::addShadersDisplayString); } void DesignerActionManager::createDefaultModelNodePreviewImageHandlers() diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp index f43e8fb49ec..1b8375cf89d 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp @@ -970,46 +970,7 @@ Utils::FilePath projectFilePath() return Utils::FilePath(); } -bool addFontToProject(const QStringList &fileNames, const QString &defaultDirectory) -{ - - QString adjustedDefaultDirectory = defaultDirectory; - Utils::FilePath fonts = projectFilePath().pathAppended("fonts"); - - if (fonts.exists()) - adjustedDefaultDirectory = fonts.toString(); - - QString directory = AddImagesDialog::getDirectory(fileNames, adjustedDefaultDirectory); - - if (directory.isEmpty()) - return true; - - bool allSuccessful = true; - for (const QString &fileName : fileNames) { - const QString targetFile = directory + "/" + QFileInfo(fileName).fileName(); - const bool success = QFile::copy(fileName, targetFile); - - auto document = QmlDesignerPlugin::instance()->currentDesignDocument(); - - QTC_ASSERT(document, return false); - - if (success) { - ProjectExplorer::Node *node = ProjectExplorer::ProjectTree::nodeForFile(document->fileName()); - if (node) { - ProjectExplorer::FolderNode *containingFolder = node->parentFolderNode(); - if (containingFolder) - containingFolder->addFiles(QStringList(targetFile)); - } - } else { - allSuccessful = false; - } - } - - return allSuccessful; -} - - -bool addImageToProject(const QStringList &fileNames, const QString &defaultDirectory) +static bool addFilesToProject(const QStringList &fileNames, const QString &defaultDirectory) { QString directory = AddImagesDialog::getDirectory(fileNames, defaultDirectory); @@ -1040,6 +1001,43 @@ bool addImageToProject(const QStringList &fileNames, const QString &defaultDirec return allSuccessful; } +static QString getAssetDefaultDirectory(const QString &assetDir, const QString &defaultDirectory) +{ + QString adjustedDefaultDirectory = defaultDirectory; + Utils::FilePath assetPath = projectFilePath().pathAppended(assetDir); + + if (!assetPath.exists()) { + // Create the default asset type directory if it doesn't exist + QDir dir(projectFilePath().toString()); + dir.mkpath(assetDir); + } + + if (assetPath.exists() && assetPath.isDir()) + adjustedDefaultDirectory = assetPath.toString(); + + return adjustedDefaultDirectory; +} + +bool addFontToProject(const QStringList &fileNames, const QString &defaultDirectory) +{ + return addFilesToProject(fileNames, getAssetDefaultDirectory("fonts", defaultDirectory)); +} + +bool addSoundToProject(const QStringList &fileNames, const QString &defaultDirectory) +{ + return addFilesToProject(fileNames, getAssetDefaultDirectory("sounds", defaultDirectory)); +} + +bool addShaderToProject(const QStringList &fileNames, const QString &defaultDirectory) +{ + return addFilesToProject(fileNames, getAssetDefaultDirectory("shaders", defaultDirectory)); +} + +bool addImageToProject(const QStringList &fileNames, const QString &defaultDirectory) +{ + return addFilesToProject(fileNames, getAssetDefaultDirectory("images", defaultDirectory)); +} + void createFlowActionArea(const SelectionContext &selectionContext) { AbstractView *view = selectionContext.view(); diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h index 1005445384c..97a77a01b3c 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h @@ -75,6 +75,8 @@ void decreaseIndexOfStackedContainer(const SelectionContext &selectionContext); void addTabBarToStackedContainer(const SelectionContext &selectionContext); bool addImageToProject(const QStringList &fileNames, const QString &directory); bool addFontToProject(const QStringList &fileNames, const QString &directory); +bool addSoundToProject(const QStringList &fileNames, const QString &directory); +bool addShaderToProject(const QStringList &fileNames, const QString &directory); void createFlowActionArea(const SelectionContext &selectionContext); void addTransition(const SelectionContext &selectionState); void addFlowEffect(const SelectionContext &selectionState, const TypeName &typeName);