diff options
author | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2020-03-17 17:08:58 +0200 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2020-03-19 08:12:55 +0000 |
commit | ff6dd4dc2e95ce39fd423ca520c72fe50dc64aa1 (patch) | |
tree | d991f1b210e3edfdfae07e6bcf45d5e19c191567 | |
parent | bcfaa8cd37a6ee23fe25fac34994824e3d719714 (diff) | |
download | qt-creator-ff6dd4dc2e95ce39fd423ca520c72fe50dc64aa1.tar.gz |
QmlDesigner: Fix selection issues in navigator and 3d edit view
Fixed multiple issues with showing correct selection in navigator and
3d edit view:
- Dragging items from item library selects only that item,
regardless if drag was done to 3d edit view or navigator
- Selection is shown correctly after reparenting items, including
multiselection reparenting
- Adding a new item to the active scene now shows selection box
correctly for that item
Change-Id: I5156ca4c22e606c41e1e346ea5c32c3d70d89f5e
Fixes: QDS-1577
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
6 files changed, 22 insertions, 10 deletions
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/selectionboxgeometry.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/selectionboxgeometry.cpp index dcb768ce62..8b6d0b1fde 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/selectionboxgeometry.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/selectionboxgeometry.cpp @@ -35,6 +35,7 @@ #include <QtQuick3D/qquick3dobject.h> #include <QtQuick/qquickwindow.h> #include <QtCore/qvector.h> +#include <QtCore/qtimer.h> #include <limits> @@ -162,6 +163,12 @@ QSSGRenderGraphObject *SelectionBoxGeometry::updateSpatialNode(QSSGRenderGraphOb rootRN->localTransform = m; rootRN->markDirty(QSSGRenderNode::TransformDirtyFlag::TransformNotDirty); rootRN->calculateGlobalVariables(); + m_asyncUpdatePending = false; + } else if (!m_asyncUpdatePending) { + m_asyncUpdatePending = true; + // A necessary spatial node doesn't yet exist. Defer selection box creation one frame. + QTimer::singleShot(0, this, &SelectionBoxGeometry::update); + return node; } getBounds(m_targetNode, vertexData, indexData, minBounds, maxBounds); appendVertexData(QMatrix4x4(), vertexData, indexData, minBounds, maxBounds); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/selectionboxgeometry.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/selectionboxgeometry.h index a642f2ec58..a267a47585 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/selectionboxgeometry.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/selectionboxgeometry.h @@ -81,6 +81,7 @@ private: bool m_isEmpty = true; QVector<QMetaObject::Connection> m_connections; QSSGBounds3 m_bounds; + bool m_asyncUpdatePending = false; }; } diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index 5789751978..e3d97db879 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -925,7 +925,8 @@ void Qt5InformationNodeInstanceServer::reparentInstances(const ReparentInstances if (m_editView3DRootItem) resolveSceneRoots(); - render3DEditView(); + // Make sure selection is in sync after all reparentings are done + m_selectionChangeTimer.start(0); } void Qt5InformationNodeInstanceServer::clearScene(const ClearSceneCommand &command) @@ -1085,7 +1086,7 @@ void Qt5InformationNodeInstanceServer::changeSelection(const ChangeSelectionComm Q_ARG(QVariant, QVariant::fromValue(selectedObjs))); } - render3DEditView(); + render3DEditView(2); } void Qt5InformationNodeInstanceServer::changePropertyValues(const ChangeValuesCommand &command) diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.cpp index 37c80246a5..331897f08d 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.cpp @@ -117,7 +117,10 @@ void Edit3DCanvas::dropEvent(QDropEvent *e) { Q_UNUSED(e) - QmlVisualNode::createQml3DNode(m_parent->view(), m_itemLibraryEntry, m_activeScene); + auto modelNode = QmlVisualNode::createQml3DNode(m_parent->view(), m_itemLibraryEntry, m_activeScene).modelNode(); + + if (modelNode.isValid()) + m_parent->view()->setSelectedModelNode(modelNode); } } diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index 93b1997707..b7dd9d1082 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -539,7 +539,7 @@ void NavigatorTreeModel::handleItemLibraryItemDrop(const QMimeData *mimeData, in } if (newQmlObjectNode.isValid()) - m_view->selectModelNode(newQmlObjectNode.modelNode()); + m_view->setSelectedModelNode(newQmlObjectNode.modelNode()); } } diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp index 7401e5e370..86404e0ea0 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp @@ -205,6 +205,9 @@ void NavigatorView::nodeReparented(const ModelNode &modelNode, else m_currentModelInterface->notifyModelNodesMoved({modelNode}); treeWidget()->expand(indexForModelNode(modelNode)); + + // make sure selection is in sync again + QTimer::singleShot(0, this, &NavigatorView::updateItemSelection); } void NavigatorView::nodeIdChanged(const ModelNode& modelNode, const QString & /*newId*/, const QString & /*oldId*/) @@ -256,14 +259,10 @@ void NavigatorView::nodeOrderChanged(const NodeListProperty & listProperty, const ModelNode & /*node*/, int /*oldIndex*/) { - bool blocked = blockSelectionChangedSignal(true); - m_currentModelInterface->notifyModelNodesMoved(listProperty.directSubNodes()); // make sure selection is in sync again - updateItemSelection(); - - blockSelectionChangedSignal(blocked); + QTimer::singleShot(0, this, &NavigatorView::updateItemSelection); } void NavigatorView::changeToComponent(const QModelIndex &index) @@ -405,7 +404,8 @@ void NavigatorView::changeSelection(const QItemSelection & /*newSelection*/, con void NavigatorView::selectedNodesChanged(const QList<ModelNode> &/*selectedNodeList*/, const QList<ModelNode> &/*lastSelectedNodeList*/) { - updateItemSelection(); + // Update selection asynchronously to ensure NavigatorTreeModel's index cache is up to date + QTimer::singleShot(0, this, &NavigatorView::updateItemSelection); } void NavigatorView::updateItemSelection() |