QmlDesigner: Fix issues with MouseArea3D deactivation detection

Existing mouse grab is now released when MouseArea3D is deactivated
or set to no longer grab the mouse. Various gizmos were also set
to follow MouseArea3D's dragging property instead of keeping track
of drag themselves.

Change-Id: I49f968f20b26eb222fc8635b943e9144073fb164
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Miikka Heikkinen
2019-11-18 15:44:33 +02:00
parent 3dd5e089b1
commit dbfdacecf4
4 changed files with 17 additions and 9 deletions

View File

@@ -34,7 +34,7 @@ Model {
property View3D view3D property View3D view3D
property alias color: material.emissiveColor property alias color: material.emissiveColor
property Node targetNode: null property Node targetNode: null
property bool dragging: false property bool dragging: mouseAreaYZ.dragging || mouseAreaXZ.dragging
property bool active: false property bool active: false
readonly property bool hovering: mouseAreaYZ.hovering || mouseAreaXZ.hovering readonly property bool hovering: mouseAreaYZ.hovering || mouseAreaXZ.hovering
@@ -61,7 +61,6 @@ Model {
_pointerPosPressed = mouseArea.mapPositionToScene(maskedPosition); _pointerPosPressed = mouseArea.mapPositionToScene(maskedPosition);
var sp = targetNode.scenePosition; var sp = targetNode.scenePosition;
_targetStartPos = Qt.vector3d(sp.x, sp.y, sp.z); _targetStartPos = Qt.vector3d(sp.x, sp.y, sp.z);
dragging = true;
pressed(mouseArea); pressed(mouseArea);
} }
@@ -88,7 +87,6 @@ Model {
return; return;
released(mouseArea, calcRelativeDistance(mouseArea, scenePos)); released(mouseArea, calcRelativeDistance(mouseArea, scenePos));
dragging = false;
} }
MouseArea3D { MouseArea3D {

View File

@@ -34,7 +34,7 @@ Model {
property alias color: gizmoMaterial.emissiveColor property alias color: gizmoMaterial.emissiveColor
property alias priority: mouseArea.priority property alias priority: mouseArea.priority
property Node targetNode: null property Node targetNode: null
property bool dragging: false property bool dragging: mouseArea.dragging
property bool active: false property bool active: false
readonly property bool hovering: mouseArea.hovering readonly property bool hovering: mouseArea.hovering
@@ -65,7 +65,6 @@ Model {
_pointerPosPressed = mouseArea.mapPositionToScene(scenePos); _pointerPosPressed = mouseArea.mapPositionToScene(scenePos);
var sp = targetNode.scenePosition; var sp = targetNode.scenePosition;
_targetStartPos = Qt.vector3d(sp.x, sp.y, sp.z); _targetStartPos = Qt.vector3d(sp.x, sp.y, sp.z);
dragging = true;
pressed(mouseArea); pressed(mouseArea);
} }
@@ -91,7 +90,6 @@ Model {
return; return;
released(mouseArea, calcRelativeDistance(mouseArea, scenePos)); released(mouseArea, calcRelativeDistance(mouseArea, scenePos));
dragging = false;
} }
MouseArea3D { MouseArea3D {

View File

@@ -33,7 +33,7 @@ Model {
property View3D view3D property View3D view3D
property alias color: material.emissiveColor property alias color: material.emissiveColor
property Node targetNode: null property Node targetNode: null
property bool dragging: false property bool dragging: mouseAreaMain.dragging
property bool active: false property bool active: false
property alias hovering: mouseAreaMain.hovering property alias hovering: mouseAreaMain.hovering
property alias priority: mouseAreaMain.priority property alias priority: mouseAreaMain.priority
@@ -80,7 +80,6 @@ Model {
_targetPosOnScreen = view3D.mapFrom3DScene(targetNode.scenePosition); _targetPosOnScreen = view3D.mapFrom3DScene(targetNode.scenePosition);
_targetPosOnScreen.z = 0; _targetPosOnScreen.z = 0;
_pointerPosPressed = Qt.vector3d(screenPos.x, screenPos.y, 0); _pointerPosPressed = Qt.vector3d(screenPos.x, screenPos.y, 0);
dragging = true;
_trackBall = angle < 0.1; _trackBall = angle < 0.1;
// Recreate vector so we don't follow the changes in targetNode.rotation // Recreate vector so we don't follow the changes in targetNode.rotation
@@ -108,7 +107,6 @@ Model {
applyLocalRotation(screenPos); applyLocalRotation(screenPos);
rotateCommit(); rotateCommit();
dragging = false;
currentAngle = 0; currentAngle = 0;
currentMousePos = screenPos; currentMousePos = screenPos;
} }

View File

@@ -123,6 +123,13 @@ void MouseArea3D::setGrabsMouse(bool grabsMouse)
return; return;
m_grabsMouse = grabsMouse; m_grabsMouse = grabsMouse;
if (!m_grabsMouse && s_mouseGrab == this) {
setDragging(false);
setHovering(false);
s_mouseGrab = nullptr;
}
emit grabsMouseChanged(); emit grabsMouseChanged();
} }
@@ -132,6 +139,13 @@ void MouseArea3D::setActive(bool active)
return; return;
m_active = active; m_active = active;
if (!m_active && s_mouseGrab == this) {
setDragging(false);
setHovering(false);
s_mouseGrab = nullptr;
}
emit activeChanged(); emit activeChanged();
} }