diff options
author | Mahmoud Badri <mahmoud.badri@qt.io> | 2021-10-06 11:10:36 +0300 |
---|---|---|
committer | Mahmoud Badri <mahmoud.badri@qt.io> | 2021-10-08 11:13:19 +0000 |
commit | 56de449b17e744c2633959f14c4f8e12d4e8de0c (patch) | |
tree | 3979de9453f36ed3954b8ccbf9ded71a47eb82a3 | |
parent | 8770c8674d7ea46864a541e00fbf2df6d3256aee (diff) |
QmlDesigner: Add dropped 3D models to the 3D Editor
When dragging 3D model file(s) from the file system and dropping them
on the 3D Editor, add the models the the 3D Editor after importing
them.
Change-Id: I51ec945097a19e8895eb599b898d49e879100b6d
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
4 files changed, 35 insertions, 15 deletions
diff --git a/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h b/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h index 352c8796b4..49505d2ca7 100644 --- a/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h +++ b/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h @@ -223,6 +223,8 @@ const char addFontsDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources" const char addSoundsDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", "Sound Files"); const char addShadersDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", "Shader Files"); const char add3DAssetsDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", "3D Assets"); +const char addQt3DSPresentationsDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", + "Qt 3D Studio Presentations"); const char addCustomEffectDialogDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", "Add Custom Effect"); diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp index 025b622789..835ba07b5b 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp @@ -23,14 +23,15 @@ ** ****************************************************************************/ -#include "edit3dwidget.h" -#include "edit3dview.h" -#include "edit3dcanvas.h" -#include "edit3dactions.h" - -#include "qmldesignerplugin.h" #include "designersettings.h" +#include "edit3dactions.h" +#include "edit3dcanvas.h" +#include "edit3dview.h" +#include "edit3dwidget.h" +#include "metainfo.h" #include "qmldesignerconstants.h" +#include "qmldesignerplugin.h" +#include "qmlvisualnode.h" #include "viewmanager.h" #include <coreplugin/actionmanager/actionmanager.h> @@ -174,7 +175,20 @@ void Edit3DWidget::dropEvent(QDropEvent *dropEvent) { const DesignerActionManager &actionManager = QmlDesignerPlugin::instance() ->viewManager().designerActionManager(); - actionManager.handleExternalAssetsDrop(dropEvent->mimeData()); + QHash<QString, QStringList> addedAssets = actionManager.handleExternalAssetsDrop(dropEvent->mimeData()); + + // add 3D assets to 3d editor (QtQuick3D import will be added if missing) + ItemLibraryInfo *itemLibInfo = m_view->model()->metaInfo().itemLibraryInfo(); + + const QStringList added3DAssets = addedAssets.value(ComponentCoreConstants::add3DAssetsDisplayString); + for (const QString &assetPath : added3DAssets) { + QString fileName = QFileInfo(assetPath).baseName(); + fileName = fileName.at(0).toUpper() + fileName.mid(1); // capitalize first letter + QString type = QString("Quick3DAssets.%1.%1").arg(fileName); + QList<ItemLibraryEntry> entriesForType = itemLibInfo->entriesForType(type.toLatin1()); + if (!entriesForType.isEmpty()) // should always be true, but just in case + QmlVisualNode::createQml3DNode(view(), entriesForType.at(0), m_canvas->activeScene()).modelNode(); + } } } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp index 52d52d1482..06b84d83f8 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp @@ -240,9 +240,6 @@ void ItemLibraryView::updateImport3DSupport(const QVariantMap &supportMap) DesignerActionManager *actionManager = &QmlDesignerPlugin::instance()->viewManager().designerActionManager(); - // All things importable by QSSGAssetImportManager are considered to be in the same category - // so we don't get multiple separate import dialogs when different file types are imported. - if (!m_importableExtensions3DMap.isEmpty()) actionManager->unregisterAddResourceHandlers(ComponentCoreConstants::add3DAssetsDisplayString); @@ -253,22 +250,28 @@ void ItemLibraryView::updateImport3DSupport(const QVariantMap &supportMap) m_importableExtensions3DMap, m_importOptions3DMap, {}, {}, Core::ICore::mainWindow()); - importDlg->show(); + importDlg->exec(); return true; }; - auto add3DHandler = [&](const QString &ext) { + auto add3DHandler = [&](const QString &group, const QString &ext) { const QString filter = QStringLiteral("*.%1").arg(ext); actionManager->registerAddResourceHandler( - AddResourceHandler(ComponentCoreConstants::add3DAssetsDisplayString, filter, + AddResourceHandler(group, filter, import3DModelOperation, 10)); }; + const QHash<QString, QString> groupNames { + {"3D Scene", ComponentCoreConstants::add3DAssetsDisplayString}, + {"Qt 3D Studio Presentation", ComponentCoreConstants::addQt3DSPresentationsDisplayString} + }; + const auto groups = extMap.keys(); for (const auto &group : groups) { const QStringList exts = extMap[group].toStringList(); + const QString grp = groupNames.contains(group) ? groupNames.value(group) : group; for (const auto &ext : exts) - add3DHandler(ext); + add3DHandler(grp, ext); } } diff --git a/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h b/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h index c44467f002..8244fbb489 100644 --- a/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h +++ b/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h @@ -100,7 +100,8 @@ class QMLDESIGNERCORE_EXPORT ItemLibraryInfo : public QObject public: QList<ItemLibraryEntry> entries() const; - QList<ItemLibraryEntry> entriesForType(const QByteArray &typeName, int majorVersion, int minorVersion) const; + QList<ItemLibraryEntry> entriesForType(const QByteArray &typeName, int majorVersion = 1, + int minorVersion = 0) const; void addEntries(const QList<ItemLibraryEntry> &entries, bool overwriteDuplicate = false); bool containsEntry(const ItemLibraryEntry &entry); |