From 4e5673850cad668aafe1e5408a4d1e072ebd7c5a Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Fri, 26 Aug 2022 17:45:11 +0300 Subject: [PATCH] QmlDesigner: Allow adding imported 3D models using the context menu Also some changes to support translation and avoid translation-related issues. Change-Id: Ie2cc491cf491ac4c14e12e8cf666d4b452b9e7c1 Reviewed-by: Miikka Heikkinen Reviewed-by: --- .../components/edit3d/edit3dview.cpp | 37 +++++++++++++++---- .../components/edit3d/edit3dwidget.cpp | 14 ++++--- .../components/edit3d/edit3dwidget.h | 3 +- 3 files changed, 40 insertions(+), 14 deletions(-) diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp index b0b375c8d9e..d3b576f5cf0 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp @@ -32,6 +32,7 @@ #include "metainfo.h" #include "seekerslider.h" #include "view3dactioncommand.h" +#include "nodehints.h" #include #include @@ -46,7 +47,6 @@ #include #include -#include #include namespace QmlDesigner { @@ -222,19 +222,40 @@ void Edit3DView::onEntriesChanged() void Edit3DView::handleEntriesChanged() { - QMap> entriesMap { - {"Camera", {}}, - {"Lights", {}}, - {"Models", {}} + if (!model()) + return; + + const QString cameras = tr("Cameras"); + const QString lights = tr("Lights"); + const QString primitives = tr("Primitives"); + const QString importedModels = tr("Imported Models"); + const QStringList keys {cameras, lights, primitives, importedModels}; // used to maintain order + + QHash> entriesMap { + {cameras, {}}, + {lights, {}}, + {primitives, {}}, + {importedModels, {}} }; const QList itemLibEntries = model()->metaInfo().itemLibraryInfo()->entries(); for (const ItemLibraryEntry &entry : itemLibEntries) { - if (entry.typeName().startsWith("QtQuick3D.") && entriesMap.contains(entry.category())) - entriesMap[entry.category()].append(entry); + if (entry.typeName() == "QtQuick3D.Model") { + entriesMap[primitives].append(entry); + } else if (entry.typeName() == "QtQuick3D.DirectionalLight" + || entry.typeName() == "QtQuick3D.PointLight" + || entry.typeName() == "QtQuick3D.SpotLight") { + entriesMap[lights].append(entry); + } else if (entry.typeName() == "QtQuick3D.OrthographicCamera" + || entry.typeName() == "QtQuick3D.PerspectiveCamera") { + entriesMap[cameras].append(entry); + } else if (entry.typeName().startsWith("Quick3DAssets.") + && NodeHints::fromItemLibraryEntry(entry).canBeDroppedInView3D()) { + entriesMap[importedModels].append(entry); + } } - m_edit3DWidget->updateCreateSubMenu(entriesMap); + m_edit3DWidget->updateCreateSubMenu(keys, entriesMap); } void Edit3DView::modelAboutToBeDetached(Model *model) diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp index de864763648..26f2ce6cf0c 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp @@ -193,8 +193,9 @@ void Edit3DWidget::createContextMenu() }); } -// Called by the view to update the "create" sub-menu when the Quick3D entries are ready -void Edit3DWidget::updateCreateSubMenu(const QMap> &entriesMap) +// Called by the view to update the "create" sub-menu when the Quick3D entries are ready. +void Edit3DWidget::updateCreateSubMenu(const QStringList &keys, + const QHash> &entriesMap) { if (!m_contextMenu) return; @@ -207,14 +208,17 @@ void Edit3DWidget::updateCreateSubMenu(const QMapaddMenu(tr("Create")); - const QStringList categories = entriesMap.keys(); - for (const QString &cat : categories) { + for (const QString &cat : keys) { + QList entries = entriesMap.value(cat); + if (entries.isEmpty()) + continue; + QMenu *catMenu = m_createSubMenu->addMenu(cat); - QList entries = entriesMap.value(cat); std::sort(entries.begin(), entries.end(), [](const ItemLibraryEntry &a, const ItemLibraryEntry &b) { return a.name() < b.name(); }); + for (const ItemLibraryEntry &entry : std::as_const(entries)) { QAction *action = catMenu->addAction(entry.name(), this, &Edit3DWidget::onCreateAction); action->setData(entry.name()); diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.h b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.h index 6663690b653..b9f288f0cbf 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.h +++ b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.h @@ -58,7 +58,8 @@ public: void showBackgroundColorMenu(bool show, const QPoint &pos); void showContextMenu(const QPoint &pos, const ModelNode &modelNode); - void updateCreateSubMenu(const QMap> &entriesMap); + void updateCreateSubMenu(const QStringList &keys, + const QHash> &entriesMap); private slots: void onCreateAction();