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;