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);