diff --git a/src/Mod/TechDraw/App/DrawProjGroupItem.cpp b/src/Mod/TechDraw/App/DrawProjGroupItem.cpp index c26a769864..fd9de502d1 100644 --- a/src/Mod/TechDraw/App/DrawProjGroupItem.cpp +++ b/src/Mod/TechDraw/App/DrawProjGroupItem.cpp @@ -98,6 +98,13 @@ short DrawProjGroupItem::mustExecute() const void DrawProjGroupItem::onChanged(const App::Property *prop) { + if ((prop == &X) || + (prop == &Y)) { + DrawProjGroup* parent = getPGroup(); + if (parent != nullptr) { + parent->touch(false); + } + } TechDraw::DrawViewPart::onChanged(prop); } diff --git a/src/Mod/TechDraw/App/DrawView.cpp b/src/Mod/TechDraw/App/DrawView.cpp index 47c4887586..150fca9219 100644 --- a/src/Mod/TechDraw/App/DrawView.cpp +++ b/src/Mod/TechDraw/App/DrawView.cpp @@ -77,8 +77,8 @@ DrawView::DrawView(void): mouseMove(false) { static const char *group = "Base"; - ADD_PROPERTY_TYPE(X, (0.0), group, (App::PropertyType)(App::Prop_None), "X position"); - ADD_PROPERTY_TYPE(Y, (0.0), group, (App::PropertyType)(App::Prop_None), "Y position"); + ADD_PROPERTY_TYPE(X, (0.0), group, (App::PropertyType)(App::Prop_None | App::Prop_NoRecompute), "X position"); + ADD_PROPERTY_TYPE(Y, (0.0), group, (App::PropertyType)(App::Prop_None | App::Prop_NoRecompute), "Y position"); ADD_PROPERTY_TYPE(LockPosition, (false), group, App::Prop_Output, "Lock View position to parent Page or Group"); ADD_PROPERTY_TYPE(Rotation, (0.0), group, App::Prop_Output, "Rotation in degrees counterclockwise"); @@ -159,6 +159,7 @@ void DrawView::onChanged(const App::Property* prop) requestPaint(); } else if ((prop == &X) || (prop == &Y)) { +// Base::Console().Message("DV::onChanged(X or Y)\n"); DrawView::execute(); X.purgeTouched(); Y.purgeTouched(); diff --git a/src/Mod/TechDraw/Gui/QGIView.cpp b/src/Mod/TechDraw/Gui/QGIView.cpp index 48d557f61c..49d6fb3112 100644 --- a/src/Mod/TechDraw/Gui/QGIView.cpp +++ b/src/Mod/TechDraw/Gui/QGIView.cpp @@ -81,13 +81,18 @@ using namespace TechDrawGui; using namespace TechDraw; +#define NODRAG 0 +#define DRAGSTARTED 1 +#define DRAGGING 2 + const float labelCaptionFudge = 0.2f; // temp fiddle for devel QGIView::QGIView() :QGraphicsItemGroup(), viewObj(nullptr), m_locked(false), - m_innerView(false) + m_innerView(false), + m_dragState(NODRAG) { setCacheMode(QGraphicsItem::NoCache); setHandlesChildEvents(false); @@ -200,22 +205,6 @@ QVariant QGIView::itemChange(GraphicsItemChange change, const QVariant &value) newPos.setX(item->pos().x()); } else if(alignMode == QString::fromLatin1("Horizontal")) { newPos.setY(item->pos().y()); - } else if(alignMode == QString::fromLatin1("45slash")) { - //this logic is wrong since the constrained movement direction is not necessarily 45* -// Base::Console().Message("QGIV::itemChange - oblique BL-TR\n"); -// double dist = ( (newPos.x() - item->pos().x()) + -// (item->pos().y() - newPos.y()) ) / 2.0; - -// newPos.setX( item->pos().x() + dist); -// newPos.setY( item->pos().y() - dist ); - } else if(alignMode == QString::fromLatin1("45backslash")) { - //this logic is wrong since the constrained movement direction is not necessarily 45* -// Base::Console().Message("QGIV::itemChange - oblique TL-BR\n"); -// double dist = ( (newPos.x() - item->pos().x()) + -// (newPos.y() - item->pos().y()) ) / 2.0; - -// newPos.setX( item->pos().x() + dist); -// newPos.setY( item->pos().y() + dist ); } } } @@ -244,30 +233,39 @@ void QGIView::mousePressEvent(QGraphicsSceneMouseEvent * event) { // Base::Console().Message("QGIV::mousePressEvent() - %s\n",getViewName()); signalSelectPoint(this, event->pos()); + if (m_dragState == NODRAG) { + m_dragState = DRAGSTARTED; + } QGraphicsItem::mousePressEvent(event); } -//void QGIView::mouseMoveEvent(QGraphicsSceneMouseEvent * event) -//{ -// QGraphicsItem::mouseMoveEvent(event); -//} +void QGIView::mouseMoveEvent(QGraphicsSceneMouseEvent * event) +{ + if (m_dragState == DRAGSTARTED) { + m_dragState = DRAGGING; + } + QGraphicsItem::mouseMoveEvent(event); +} void QGIView::mouseReleaseEvent(QGraphicsSceneMouseEvent * event) { //TODO: this should be done in itemChange - item position has changed - //TODO: and should check for dragging // Base::Console().Message("QGIV::mouseReleaseEvent() - %s\n",getViewName()); // if(scene() && this == scene()->mouseGrabberItem()) { - if(!m_locked) { - if (!isInnerView()) { - double tempX = x(), - tempY = getY(); - getViewObject()->setPosition(Rez::appX(tempX),Rez::appX(tempY)); - } else { - getViewObject()->setPosition(Rez::appX(x()),Rez::appX(getYInClip(y()))); + if (m_dragState == DRAGGING) { + if(!m_locked) { + if (!isInnerView()) { + double tempX = x(), + tempY = getY(); + getViewObject()->setPosition(Rez::appX(tempX),Rez::appX(tempY)); + } else { + getViewObject()->setPosition(Rez::appX(x()),Rez::appX(getYInClip(y()))); + } } } + m_dragState = NODRAG; + QGraphicsItem::mouseReleaseEvent(event); } diff --git a/src/Mod/TechDraw/Gui/QGIView.h b/src/Mod/TechDraw/Gui/QGIView.h index 1119fa7fb5..7595d1c795 100644 --- a/src/Mod/TechDraw/Gui/QGIView.h +++ b/src/Mod/TechDraw/Gui/QGIView.h @@ -23,6 +23,8 @@ #ifndef DRAWINGGUI_QGRAPHICSITEMVIEW_H #define DRAWINGGUI_QGRAPHICSITEMVIEW_H +#include + #include #include #include @@ -154,7 +156,7 @@ protected: virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value) override; // Mouse handling -/* virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override;*/ + virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; // Preselection events: virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event) override; virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event) override; @@ -191,8 +193,8 @@ protected: QPen m_decorPen; double m_lockWidth; double m_lockHeight; + int m_dragState; -// std::vector m_randomItems; }; } // namespace