forked from qt-creator/qt-creator
QmlDesigner: Create dragged item to correct position in 3d view
Fixes: QDS-8655 Change-Id: I8ab397e4dc571e50c4495f6690418b177afa4dbe Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
This commit is contained in:
@@ -5,9 +5,6 @@
|
|||||||
#include "edit3dview.h"
|
#include "edit3dview.h"
|
||||||
#include "edit3dwidget.h"
|
#include "edit3dwidget.h"
|
||||||
|
|
||||||
#include "nodehints.h"
|
|
||||||
#include "qmlvisualnode.h"
|
|
||||||
|
|
||||||
#include <bindingproperty.h>
|
#include <bindingproperty.h>
|
||||||
#include <nodemetainfo.h>
|
#include <nodemetainfo.h>
|
||||||
#include <nodelistproperty.h>
|
#include <nodelistproperty.h>
|
||||||
@@ -143,41 +140,6 @@ void Edit3DCanvas::resizeEvent(QResizeEvent *e)
|
|||||||
m_parent->view()->edit3DViewResized(e->size());
|
m_parent->view()->edit3DViewResized(e->size());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Edit3DCanvas::dragEnterEvent(QDragEnterEvent *e)
|
|
||||||
{
|
|
||||||
// Block all drags if scene root node is locked
|
|
||||||
ModelNode node;
|
|
||||||
if (m_parent->view()->hasModelNodeForInternalId(m_activeScene))
|
|
||||||
node = m_parent->view()->modelNodeForInternalId(m_activeScene);
|
|
||||||
|
|
||||||
// Allow drop when there is no valid active scene, as the drop goes under the root node of
|
|
||||||
// the document in that case.
|
|
||||||
if (!ModelNode::isThisOrAncestorLocked(node)) {
|
|
||||||
QByteArray data = e->mimeData()->data(Constants::MIME_TYPE_ITEM_LIBRARY_INFO);
|
|
||||||
if (!data.isEmpty()) {
|
|
||||||
QDataStream stream(data);
|
|
||||||
stream >> m_itemLibraryEntry;
|
|
||||||
if (NodeHints::fromItemLibraryEntry(m_itemLibraryEntry).canBeDroppedInView3D())
|
|
||||||
e->accept();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Edit3DCanvas::dropEvent(QDropEvent *e)
|
|
||||||
{
|
|
||||||
m_parent->view()->executeInTransaction(__FUNCTION__, [&] {
|
|
||||||
auto modelNode = QmlVisualNode::createQml3DNode(m_parent->view(), m_itemLibraryEntry, m_activeScene).modelNode();
|
|
||||||
QTC_ASSERT(modelNode.isValid(), return);
|
|
||||||
|
|
||||||
e->accept();
|
|
||||||
m_parent->view()->setSelectedModelNode(modelNode);
|
|
||||||
|
|
||||||
// if added node is a Model, assign it a material
|
|
||||||
if (modelNode.metaInfo().isQtQuick3DModel())
|
|
||||||
m_parent->view()->assignMaterialTo3dModel(modelNode);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void Edit3DCanvas::focusOutEvent(QFocusEvent *focusEvent)
|
void Edit3DCanvas::focusOutEvent(QFocusEvent *focusEvent)
|
||||||
{
|
{
|
||||||
QmlDesignerPlugin::emitUsageStatisticsTime(Constants::EVENT_3DEDITOR_TIME,
|
QmlDesignerPlugin::emitUsageStatisticsTime(Constants::EVENT_3DEDITOR_TIME,
|
||||||
|
@@ -2,8 +2,6 @@
|
|||||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "itemlibraryinfo.h"
|
|
||||||
|
|
||||||
#include <QtWidgets/qwidget.h>
|
#include <QtWidgets/qwidget.h>
|
||||||
#include <QtGui/qimage.h>
|
#include <QtGui/qimage.h>
|
||||||
#include <QtGui/qevent.h>
|
#include <QtGui/qevent.h>
|
||||||
@@ -38,8 +36,6 @@ protected:
|
|||||||
void keyReleaseEvent(QKeyEvent *e) override;
|
void keyReleaseEvent(QKeyEvent *e) override;
|
||||||
void paintEvent(QPaintEvent *e) override;
|
void paintEvent(QPaintEvent *e) override;
|
||||||
void resizeEvent(QResizeEvent *e) override;
|
void resizeEvent(QResizeEvent *e) override;
|
||||||
void dragEnterEvent(QDragEnterEvent *e) override;
|
|
||||||
void dropEvent(QDropEvent *e) override;
|
|
||||||
void focusOutEvent(QFocusEvent *focusEvent) override;
|
void focusOutEvent(QFocusEvent *focusEvent) override;
|
||||||
void focusInEvent(QFocusEvent *focusEvent) override;
|
void focusInEvent(QFocusEvent *focusEvent) override;
|
||||||
|
|
||||||
@@ -49,7 +45,6 @@ private:
|
|||||||
QPointer<Edit3DWidget> m_parent;
|
QPointer<Edit3DWidget> m_parent;
|
||||||
QImage m_image;
|
QImage m_image;
|
||||||
qint32 m_activeScene = -1;
|
qint32 m_activeScene = -1;
|
||||||
ItemLibraryEntry m_itemLibraryEntry;
|
|
||||||
QElapsedTimer m_usageTimer;
|
QElapsedTimer m_usageTimer;
|
||||||
qreal m_opacity = 1.0;
|
qreal m_opacity = 1.0;
|
||||||
QWidget *m_busyIndicator = nullptr;
|
QWidget *m_busyIndicator = nullptr;
|
||||||
|
@@ -16,6 +16,7 @@
|
|||||||
#include "qmldesignerconstants.h"
|
#include "qmldesignerconstants.h"
|
||||||
#include "qmldesignericons.h"
|
#include "qmldesignericons.h"
|
||||||
#include "qmldesignerplugin.h"
|
#include "qmldesignerplugin.h"
|
||||||
|
#include "qmlvisualnode.h"
|
||||||
#include "seekerslider.h"
|
#include "seekerslider.h"
|
||||||
|
|
||||||
#include <coreplugin/icore.h>
|
#include <coreplugin/icore.h>
|
||||||
@@ -304,6 +305,16 @@ void Edit3DView::nodeAtPosReady(const ModelNode &modelNode, const QVector3D &pos
|
|||||||
if (modelNode.isValid() && !modelNode.isSelected())
|
if (modelNode.isValid() && !modelNode.isSelected())
|
||||||
setSelectedModelNode(modelNode);
|
setSelectedModelNode(modelNode);
|
||||||
m_edit3DWidget->showContextMenu(m_contextMenuPos, modelNode, pos3d);
|
m_edit3DWidget->showContextMenu(m_contextMenuPos, modelNode, pos3d);
|
||||||
|
} else if (m_nodeAtPosReqType == NodeAtPosReqType::ComponentDrop) {
|
||||||
|
ModelNode createdNode;
|
||||||
|
executeInTransaction(__FUNCTION__, [&] {
|
||||||
|
createdNode = QmlVisualNode::createQml3DNode(
|
||||||
|
this, m_droppedEntry, edit3DWidget()->canvas()->activeScene(), pos3d).modelNode();
|
||||||
|
if (createdNode.metaInfo().isQtQuick3DModel())
|
||||||
|
assignMaterialTo3dModel(createdNode);
|
||||||
|
});
|
||||||
|
if (createdNode.isValid())
|
||||||
|
setSelectedModelNode(createdNode);
|
||||||
} else if (m_nodeAtPosReqType == NodeAtPosReqType::MaterialDrop) {
|
} else if (m_nodeAtPosReqType == NodeAtPosReqType::MaterialDrop) {
|
||||||
bool isModel = modelNode.metaInfo().isQtQuick3DModel();
|
bool isModel = modelNode.metaInfo().isQtQuick3DModel();
|
||||||
if (m_droppedModelNode.isValid() && modelNode.isValid() && isModel) {
|
if (m_droppedModelNode.isValid() && modelNode.isValid() && isModel) {
|
||||||
@@ -895,4 +906,11 @@ void Edit3DView::dropTexture(const ModelNode &textureNode, const QPointF &pos)
|
|||||||
emitView3DAction(View3DActionType::GetNodeAtPos, pos);
|
emitView3DAction(View3DActionType::GetNodeAtPos, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Edit3DView::dropComponent(const ItemLibraryEntry &entry, const QPointF &pos)
|
||||||
|
{
|
||||||
|
m_nodeAtPosReqType = NodeAtPosReqType::ComponentDrop;
|
||||||
|
m_droppedEntry = entry;
|
||||||
|
emitView3DAction(View3DActionType::GetNodeAtPos, pos);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace QmlDesigner
|
} // namespace QmlDesigner
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "itemlibraryinfo.h"
|
||||||
#include <qmldesignercomponents_global.h>
|
#include <qmldesignercomponents_global.h>
|
||||||
|
|
||||||
#include <abstractview.h>
|
#include <abstractview.h>
|
||||||
@@ -65,6 +66,7 @@ public:
|
|||||||
void dropMaterial(const ModelNode &matNode, const QPointF &pos);
|
void dropMaterial(const ModelNode &matNode, const QPointF &pos);
|
||||||
void dropBundleMaterial(const QPointF &pos);
|
void dropBundleMaterial(const QPointF &pos);
|
||||||
void dropTexture(const ModelNode &textureNode, const QPointF &pos);
|
void dropTexture(const ModelNode &textureNode, const QPointF &pos);
|
||||||
|
void dropComponent(const ItemLibraryEntry &entry, const QPointF &pos);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void onEntriesChanged();
|
void onEntriesChanged();
|
||||||
@@ -72,6 +74,7 @@ private slots:
|
|||||||
private:
|
private:
|
||||||
enum class NodeAtPosReqType {
|
enum class NodeAtPosReqType {
|
||||||
BundleMaterialDrop,
|
BundleMaterialDrop,
|
||||||
|
ComponentDrop,
|
||||||
MaterialDrop,
|
MaterialDrop,
|
||||||
TextureDrop,
|
TextureDrop,
|
||||||
ContextMenu,
|
ContextMenu,
|
||||||
@@ -122,6 +125,7 @@ private:
|
|||||||
int particlemode;
|
int particlemode;
|
||||||
ModelCache<QImage> m_canvasCache;
|
ModelCache<QImage> m_canvasCache;
|
||||||
ModelNode m_droppedModelNode;
|
ModelNode m_droppedModelNode;
|
||||||
|
ItemLibraryEntry m_droppedEntry;
|
||||||
NodeAtPosReqType m_nodeAtPosReqType;
|
NodeAtPosReqType m_nodeAtPosReqType;
|
||||||
QPoint m_contextMenuPos;
|
QPoint m_contextMenuPos;
|
||||||
QTimer m_compressionTimer;
|
QTimer m_compressionTimer;
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
#include "edit3dwidget.h"
|
#include "edit3dwidget.h"
|
||||||
#include "designdocumentview.h"
|
#include "designdocument.h"
|
||||||
#include "edit3dactions.h"
|
#include "edit3dactions.h"
|
||||||
#include "edit3dcanvas.h"
|
#include "edit3dcanvas.h"
|
||||||
#include "edit3dview.h"
|
#include "edit3dview.h"
|
||||||
@@ -10,10 +10,10 @@
|
|||||||
#include "metainfo.h"
|
#include "metainfo.h"
|
||||||
#include "modelnodeoperations.h"
|
#include "modelnodeoperations.h"
|
||||||
#include "nodeabstractproperty.h"
|
#include "nodeabstractproperty.h"
|
||||||
|
#include "nodehints.h"
|
||||||
#include "qmldesignerconstants.h"
|
#include "qmldesignerconstants.h"
|
||||||
#include "qmldesignerplugin.h"
|
#include "qmldesignerplugin.h"
|
||||||
#include "qmlvisualnode.h"
|
#include "qmlvisualnode.h"
|
||||||
#include "timelineactions.h"
|
|
||||||
#include "viewmanager.h"
|
#include "viewmanager.h"
|
||||||
|
|
||||||
#include <auxiliarydataproperties.h>
|
#include <auxiliarydataproperties.h>
|
||||||
@@ -407,6 +407,15 @@ Edit3DView *Edit3DWidget::view() const
|
|||||||
|
|
||||||
void Edit3DWidget::dragEnterEvent(QDragEnterEvent *dragEnterEvent)
|
void Edit3DWidget::dragEnterEvent(QDragEnterEvent *dragEnterEvent)
|
||||||
{
|
{
|
||||||
|
// Block all drags if scene root node is locked
|
||||||
|
if (m_view->hasModelNodeForInternalId(m_canvas->activeScene())) {
|
||||||
|
ModelNode node = m_view->modelNodeForInternalId(m_canvas->activeScene());
|
||||||
|
if (ModelNode::isThisOrAncestorLocked(node))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_draggedEntry = {};
|
||||||
|
|
||||||
const DesignerActionManager &actionManager = QmlDesignerPlugin::instance()
|
const DesignerActionManager &actionManager = QmlDesignerPlugin::instance()
|
||||||
->viewManager().designerActionManager();
|
->viewManager().designerActionManager();
|
||||||
if (actionManager.externalDragHasSupportedAssets(dragEnterEvent->mimeData())
|
if (actionManager.externalDragHasSupportedAssets(dragEnterEvent->mimeData())
|
||||||
@@ -414,6 +423,14 @@ void Edit3DWidget::dragEnterEvent(QDragEnterEvent *dragEnterEvent)
|
|||||||
|| dragEnterEvent->mimeData()->hasFormat(Constants::MIME_TYPE_BUNDLE_MATERIAL)
|
|| dragEnterEvent->mimeData()->hasFormat(Constants::MIME_TYPE_BUNDLE_MATERIAL)
|
||||||
|| dragEnterEvent->mimeData()->hasFormat(Constants::MIME_TYPE_TEXTURE)) {
|
|| dragEnterEvent->mimeData()->hasFormat(Constants::MIME_TYPE_TEXTURE)) {
|
||||||
dragEnterEvent->acceptProposedAction();
|
dragEnterEvent->acceptProposedAction();
|
||||||
|
} else if (dragEnterEvent->mimeData()->hasFormat(Constants::MIME_TYPE_ITEM_LIBRARY_INFO)) {
|
||||||
|
QByteArray data = dragEnterEvent->mimeData()->data(Constants::MIME_TYPE_ITEM_LIBRARY_INFO);
|
||||||
|
if (!data.isEmpty()) {
|
||||||
|
QDataStream stream(data);
|
||||||
|
stream >> m_draggedEntry;
|
||||||
|
if (NodeHints::fromItemLibraryEntry(m_draggedEntry).canBeDroppedInView3D())
|
||||||
|
dragEnterEvent->acceptProposedAction();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -443,6 +460,13 @@ void Edit3DWidget::dropEvent(QDropEvent *dropEvent)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// handle dropping from component view
|
||||||
|
if (dropEvent->mimeData()->hasFormat(Constants::MIME_TYPE_ITEM_LIBRARY_INFO)) {
|
||||||
|
if (!m_draggedEntry.name().isEmpty())
|
||||||
|
m_view->dropComponent(m_draggedEntry, pos);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// handle dropping external assets
|
// handle dropping external assets
|
||||||
const DesignerActionManager &actionManager = QmlDesignerPlugin::instance()
|
const DesignerActionManager &actionManager = QmlDesignerPlugin::instance()
|
||||||
->viewManager().designerActionManager();
|
->viewManager().designerActionManager();
|
||||||
|
@@ -77,6 +77,7 @@ private:
|
|||||||
ModelNode m_contextMenuTarget;
|
ModelNode m_contextMenuTarget;
|
||||||
QVector3D m_contextMenuPos3d;
|
QVector3D m_contextMenuPos3d;
|
||||||
QHash<QString, ItemLibraryEntry> m_nameToEntry;
|
QHash<QString, ItemLibraryEntry> m_nameToEntry;
|
||||||
|
ItemLibraryEntry m_draggedEntry;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace QmlDesigner
|
} // namespace QmlDesigner
|
||||||
|
Reference in New Issue
Block a user