aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMahmoud Badri <mahmoud.badri@qt.io>2021-10-06 11:10:36 +0300
committerMahmoud Badri <mahmoud.badri@qt.io>2021-10-08 11:13:19 +0000
commit56de449b17e744c2633959f14c4f8e12d4e8de0c (patch)
tree3979de9453f36ed3954b8ccbf9ded71a47eb82a3
parent8770c8674d7ea46864a541e00fbf2df6d3256aee (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>
-rw-r--r--src/plugins/qmldesigner/components/componentcore/componentcore_constants.h2
-rw-r--r--src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp28
-rw-r--r--src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp17
-rw-r--r--src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h3
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);