forked from qt-creator/qt-creator
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>
This commit is contained in:
@@ -223,6 +223,8 @@ const char addFontsDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources"
|
|||||||
const char addSoundsDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", "Sound Files");
|
const char addSoundsDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", "Sound Files");
|
||||||
const char addShadersDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", "Shader Files");
|
const char addShadersDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", "Shader Files");
|
||||||
const char add3DAssetsDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", "3D Assets");
|
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");
|
const char addCustomEffectDialogDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", "Add Custom Effect");
|
||||||
|
|
||||||
|
@@ -23,14 +23,15 @@
|
|||||||
**
|
**
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include "edit3dwidget.h"
|
|
||||||
#include "edit3dview.h"
|
|
||||||
#include "edit3dcanvas.h"
|
|
||||||
#include "edit3dactions.h"
|
|
||||||
|
|
||||||
#include "qmldesignerplugin.h"
|
|
||||||
#include "designersettings.h"
|
#include "designersettings.h"
|
||||||
|
#include "edit3dactions.h"
|
||||||
|
#include "edit3dcanvas.h"
|
||||||
|
#include "edit3dview.h"
|
||||||
|
#include "edit3dwidget.h"
|
||||||
|
#include "metainfo.h"
|
||||||
#include "qmldesignerconstants.h"
|
#include "qmldesignerconstants.h"
|
||||||
|
#include "qmldesignerplugin.h"
|
||||||
|
#include "qmlvisualnode.h"
|
||||||
#include "viewmanager.h"
|
#include "viewmanager.h"
|
||||||
|
|
||||||
#include <coreplugin/actionmanager/actionmanager.h>
|
#include <coreplugin/actionmanager/actionmanager.h>
|
||||||
@@ -174,7 +175,20 @@ void Edit3DWidget::dropEvent(QDropEvent *dropEvent)
|
|||||||
{
|
{
|
||||||
const DesignerActionManager &actionManager = QmlDesignerPlugin::instance()
|
const DesignerActionManager &actionManager = QmlDesignerPlugin::instance()
|
||||||
->viewManager().designerActionManager();
|
->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
|
} // namespace QmlDesigner
|
||||||
|
@@ -240,9 +240,6 @@ void ItemLibraryView::updateImport3DSupport(const QVariantMap &supportMap)
|
|||||||
DesignerActionManager *actionManager =
|
DesignerActionManager *actionManager =
|
||||||
&QmlDesignerPlugin::instance()->viewManager().designerActionManager();
|
&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())
|
if (!m_importableExtensions3DMap.isEmpty())
|
||||||
actionManager->unregisterAddResourceHandlers(ComponentCoreConstants::add3DAssetsDisplayString);
|
actionManager->unregisterAddResourceHandlers(ComponentCoreConstants::add3DAssetsDisplayString);
|
||||||
|
|
||||||
@@ -253,22 +250,28 @@ void ItemLibraryView::updateImport3DSupport(const QVariantMap &supportMap)
|
|||||||
m_importableExtensions3DMap,
|
m_importableExtensions3DMap,
|
||||||
m_importOptions3DMap, {}, {},
|
m_importOptions3DMap, {}, {},
|
||||||
Core::ICore::mainWindow());
|
Core::ICore::mainWindow());
|
||||||
importDlg->show();
|
importDlg->exec();
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
auto add3DHandler = [&](const QString &ext) {
|
auto add3DHandler = [&](const QString &group, const QString &ext) {
|
||||||
const QString filter = QStringLiteral("*.%1").arg(ext);
|
const QString filter = QStringLiteral("*.%1").arg(ext);
|
||||||
actionManager->registerAddResourceHandler(
|
actionManager->registerAddResourceHandler(
|
||||||
AddResourceHandler(ComponentCoreConstants::add3DAssetsDisplayString, filter,
|
AddResourceHandler(group, filter,
|
||||||
import3DModelOperation, 10));
|
import3DModelOperation, 10));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const QHash<QString, QString> groupNames {
|
||||||
|
{"3D Scene", ComponentCoreConstants::add3DAssetsDisplayString},
|
||||||
|
{"Qt 3D Studio Presentation", ComponentCoreConstants::addQt3DSPresentationsDisplayString}
|
||||||
|
};
|
||||||
|
|
||||||
const auto groups = extMap.keys();
|
const auto groups = extMap.keys();
|
||||||
for (const auto &group : groups) {
|
for (const auto &group : groups) {
|
||||||
const QStringList exts = extMap[group].toStringList();
|
const QStringList exts = extMap[group].toStringList();
|
||||||
|
const QString grp = groupNames.contains(group) ? groupNames.value(group) : group;
|
||||||
for (const auto &ext : exts)
|
for (const auto &ext : exts)
|
||||||
add3DHandler(ext);
|
add3DHandler(grp, ext);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -100,7 +100,8 @@ class QMLDESIGNERCORE_EXPORT ItemLibraryInfo : public QObject
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
QList<ItemLibraryEntry> entries() const;
|
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);
|
void addEntries(const QList<ItemLibraryEntry> &entries, bool overwriteDuplicate = false);
|
||||||
bool containsEntry(const ItemLibraryEntry &entry);
|
bool containsEntry(const ItemLibraryEntry &entry);
|
||||||
|
Reference in New Issue
Block a user