diff --git a/sources/editor/graphicspart/customelementgraphicpart.cpp b/sources/editor/graphicspart/customelementgraphicpart.cpp index f4142943a..4c4200dac 100644 --- a/sources/editor/graphicspart/customelementgraphicpart.cpp +++ b/sources/editor/graphicspart/customelementgraphicpart.cpp @@ -20,6 +20,7 @@ #include "../../QPropertyUndoCommand/qpropertyundocommand.h" #include "../elementscene.h" +#include #include /** @@ -39,7 +40,8 @@ CustomElementGraphicPart::CustomElementGraphicPart(QETElementEditor *editor, _lineweight(NormalWeight), _filling(NoneFilling), _color(BlackColor), - _antialiased(false) + _antialiased(false), + m_first_move (false) { setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable @@ -1332,26 +1334,24 @@ void CustomElementGraphicPart::mousePressEvent(QGraphicsSceneMouseEvent *event) void CustomElementGraphicPart::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { - //m_first_move is used to avoid an unwanted behavior - //when the properties dock widget is displayed : - //1 there is no selection - //2 the dock widget width is set to minimum - //3 select a part, the dock widget gain new widgets used to edit - //the current selected part and the width of the dock grow - //so the width of the QGraphicsView is reduced and cause a mouse move event. - //When this case occur the part is moved but they should not. This bool fix it. - if (Q_UNLIKELY(m_first_move)) { + if (m_first_move) { + // Suppress spurious move events fired when the properties dock + // widget expands on first selection of a new item type, causing + // the QGraphicsView to shrink and re-map coordinates. Screen + // coordinates are stable across viewport changes; scene coords + // are not — so use screenPos() for the threshold check. + const QPointF d = event->screenPos() - event->buttonDownScreenPos(Qt::LeftButton); + if (d.manhattanLength() < QApplication::startDragDistance()) + return; m_first_move = false; - return; } - if((event->buttons() & Qt::LeftButton) && (flags() & QGraphicsItem::ItemIsMovable)) - { + if ((event->buttons() & Qt::LeftButton) && (flags() & QGraphicsItem::ItemIsMovable)) { QPointF pos = event->scenePos() + (m_origin_pos - event->buttonDownScenePos(Qt::LeftButton)); event->modifiers() == Qt::ControlModifier ? setPos(pos) : setPos(elementScene()->snapToGrid(pos)); - } - else + } else { QGraphicsObject::mouseMoveEvent(event); + } } void CustomElementGraphicPart::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) diff --git a/sources/editor/graphicspart/partdynamictextfield.cpp b/sources/editor/graphicspart/partdynamictextfield.cpp index dc0c4d576..ee9b0c647 100644 --- a/sources/editor/graphicspart/partdynamictextfield.cpp +++ b/sources/editor/graphicspart/partdynamictextfield.cpp @@ -20,6 +20,7 @@ #include "../../QPropertyUndoCommand/qpropertyundocommand.h" #include "../../qetapp.h" #include "../elementscene.h" +#include #include #include @@ -495,12 +496,16 @@ bool PartDynamicTextField::keepVisualRotation() const { @param event */ void PartDynamicTextField::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { - if((event -> buttons() & Qt::LeftButton) && (flags() & QGraphicsItem::ItemIsMovable)) { - QPointF pos = event -> scenePos() + (m_origin_pos - event -> buttonDownScenePos(Qt::LeftButton)); - event -> modifiers() == Qt::ControlModifier ? setPos(pos) : setPos(elementScene() -> snapToGrid(pos)); - } - else + if ((event->buttons() & Qt::LeftButton) && (flags() & QGraphicsItem::ItemIsMovable)) { + // Suppress spurious moves from the properties dock resizing the viewport. + const QPointF d = event->screenPos() - event->buttonDownScreenPos(Qt::LeftButton); + if (d.manhattanLength() < QApplication::startDragDistance()) + return; + QPointF pos = event->scenePos() + (m_origin_pos - event->buttonDownScenePos(Qt::LeftButton)); + event->modifiers() == Qt::ControlModifier ? setPos(pos) : setPos(elementScene()->snapToGrid(pos)); + } else { QGraphicsObject::mouseMoveEvent(event); + } } /** diff --git a/sources/editor/graphicspart/parttext.cpp b/sources/editor/graphicspart/parttext.cpp index 4b2134443..fb151fc9e 100644 --- a/sources/editor/graphicspart/parttext.cpp +++ b/sources/editor/graphicspart/parttext.cpp @@ -18,6 +18,7 @@ #include "parttext.h" #include "../../QPropertyUndoCommand/qpropertyundocommand.h" +#include #include "../../qetapp.h" #include "../elementprimitivedecorator.h" #include "../elementscene.h" @@ -324,11 +325,14 @@ void PartText::setFont(const QFont &font) { } void PartText::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { - if((event -> buttons() & Qt::LeftButton) && (flags() & QGraphicsItem::ItemIsMovable)) { - QPointF pos = event -> scenePos() + (m_origin_pos - event -> buttonDownScenePos(Qt::LeftButton)); - event -> modifiers() == Qt::ControlModifier ? setPos(pos) : setPos(elementScene() -> snapToGrid(pos)); - } - else { + if ((event->buttons() & Qt::LeftButton) && (flags() & QGraphicsItem::ItemIsMovable)) { + // Suppress spurious moves from the properties dock resizing the viewport. + const QPointF d = event->screenPos() - event->buttonDownScreenPos(Qt::LeftButton); + if (d.manhattanLength() < QApplication::startDragDistance()) + return; + QPointF pos = event->scenePos() + (m_origin_pos - event->buttonDownScenePos(Qt::LeftButton)); + event->modifiers() == Qt::ControlModifier ? setPos(pos) : setPos(elementScene()->snapToGrid(pos)); + } else { QGraphicsObject::mouseMoveEvent(event); } }