diff --git a/src/Mod/TechDraw/App/DrawProjGroup.cpp b/src/Mod/TechDraw/App/DrawProjGroup.cpp index 9cc14cf9a4..865535e82a 100644 --- a/src/Mod/TechDraw/App/DrawProjGroup.cpp +++ b/src/Mod/TechDraw/App/DrawProjGroup.cpp @@ -85,7 +85,6 @@ DrawProjGroup::~DrawProjGroup() { } - void DrawProjGroup::onChanged(const App::Property* prop) { //TODO: For some reason, when the projection type is changed, the isometric views show change appropriately, but the orthographic ones don't... Or vice-versa. WF: why would you change from 1st to 3rd in mid drawing? @@ -136,7 +135,7 @@ void DrawProjGroup::onChanged(const App::Property* prop) } } - + TechDraw::DrawViewCollection::onChanged(prop); } diff --git a/src/Mod/TechDraw/App/DrawProjGroupItem.cpp b/src/Mod/TechDraw/App/DrawProjGroupItem.cpp index a90bb1c43b..c785739371 100644 --- a/src/Mod/TechDraw/App/DrawProjGroupItem.cpp +++ b/src/Mod/TechDraw/App/DrawProjGroupItem.cpp @@ -29,8 +29,10 @@ #include #include #include + +#include +#include #include -#include #include "GeometryObject.h" #include "DrawUtil.h" @@ -72,6 +74,10 @@ DrawProjGroupItem::DrawProjGroupItem(void) ScaleType.setStatus(App::Property::ReadOnly,true); } +DrawProjGroupItem::~DrawProjGroupItem() +{ +} + short DrawProjGroupItem::mustExecute() const { short result = 0; @@ -91,11 +97,16 @@ short DrawProjGroupItem::mustExecute() const void DrawProjGroupItem::onChanged(const App::Property *prop) { TechDraw::DrawViewPart::onChanged(prop); - } -DrawProjGroupItem::~DrawProjGroupItem() +bool DrawProjGroupItem::isLocked(void) const { + bool isLocked = DrawView::isLocked(); + DrawProjGroup* parent = getPGroup(); + if (parent != nullptr) { + isLocked = isLocked || parent->LockPosition.getValue(); + } + return isLocked; } App::DocumentObjectExecReturn *DrawProjGroupItem::execute(void) @@ -234,7 +245,6 @@ double DrawProjGroupItem::getScale(void) const return result; } - void DrawProjGroupItem::unsetupObject() { if (getPGroup() != nullptr) { diff --git a/src/Mod/TechDraw/App/DrawProjGroupItem.h b/src/Mod/TechDraw/App/DrawProjGroupItem.h index c7a19ac8e5..38c30e7624 100644 --- a/src/Mod/TechDraw/App/DrawProjGroupItem.h +++ b/src/Mod/TechDraw/App/DrawProjGroupItem.h @@ -83,6 +83,7 @@ public: protected: void onChanged(const App::Property* prop) override; + virtual bool isLocked(void) const override; private: static const char* TypeEnums[]; diff --git a/src/Mod/TechDraw/App/DrawView.cpp b/src/Mod/TechDraw/App/DrawView.cpp index 4ba7ce9870..ff1c951892 100644 --- a/src/Mod/TechDraw/App/DrawView.cpp +++ b/src/Mod/TechDraw/App/DrawView.cpp @@ -72,10 +72,9 @@ DrawView::DrawView(void): mouseMove(false) { static const char *group = "Base"; - - ADD_PROPERTY_TYPE(X ,(0),group,App::Prop_None,"X position of the view on the page in modelling units (mm)"); - ADD_PROPERTY_TYPE(Y ,(0),group,App::Prop_None,"Y position of the view on the page in modelling units (mm)"); - ADD_PROPERTY_TYPE(LockPosition ,(false),group,App::Prop_None,"Prevent View from moving in Gui"); + ADD_PROPERTY_TYPE(X ,(0),group,App::Prop_None,"X position of the view on the page in internal units (mm)"); + ADD_PROPERTY_TYPE(Y ,(0),group,App::Prop_None,"Y position of the view on the page in internal units (mm)"); + ADD_PROPERTY_TYPE(LockPosition ,(false),group,App::Prop_None,"Lock View position to parent Page or Group"); ADD_PROPERTY_TYPE(Rotation ,(0),group,App::Prop_None,"Rotation of the view on the page in degrees counterclockwise"); ScaleType.setEnums(ScaleTypeEnums); @@ -92,8 +91,9 @@ DrawView::~DrawView() App::DocumentObjectExecReturn *DrawView::execute(void) { + handleXYLock(); requestPaint(); - return App::DocumentObject::StdReturn; //DO::execute returns 0 + return App::DocumentObject::execute(); } void DrawView::checkScale(void) @@ -139,19 +139,54 @@ void DrawView::onChanged(const App::Property* prop) } } } + } else if (prop == &LockPosition) { + handleXYLock(); } } App::DocumentObject::onChanged(prop); } +bool DrawView::isLocked(void) const +{ + return LockPosition.getValue(); +} + +//override this for View inside a group (ex DPGI in DPG) +void DrawView::handleXYLock(void) +{ + if (isLocked()) { + if (!X.testStatus(App::Property::ReadOnly)) { + X.setStatus(App::Property::ReadOnly,true); + App::GetApplication().signalChangePropertyEditor(X); + X.purgeTouched(); + } + Y.setStatus(App::Property::ReadOnly,true); + App::GetApplication().signalChangePropertyEditor(Y); + Y.purgeTouched(); + requestPaint(); + } else { + if (X.testStatus(App::Property::ReadOnly)) { + X.setStatus(App::Property::ReadOnly,false); + App::GetApplication().signalChangePropertyEditor(X); + X.purgeTouched(); + } + Y.setStatus(App::Property::ReadOnly,false); + App::GetApplication().signalChangePropertyEditor(Y); + Y.purgeTouched(); + requestPaint(); + } +} + short DrawView::mustExecute() const { short result = 0; if (!isRestoring()) { result = (Scale.isTouched() || - ScaleType.isTouched() || - X.isTouched() || - Y.isTouched() ); + ScaleType.isTouched() ); + if (!isLocked()) { + result = result || X.isTouched() || + Y.isTouched() ; + } } if ((bool) result) { return result; @@ -168,6 +203,7 @@ QRectF DrawView::getRect() const void DrawView::onDocumentRestored() { + handleXYLock(); DrawView::execute(); } @@ -251,8 +287,10 @@ bool DrawView::checkFit(TechDraw::DrawPage* p) const void DrawView::setPosition(double x, double y) { - X.setValue(x); - Y.setValue(y); + if (!isLocked()) { + X.setValue(x); + Y.setValue(y); + } } //TODO: getScale is no longer needed and could revert to Scale.getValue diff --git a/src/Mod/TechDraw/App/DrawView.h b/src/Mod/TechDraw/App/DrawView.h index c615984298..e69030bed1 100644 --- a/src/Mod/TechDraw/App/DrawView.h +++ b/src/Mod/TechDraw/App/DrawView.h @@ -87,9 +87,11 @@ public: virtual double getScale(void) const; void checkScale(void); void requestPaint(void); + virtual void handleXYLock(void); + virtual bool isLocked(void) const; protected: - void onChanged(const App::Property* prop) override; + virtual void onChanged(const App::Property* prop) override; std::string pageFeatName; bool autoPos; bool mouseMove; diff --git a/src/Mod/TechDraw/App/DrawViewCollection.cpp b/src/Mod/TechDraw/App/DrawViewCollection.cpp index b15334b059..0dcedd2f75 100644 --- a/src/Mod/TechDraw/App/DrawViewCollection.cpp +++ b/src/Mod/TechDraw/App/DrawViewCollection.cpp @@ -27,6 +27,7 @@ #endif #include +#include #include #include @@ -45,8 +46,8 @@ PROPERTY_SOURCE(TechDraw::DrawViewCollection, TechDraw::DrawView) DrawViewCollection::DrawViewCollection() { nowUnsetting = false; - static const char *group = "Drawing view"; - ADD_PROPERTY_TYPE(Views ,(0), group, App::Prop_None,"Attached Views"); + static const char *group = "Collection"; + ADD_PROPERTY_TYPE(Views ,(0), group, App::Prop_None,"Collection Views"); Views.setScope(App::LinkScope::Global); } @@ -54,6 +55,31 @@ DrawViewCollection::~DrawViewCollection() { } +void DrawViewCollection::onChanged(const App::Property* prop) +{ + TechDraw::DrawView::onChanged(prop); +} + +short DrawViewCollection::mustExecute() const +{ + if (Views.isTouched()) { + return 1; + } else { + return TechDraw::DrawView::mustExecute(); + } +} + +App::DocumentObjectExecReturn *DrawViewCollection::execute(void) +{ + if (!keepUpdated()) { + return App::DocumentObject::StdReturn; + } + + lockChildren(); + + return DrawView::execute(); +} + int DrawViewCollection::addView(DrawView *view) { // Add the new view to the collection @@ -106,15 +132,6 @@ void DrawViewCollection::rebuildViewList() Views.setValues(newViews); } -short DrawViewCollection::mustExecute() const -{ - if (Views.isTouched()) { - return 1; - } else { - return TechDraw::DrawView::mustExecute(); - } -} - int DrawViewCollection::countChildren() { //Count the children recursively if needed @@ -138,9 +155,15 @@ void DrawViewCollection::onDocumentRestored() DrawView::execute(); } -void DrawViewCollection::onChanged(const App::Property* prop) +void DrawViewCollection::lockChildren(void) { - TechDraw::DrawView::onChanged(prop); + for (auto& v:Views.getValues()) { + TechDraw::DrawView *view = dynamic_cast(v); + if (!view) { + throw Base::ValueError("DrawViewCollection::lockChildren bad View\n"); + } + view->handleXYLock(); + } } void DrawViewCollection::unsetupObject() @@ -162,17 +185,6 @@ void DrawViewCollection::unsetupObject() Views.setValues(emptyViews); } - -App::DocumentObjectExecReturn *DrawViewCollection::execute(void) -{ - if (!keepUpdated()) { - return App::DocumentObject::StdReturn; - } - - return DrawView::execute(); -} - - QRectF DrawViewCollection::getRect() const { QRectF result; diff --git a/src/Mod/TechDraw/App/DrawViewCollection.h b/src/Mod/TechDraw/App/DrawViewCollection.h index 654a1142ca..6cb6cb53e7 100644 --- a/src/Mod/TechDraw/App/DrawViewCollection.h +++ b/src/Mod/TechDraw/App/DrawViewCollection.h @@ -52,6 +52,7 @@ public: bool isUnsetting(void) { return nowUnsetting; } int countChildren(); + void lockChildren(void); virtual void onDocumentRestored(); virtual App::DocumentObjectExecReturn *execute(void);