diff --git a/share/qtcreator/qmldesigner/itemLibraryQmlSources/AssetDelegate.qml b/share/qtcreator/qmldesigner/itemLibraryQmlSources/AssetDelegate.qml index 7820e39e549..dc10056a46e 100644 --- a/share/qtcreator/qmldesigner/itemLibraryQmlSources/AssetDelegate.qml +++ b/share/qtcreator/qmldesigner/itemLibraryQmlSources/AssetDelegate.qml @@ -198,7 +198,7 @@ TreeViewDelegate { if (root.__isDirectory) return filePath - if (rootView.assetIsImage(model.filePath)) { + if (rootView.assetIsImageOrTexture(model.filePath)) { let size = rootView.imageSize(model.filePath) return filePath + "\n" diff --git a/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml index a20e09e7043..3ad72eeeea9 100644 --- a/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml +++ b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml @@ -716,9 +716,10 @@ Item { dropEnabled: true onDropEnter: (drag) => { - drag.accepted = drag.formats[0] === "application/vnd.qtdesignstudio.bundletexture" - || drag.formats[0] === "application/vnd.qtdesignstudio.assets" - + let accepted = drag.formats[0] === "application/vnd.qtdesignstudio.bundletexture" + if (drag.formats[0] === "application/vnd.qtdesignstudio.assets") + accepted = rootView.hasAcceptableAssets(drag.urls) + drag.accepted = accepted highlight = drag.accepted } diff --git a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.cpp b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.cpp index 4818ca3ed3e..37deec9f008 100644 --- a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.cpp +++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.cpp @@ -169,8 +169,7 @@ bool AssetsLibraryModel::deleteFolderRecursively(const QModelIndex &folderIndex) bool AssetsLibraryModel::allFilePathsAreTextures(const QStringList &filePaths) const { return Utils::allOf(filePaths, [](const QString &path) { - Asset asset(path); - return asset.isImage() || asset.isTexture3D(); + return Asset(path).isValidTextureSource(); }); } diff --git a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp index 48e7f2aadba..9427c3e8bba 100644 --- a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp @@ -245,10 +245,9 @@ QString AssetsLibraryWidget::assetFileSize(const QString &id) return QLocale::system().formattedDataSize(fileSize, 2, QLocale::DataSizeTraditionalFormat); } -bool AssetsLibraryWidget::assetIsImage(const QString &id) +bool AssetsLibraryWidget::assetIsImageOrTexture(const QString &id) { - Asset asset(id); - return asset.isImage() || asset.isTexture3D(); + return Asset(id).isValidTextureSource(); } QList AssetsLibraryWidget::createToolBarWidgets() diff --git a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.h b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.h index d4161213a04..f368b2935b8 100644 --- a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.h +++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.h @@ -80,7 +80,7 @@ public: Q_INVOKABLE void invalidateThumbnail(const QString &id); Q_INVOKABLE QSize imageSize(const QString &id); Q_INVOKABLE QString assetFileSize(const QString &id); - Q_INVOKABLE bool assetIsImage(const QString &id); + Q_INVOKABLE bool assetIsImageOrTexture(const QString &id); Q_INVOKABLE void addTextures(const QStringList &filePaths); Q_INVOKABLE void addLightProbe(const QString &filePaths); diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp index b5a4c077ac3..29657afc231 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp @@ -835,8 +835,8 @@ void editMaterial(const SelectionContext &selectionContext) if (material.isValid()) { QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("MaterialEditor"); - // to MaterialEditor and MaterialBrowser... - view->emitCustomNotification("selected_material_changed", {material}); + // to MaterialBrowser... + view->emitCustomNotification("select_material", {material}); } } diff --git a/src/plugins/qmldesigner/components/createtexture.cpp b/src/plugins/qmldesigner/components/createtexture.cpp index f716a63bcc1..0d3c7fa964b 100644 --- a/src/plugins/qmldesigner/components/createtexture.cpp +++ b/src/plugins/qmldesigner/components/createtexture.cpp @@ -4,6 +4,7 @@ #include "createtexture.h" #include "abstractview.h" +#include "asset.h" #include "documentmanager.h" #include "modelnodeoperations.h" #include "nodelistproperty.h" @@ -24,7 +25,8 @@ CreateTexture::CreateTexture(AbstractView *view, bool importFile) ModelNode CreateTexture::execute(const QString &filePath, AddTextureMode mode, int sceneId) { - if (m_importFile && !addFileToProject(filePath)) + Asset asset(filePath); + if (!asset.isValidTextureSource() || (m_importFile && !addFileToProject(filePath))) return {}; ModelNode texture = createTextureFromImage(filePath, mode); @@ -36,7 +38,7 @@ ModelNode CreateTexture::execute(const QString &filePath, AddTextureMode mode, i QTimer::singleShot(0, m_view, [this, texture]() { if (m_view->model()) - m_view->emitCustomNotification("selected_texture_changed", {texture}, {true}); + m_view->emitCustomNotification("select_texture", {texture}, {true}); }); return texture; diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp index f8eb49d1101..bf2202717f9 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp @@ -503,8 +503,7 @@ void Edit3DWidget::dragEnterEvent(QDragEnterEvent *dragEnterEvent) || dragEnterEvent->mimeData()->hasFormat(Constants::MIME_TYPE_BUNDLE_TEXTURE)) { const auto urls = dragEnterEvent->mimeData()->urls(); if (!urls.isEmpty()) { - Asset asset(urls.first().toLocalFile()); - if (asset.isTexture3D() || asset.isImage()) + if (Asset(urls.first().toLocalFile()).isValidTextureSource()) dragEnterEvent->acceptProposedAction(); } } else if (actionManager.externalDragHasSupportedAssets(dragEnterEvent->mimeData()) diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp index 3b5364b6928..e0997ebad7f 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp @@ -164,7 +164,7 @@ WidgetInfo MaterialBrowserView::widgetInfo() MaterialBrowserTexturesModel *texturesModel = m_widget->materialBrowserTexturesModel().data(); connect(texturesModel, &MaterialBrowserTexturesModel::selectedIndexChanged, this, [&] (int idx) { ModelNode texNode = m_widget->materialBrowserTexturesModel()->textureAt(idx); - emitCustomNotification("selected_texture_changed", {texNode}, {}); + emitCustomNotification("selected_texture_changed", {texNode}); }); connect(texturesModel, &MaterialBrowserTexturesModel::duplicateTextureTriggered, this, [&] (const ModelNode &texture) { @@ -499,14 +499,14 @@ void MaterialBrowserView::customNotification(const AbstractView *view, const QList &nodeList, const QList &data) { - if (view == this) + if (view == this && identifier != "select_texture") return; - if (identifier == "selected_material_changed") { + if (identifier == "select_material") { int idx = m_widget->materialBrowserModel()->materialIndex(nodeList.first()); if (idx != -1) m_widget->materialBrowserModel()->selectMaterial(idx); - } else if (identifier == "selected_texture_changed") { + } else if (identifier == "select_texture") { int idx = m_widget->materialBrowserTexturesModel()->textureIndex(nodeList.first()); if (idx != -1) { m_widget->materialBrowserTexturesModel()->selectTexture(idx); diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp index 5eb685ff32a..b6783436d97 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp @@ -7,19 +7,19 @@ #include "materialbrowsertexturesmodel.h" #include "materialbrowserview.h" -#include -#include -#include -#include -#include -#include -#include - -#include +#include "asset.h" +#include "assetimageprovider.h" +#include "designeractionmanager.h" +#include "designermcumanager.h" +#include "documentmanager.h" +#include "hdrimage.h" +#include "qmldesignerconstants.h" +#include "qmldesignerplugin.h" +#include "theme.h" +#include "variantproperty.h" #include #include -#include #include #include @@ -273,6 +273,13 @@ void MaterialBrowserWidget::acceptBundleMaterialDrop() m_materialBrowserView->model()->endDrag(); } +bool MaterialBrowserWidget::hasAcceptableAssets(const QList &urls) +{ + return Utils::anyOf(urls, [](const QUrl &url) { + return Asset(url.toLocalFile()).isValidTextureSource(); + }); +} + void MaterialBrowserWidget::acceptBundleTextureDrop() { m_materialBrowserView->emitCustomNotification("drop_bundle_texture", {}, {}); // To ContentLibraryView @@ -284,6 +291,8 @@ void MaterialBrowserWidget::acceptAssetsDrop(const QList &urls) { QStringList assetPaths = Utils::transform(urls, [](const QUrl &url) { return url.toLocalFile(); }); m_materialBrowserView->createTextures(assetPaths); + if (m_materialBrowserView->model()) + m_materialBrowserView->model()->endDrag(); } void MaterialBrowserWidget::acceptTextureDropOnMaterial(int matIndex, const QString &texId) @@ -295,6 +304,9 @@ void MaterialBrowserWidget::acceptTextureDropOnMaterial(int matIndex, const QStr m_materialBrowserModel->selectMaterial(matIndex); m_materialBrowserView->applyTextureToMaterial({mat}, tex); } + + if (m_materialBrowserView->model()) + m_materialBrowserView->model()->endDrag(); } void MaterialBrowserWidget::focusMaterialSection(bool focusMatSec) diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h index e607f022546..40fc790a039 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h @@ -58,6 +58,7 @@ public: Q_INVOKABLE void startDragMaterial(int index, const QPointF &mousePos); Q_INVOKABLE void startDragTexture(int index, const QPointF &mousePos); Q_INVOKABLE void acceptBundleMaterialDrop(); + Q_INVOKABLE bool hasAcceptableAssets(const QList &urls); Q_INVOKABLE void acceptBundleTextureDrop(); Q_INVOKABLE void acceptAssetsDrop(const QList &urls); Q_INVOKABLE void acceptTextureDropOnMaterial(int matIndex, const QString &texId); diff --git a/src/plugins/qmldesigner/qmldesignerprojectmanager.cpp b/src/plugins/qmldesigner/qmldesignerprojectmanager.cpp index 3d19230c193..68e06fe349f 100644 --- a/src/plugins/qmldesigner/qmldesignerprojectmanager.cpp +++ b/src/plugins/qmldesigner/qmldesignerprojectmanager.cpp @@ -107,9 +107,7 @@ auto makeCollectorDispatcherChain(ImageCacheCollector &nodeInstanceCollector, [](Utils::SmallStringView filePath, [[maybe_unused]] Utils::SmallStringView state, [[maybe_unused]] const QmlDesigner::ImageCache::AuxiliaryData &auxiliaryData) { - Asset asset {QString(filePath)}; - Asset::Type type = asset.type(); - return type == Asset::Type::Image || type == Asset::Type::Texture3D; + return Asset{QString(filePath)}.isValidTextureSource(); }, &textureImageCollector)); } diff --git a/src/plugins/qmldesigner/utils/asset.cpp b/src/plugins/qmldesigner/utils/asset.cpp index 1264630061b..60aa3b6d334 100644 --- a/src/plugins/qmldesigner/utils/asset.cpp +++ b/src/plugins/qmldesigner/utils/asset.cpp @@ -180,6 +180,11 @@ bool Asset::isSupported() const return m_type != Asset::Type::Unknown; } +bool Asset::isValidTextureSource() +{ + return isImage() || isTexture3D(); +} + void Asset::resolveType() { if (m_suffix.isEmpty()) diff --git a/src/plugins/qmldesigner/utils/asset.h b/src/plugins/qmldesigner/utils/asset.h index dce8c47e8ac..0b437352476 100644 --- a/src/plugins/qmldesigner/utils/asset.h +++ b/src/plugins/qmldesigner/utils/asset.h @@ -52,6 +52,7 @@ public: bool isKtxFile() const; bool isEffect() const; bool isSupported() const; + bool isValidTextureSource(); private: void resolveType();