QmlDesigner: Insert a node dragged to 3d edit view into correct scene

Added scene instance id to the drop command.

Change-Id: I42df07fec823083454ad5a70ccafa318d05ab224
Fixes: QDS-1594
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Miikka Heikkinen
2020-02-06 16:30:01 +02:00
parent f4111fcb18
commit 7c992f5450
8 changed files with 32 additions and 22 deletions

View File

@@ -29,14 +29,16 @@
namespace QmlDesigner { namespace QmlDesigner {
Drop3DLibraryItemCommand::Drop3DLibraryItemCommand(const QByteArray &itemData) Drop3DLibraryItemCommand::Drop3DLibraryItemCommand(const QByteArray &itemData, qint32 sceneRootId)
: m_itemData(itemData) : m_itemData(itemData),
m_sceneRootId(sceneRootId)
{ {
} }
QDataStream &operator<<(QDataStream &out, const Drop3DLibraryItemCommand &command) QDataStream &operator<<(QDataStream &out, const Drop3DLibraryItemCommand &command)
{ {
out << command.itemData(); out << command.itemData();
out << command.sceneRootId();
return out; return out;
} }
@@ -44,13 +46,14 @@ QDataStream &operator<<(QDataStream &out, const Drop3DLibraryItemCommand &comman
QDataStream &operator>>(QDataStream &in, Drop3DLibraryItemCommand &command) QDataStream &operator>>(QDataStream &in, Drop3DLibraryItemCommand &command)
{ {
in >> command.m_itemData; in >> command.m_itemData;
in >> command.m_sceneRootId;
return in; return in;
} }
bool operator==(const Drop3DLibraryItemCommand &first, const Drop3DLibraryItemCommand &second) bool operator==(const Drop3DLibraryItemCommand &first, const Drop3DLibraryItemCommand &second)
{ {
return first.m_itemData == second.m_itemData; return first.m_itemData == second.m_itemData && first.m_sceneRootId == second.m_sceneRootId;
} }
} // namespace QmlDesigner } // namespace QmlDesigner

View File

@@ -41,13 +41,15 @@ class Drop3DLibraryItemCommand
const Drop3DLibraryItemCommand &second); const Drop3DLibraryItemCommand &second);
public: public:
explicit Drop3DLibraryItemCommand(const QByteArray &itemData); explicit Drop3DLibraryItemCommand(const QByteArray &itemData, qint32 sceneRootId);
Drop3DLibraryItemCommand() = default; Drop3DLibraryItemCommand() = default;
QByteArray itemData() const { return m_itemData; } QByteArray itemData() const { return m_itemData; }
qint32 sceneRootId() const { return m_sceneRootId; }
private: private:
QByteArray m_itemData; QByteArray m_itemData;
qint32 m_sceneRootId;
}; };
QDataStream &operator<<(QDataStream &out, const Drop3DLibraryItemCommand &command); QDataStream &operator<<(QDataStream &out, const Drop3DLibraryItemCommand &command);

View File

@@ -1180,9 +1180,10 @@ ChangeSelectionCommand NodeInstanceServer::createChangeSelectionCommand(const QL
return ChangeSelectionCommand(idVector); return ChangeSelectionCommand(idVector);
} }
Drop3DLibraryItemCommand NodeInstanceServer::createDrop3DLibraryItemCommand(const QByteArray &itemData) Drop3DLibraryItemCommand NodeInstanceServer::createDrop3DLibraryItemCommand(const QByteArray &itemData,
qint32 sceneRootId)
{ {
return Drop3DLibraryItemCommand(itemData); return Drop3DLibraryItemCommand(itemData, sceneRootId);
} }
ValuesChangedCommand NodeInstanceServer::createValuesChangedCommand(const QVector<InstancePropertyPair> &propertyList) const ValuesChangedCommand NodeInstanceServer::createValuesChangedCommand(const QVector<InstancePropertyPair> &propertyList) const

View File

@@ -183,7 +183,7 @@ protected:
ChildrenChangedCommand createChildrenChangedCommand(const ServerNodeInstance &parentInstance, const QList<ServerNodeInstance> &instanceList) const; ChildrenChangedCommand createChildrenChangedCommand(const ServerNodeInstance &parentInstance, const QList<ServerNodeInstance> &instanceList) const;
ComponentCompletedCommand createComponentCompletedCommand(const QList<ServerNodeInstance> &instanceList); ComponentCompletedCommand createComponentCompletedCommand(const QList<ServerNodeInstance> &instanceList);
ChangeSelectionCommand createChangeSelectionCommand(const QList<ServerNodeInstance> &instanceList); ChangeSelectionCommand createChangeSelectionCommand(const QList<ServerNodeInstance> &instanceList);
Drop3DLibraryItemCommand createDrop3DLibraryItemCommand(const QByteArray &itemData); Drop3DLibraryItemCommand createDrop3DLibraryItemCommand(const QByteArray &itemData, qint32 sceneRootId);
void addChangedProperty(const InstancePropertyPair &property); void addChangedProperty(const InstancePropertyPair &property);

