summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2020-03-17 17:08:58 +0200
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2020-03-19 08:12:55 +0000
commitff6dd4dc2e95ce39fd423ca520c72fe50dc64aa1 (patch)
treed991f1b210e3edfdfae07e6bcf45d5e19c191567
parentbcfaa8cd37a6ee23fe25fac34994824e3d719714 (diff)
downloadqt-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>
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/selectionboxgeometry.cpp7
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/selectionboxgeometry.h1
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp5
-rw-r--r--src/plugins/qmldesigner/components/edit3d/edit3dcanvas.cpp5
-rw-r--r--src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp2
-rw-r--r--src/plugins/qmldesigner/components/navigator/navigatorview.cpp12
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()