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 {
Drop3DLibraryItemCommand::Drop3DLibraryItemCommand(const QByteArray &itemData)
: m_itemData(itemData)
Drop3DLibraryItemCommand::Drop3DLibraryItemCommand(const QByteArray &itemData, qint32 sceneRootId)
: m_itemData(itemData),
m_sceneRootId(sceneRootId)
{
}
QDataStream &operator<<(QDataStream &out, const Drop3DLibraryItemCommand &command)
{
out << command.itemData();
out << command.sceneRootId();
return out;
}
@@ -44,13 +46,14 @@ QDataStream &operator<<(QDataStream &out, const Drop3DLibraryItemCommand &comman
QDataStream &operator>>(QDataStream &in, Drop3DLibraryItemCommand &command)
{
in >> command.m_itemData;
in >> command.m_sceneRootId;
return in;
}
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

View File

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

View File

@@ -1180,9 +1180,10 @@ ChangeSelectionCommand NodeInstanceServer::createChangeSelectionCommand(const QL
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

View File

@@ -183,7 +183,7 @@ protected:
ChildrenChangedCommand createChildrenChangedCommand(const ServerNodeInstance &parentInstance, const QList<ServerNodeInstance> &instanceList) const;
ComponentCompletedCommand createComponentCompletedCommand(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);

View File

@@ -109,8 +109,16 @@ bool Qt5InformationNodeInstanceServer::eventFilter(QObject *, QEvent *event)
case QEvent::Drop: {
QDropEvent *dropEvent = static_cast<QDropEvent *>(event);
QByteArray data = dropEvent->mimeData()->data(QStringLiteral("application/vnd.bauhaus.itemlibraryinfo"));
if (!data.isEmpty())
nodeInstanceClient()->library3DItemDropped(createDrop3DLibraryItemCommand(data));
if (!data.isEmpty()) {
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;

View File

@@ -104,9 +104,9 @@ public:
static QmlVisualNode createQmlVisualNode(AbstractView *view,
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);

View File

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

View File

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