View File

@@ -109,8 +109,16 @@ bool Qt5InformationNodeInstanceServer::eventFilter(QObject *, QEvent *event)
case QEvent::Drop: { case QEvent::Drop: {
QDropEvent *dropEvent = static_cast<QDropEvent *>(event); QDropEvent *dropEvent = static_cast<QDropEvent *>(event);
QByteArray data = dropEvent->mimeData()->data(QStringLiteral("application/vnd.bauhaus.itemlibraryinfo")); QByteArray data = dropEvent->mimeData()->data(QStringLiteral("application/vnd.bauhaus.itemlibraryinfo"));
if (!data.isEmpty()) if (!data.isEmpty()) {
nodeInstanceClient()->library3DItemDropped(createDrop3DLibraryItemCommand(data)); ServerNodeInstance sceneInstance;
if (hasInstanceForObject(m_active3DScene))
sceneInstance = instanceForObject(m_active3DScene);
else if (hasInstanceForObject(m_active3DView))
sceneInstance = instanceForObject(m_active3DView);
nodeInstanceClient()->library3DItemDropped(createDrop3DLibraryItemCommand(
data, sceneInstance.instanceId()));
}
} break; } break;

View File

@@ -104,9 +104,9 @@ public:
static QmlVisualNode createQmlVisualNode(AbstractView *view, static QmlVisualNode createQmlVisualNode(AbstractView *view,
const ItemLibraryEntry &itemLibraryEntry, const ItemLibraryEntry &itemLibraryEntry,
const QVector3D &position); qint32 sceneRootId, const QVector3D &position);
static NodeListProperty findSceneNodeProperty(AbstractView *view); static NodeListProperty findSceneNodeProperty(AbstractView *view, qint32 sceneRootId);
static bool isFlowTransition(const ModelNode &node); static bool isFlowTransition(const ModelNode &node);

View File

@@ -1451,7 +1451,7 @@ void NodeInstanceView::library3DItemDropped(const Drop3DLibraryItemCommand &comm
QDataStream stream(command.itemData()); QDataStream stream(command.itemData());
ItemLibraryEntry itemLibraryEntry; ItemLibraryEntry itemLibraryEntry;
stream >> itemLibraryEntry; stream >> itemLibraryEntry;
QmlVisualNode::createQmlVisualNode(this, itemLibraryEntry, {}); QmlVisualNode::createQmlVisualNode(this, itemLibraryEntry, command.sceneRootId(), {});
} }
void NodeInstanceView::handlePuppetToCreatorCommand(const PuppetToCreatorCommand &command) void NodeInstanceView::handlePuppetToCreatorCommand(const PuppetToCreatorCommand &command)

View File

@@ -296,26 +296,22 @@ QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view,
QmlVisualNode QmlVisualNode::createQmlVisualNode(AbstractView *view, QmlVisualNode QmlVisualNode::createQmlVisualNode(AbstractView *view,
const ItemLibraryEntry &itemLibraryEntry, const ItemLibraryEntry &itemLibraryEntry,
const QVector3D &position) qint32 sceneRootId, const QVector3D &position)
{ {
NodeAbstractProperty sceneNodeProperty = findSceneNodeProperty(view); NodeAbstractProperty sceneNodeProperty = findSceneNodeProperty(view, sceneRootId);
QTC_ASSERT(sceneNodeProperty.isValid(), return {}); QTC_ASSERT(sceneNodeProperty.isValid(), return {});
ModelNode node = createQmlObjectNode(view, itemLibraryEntry, position, sceneNodeProperty).modelNode(); ModelNode node = createQmlObjectNode(view, itemLibraryEntry, position, sceneNodeProperty).modelNode();
return node; return node;
} }
NodeListProperty QmlVisualNode::findSceneNodeProperty(AbstractView *view) NodeListProperty QmlVisualNode::findSceneNodeProperty(AbstractView *view, qint32 sceneRootId)
{ {
QTC_ASSERT(view, return {}); QTC_ASSERT(view, return {});
QList<ModelNode> quickViews = view->allModelNodesOfType("QtQuick3D.View3D"); ModelNode node;
QTC_ASSERT(!quickViews.isEmpty(), return {}); if (view->hasModelNodeForInternalId(sceneRootId))
const ModelNode quickView = quickViews.first(); node = view->modelNodeForInternalId(sceneRootId);
QList<ModelNode> nodes = quickView.directSubModelNodesOfType("QtQuick3D.Node");
QTC_ASSERT(!nodes.isEmpty(), return {});
const ModelNode node = nodes.first();
return node.defaultNodeListProperty(); return node.defaultNodeListProperty();
} }