summaryrefslogtreecommitdiff
path: root/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp')
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp36
1 files changed, 30 insertions, 6 deletions
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp
index 71a67a9577..4c85557634 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp
@@ -83,6 +83,11 @@ QQuick3DNode *MouseArea3D::pickNode() const
return m_pickNode;
}
+MouseArea3D *MouseArea3D::dragHelper() const
+{
+ return m_dragHelper;
+}
+
qreal MouseArea3D::x() const
{
return m_x;
@@ -179,6 +184,15 @@ void MouseArea3D::setPickNode(QQuick3DNode *node)
emit pickNodeChanged();
}
+void MouseArea3D::setDragHelper(MouseArea3D *dragHelper)
+{
+ if (m_dragHelper == dragHelper)
+ return;
+
+ m_dragHelper = dragHelper;
+ emit dragHelperChanged();
+}
+
void MouseArea3D::setX(qreal x)
{
if (qFuzzyCompare(m_x, x))
@@ -433,19 +447,22 @@ void MouseArea3D::applyFreeRotation(QQuick3DNode *node, const QVector3D &startRo
node->rotate(degrees, finalAxis, QQuick3DNode::SceneSpace);
}
-QVector3D MouseArea3D::getMousePosInPlane(const QPointF &mousePosInView) const
+QVector3D MouseArea3D::getMousePosInPlane(const MouseArea3D *helper,
+ const QPointF &mousePosInView) const
{
+ if (!helper)
+ helper = this;
const QVector3D mousePos1(float(mousePosInView.x()), float(mousePosInView.y()), 0);
const QVector3D mousePos2(float(mousePosInView.x()), float(mousePosInView.y()), 1);
const QVector3D rayPos0 = m_view3D->mapTo3DScene(mousePos1);
const QVector3D rayPos1 = m_view3D->mapTo3DScene(mousePos2);
- const QVector3D globalPlanePosition = mapPositionToScene(QVector3D(0, 0, 0));
+ const QVector3D globalPlanePosition = helper->mapPositionToScene(QVector3D(0, 0, 0));
const QVector3D intersectGlobalPos = rayIntersectsPlane(rayPos0, rayPos1,
globalPlanePosition, forward());
if (qFuzzyCompare(intersectGlobalPos.z(), -1))
return intersectGlobalPos;
- return mapPositionFromScene(intersectGlobalPos);
+ return helper->mapPositionFromScene(intersectGlobalPos);
}
bool MouseArea3D::eventFilter(QObject *, QEvent *event)
@@ -505,7 +522,13 @@ bool MouseArea3D::eventFilter(QObject *, QEvent *event)
case QEvent::MouseButtonPress: {
auto const mouseEvent = static_cast<QMouseEvent *>(event);
if (mouseEvent->button() == Qt::LeftButton) {
- m_mousePosInPlane = getMousePosInPlane(mouseEvent->pos());
+ // Reset drag helper area to global transform of this area
+ if (m_dragHelper) {
+ m_dragHelper->setPosition(scenePosition());
+ m_dragHelper->setRotation(sceneRotation());
+ m_dragHelper->setScale(sceneScale());
+ }
+ m_mousePosInPlane = getMousePosInPlane(m_dragHelper, mouseEvent->pos());
if (mouseOnTopOfMouseArea(m_mousePosInPlane, mouseEvent->pos())) {
setDragging(true);
emit pressed(m_mousePosInPlane, mouseEvent->pos(), pickAngle);
@@ -527,7 +550,7 @@ bool MouseArea3D::eventFilter(QObject *, QEvent *event)
auto const mouseEvent = static_cast<QMouseEvent *>(event);
if (mouseEvent->button() == Qt::LeftButton) {
if (m_dragging) {
- QVector3D mousePosInPlane = getMousePosInPlane(mouseEvent->pos());
+ QVector3D mousePosInPlane = getMousePosInPlane(m_dragHelper, mouseEvent->pos());
if (qFuzzyCompare(mousePosInPlane.z(), -1))
mousePosInPlane = m_mousePosInPlane;
setDragging(false);
@@ -554,7 +577,8 @@ bool MouseArea3D::eventFilter(QObject *, QEvent *event)
case QEvent::MouseMove:
case QEvent::HoverMove: {
auto const mouseEvent = static_cast<QMouseEvent *>(event);
- const QVector3D mousePosInPlane = getMousePosInPlane(mouseEvent->pos());
+ const QVector3D mousePosInPlane = getMousePosInPlane(m_dragging ? m_dragHelper : this,
+ mouseEvent->pos());
const bool hasMouse = mouseOnTopOfMouseArea(mousePosInPlane, mouseEvent->pos());
setHovering(hasMouse);