From fea338c00040099b86bb26059330b18144b3a3fd Mon Sep 17 00:00:00 2001 From: Knud Dollereder Date: Wed, 3 Aug 2022 13:19:05 +0200 Subject: [PATCH] Move keyframes horizontally when shift is pressed It is now possible to move keyframes in the curve editor in the x direction only by pressing shift while dragging. Fixes: QDS-6952 Change-Id: Ic1a25ec6d8dec82cf5599dccbaeff7e5f34d2936 Reviewed-by: Reviewed-by: Thomas Hartmann --- .../curveeditor/detail/keyframeitem.cpp | 27 ++++++++++++++++--- .../curveeditor/detail/keyframeitem.h | 5 +++- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/plugins/qmldesigner/components/curveeditor/detail/keyframeitem.cpp b/src/plugins/qmldesigner/components/curveeditor/detail/keyframeitem.cpp index 49e76a09687..0dbb2d125f0 100644 --- a/src/plugins/qmldesigner/components/curveeditor/detail/keyframeitem.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/detail/keyframeitem.cpp @@ -27,7 +27,10 @@ #include "curveitem.h" #include "handleitem.h" +#include #include +#include +#include #include @@ -453,10 +456,22 @@ QVariant KeyframeItem::itemChange(QGraphicsItem::GraphicsItemChange change, cons lseg.moveRightTo(position); rseg.moveLeftTo(position); - if (legalLeft() && legalRight()) - m_validPos = position; + if (legalLeft() && legalRight()) { + if (qApp->keyboardModifiers().testFlag(Qt::ShiftModifier) && m_validPos.has_value()) { + if (m_firstPos) { + auto firstToNow = QLineF(*m_firstPos, position); + if (std::abs(firstToNow.dx()) > std::abs(firstToNow.dy())) + m_validPos = QPointF(position.x(), m_firstPos->y()); + else + m_validPos = QPointF(m_firstPos->x(), position.y()); + } - return QVariant(m_transform.map(m_validPos)); + } else { + m_validPos = position; + } + } + + return QVariant(m_transform.map(*m_validPos)); } } } @@ -466,6 +481,11 @@ QVariant KeyframeItem::itemChange(QGraphicsItem::GraphicsItemChange change, cons void KeyframeItem::mousePressEvent(QGraphicsSceneMouseEvent *event) { + bool ok; + m_firstPos = m_transform.inverted(&ok).map(event->scenePos()); + if (!ok) + m_firstPos = Utils::nullopt; + SelectableItem::mousePressEvent(event); if (auto *curveItem = qgraphicsitem_cast(parentItem())) curveItem->setHandleVisibility(false); @@ -473,6 +493,7 @@ void KeyframeItem::mousePressEvent(QGraphicsSceneMouseEvent *event) void KeyframeItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { + m_firstPos = Utils::nullopt; SelectableItem::mouseReleaseEvent(event); if (auto *curveItem = qgraphicsitem_cast(parentItem())) curveItem->setHandleVisibility(true); diff --git a/src/plugins/qmldesigner/components/curveeditor/detail/keyframeitem.h b/src/plugins/qmldesigner/components/curveeditor/detail/keyframeitem.h index 14c3ae74266..c7bfa02cd18 100644 --- a/src/plugins/qmldesigner/components/curveeditor/detail/keyframeitem.h +++ b/src/plugins/qmldesigner/components/curveeditor/detail/keyframeitem.h @@ -30,6 +30,8 @@ #include "keyframe.h" #include "selectableitem.h" +#include + #include namespace QmlDesigner { @@ -133,7 +135,8 @@ private: HandleItem *m_right; - QPointF m_validPos; + Utils::optional< QPointF > m_firstPos; + Utils::optional< QPointF > m_validPos; bool m_visibleOverride = true;