From ddbbae99560a9794b48f618fc1dd38f1bcb8993a Mon Sep 17 00:00:00 2001 From: WandererFan Date: Thu, 20 Jul 2017 18:29:56 -0400 Subject: [PATCH] Allow DrawPage updates to be suspended --- src/Mod/TechDraw/App/DrawPage.cpp | 62 +- src/Mod/TechDraw/App/DrawPage.h | 1 + src/Mod/TechDraw/App/DrawProjGroup.cpp | 4 + src/Mod/TechDraw/App/DrawSVGTemplate.cpp | 18 +- src/Mod/TechDraw/App/DrawTemplate.cpp | 2 +- src/Mod/TechDraw/App/DrawView.cpp | 18 +- src/Mod/TechDraw/App/DrawView.h | 5 + src/Mod/TechDraw/App/DrawViewArch.cpp | 4 + src/Mod/TechDraw/App/DrawViewClip.cpp | 4 + src/Mod/TechDraw/App/DrawViewCollection.cpp | 4 + src/Mod/TechDraw/App/DrawViewDetail.cpp | 4 + src/Mod/TechDraw/App/DrawViewDimension.cpp | 4 + src/Mod/TechDraw/App/DrawViewDraft.cpp | 4 + src/Mod/TechDraw/App/DrawViewMulti.cpp | 4 + src/Mod/TechDraw/App/DrawViewPart.cpp | 5 +- src/Mod/TechDraw/App/DrawViewSection.cpp | 4 + src/Mod/TechDraw/App/DrawViewSymbol.cpp | 4 + src/Mod/TechDraw/Gui/DlgPrefsTechDraw.ui | 18 +- src/Mod/TechDraw/Gui/QGIViewPart.cpp | 1 - src/Mod/TechDraw/Gui/Resources/TechDraw.qrc | 1 + .../icons/TechDraw_Tree_Page_Unsync.svg | 664 ++++++++++++++++++ .../TechDraw/Gui/ViewProviderAnnotation.cpp | 3 +- .../TechDraw/Gui/ViewProviderDrawingView.cpp | 38 +- .../TechDraw/Gui/ViewProviderDrawingView.h | 9 + src/Mod/TechDraw/Gui/ViewProviderPage.cpp | 22 +- src/Mod/TechDraw/Gui/ViewProviderPage.h | 1 + src/Mod/TechDraw/Gui/ViewProviderTemplate.cpp | 2 +- src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp | 3 +- 28 files changed, 844 insertions(+), 69 deletions(-) create mode 100644 src/Mod/TechDraw/Gui/Resources/icons/TechDraw_Tree_Page_Unsync.svg diff --git a/src/Mod/TechDraw/App/DrawPage.cpp b/src/Mod/TechDraw/App/DrawPage.cpp index 360fa1f27a..79a52bf5ed 100644 --- a/src/Mod/TechDraw/App/DrawPage.cpp +++ b/src/Mod/TechDraw/App/DrawPage.cpp @@ -74,15 +74,19 @@ DrawPage::DrawPage(void) { static const char *group = "Page"; nowDeleting = false; + + Base::Reference hGrp = App::GetApplication().GetUserParameter() + .GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod/TechDraw/General"); + bool autoUpdate = hGrp->GetBool("KeepPagesUpToDate", 1l); + ADD_PROPERTY_TYPE(KeepUpdated, (autoUpdate), group, (App::PropertyType)(App::Prop_None), "Keep page in sync with model"); ADD_PROPERTY_TYPE(Template, (0), group, (App::PropertyType)(App::Prop_None), "Attached Template"); ADD_PROPERTY_TYPE(Views, (0), group, (App::PropertyType)(App::Prop_None), "Attached Views"); // Projection Properties ProjectionType.setEnums(ProjectionTypeEnums); - Base::Reference hGrp = - App::GetApplication().GetUserParameter().GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod/TechDraw/General"); + hGrp = App::GetApplication().GetUserParameter().GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod/TechDraw/General"); // In preferences, 0 -> First Angle 1 -> Third Angle int projType = hGrp->GetInt("ProjectionAngle", -1); @@ -108,24 +112,29 @@ void DrawPage::onBeforeChange(const App::Property* prop) void DrawPage::onChanged(const App::Property* prop) { - if (prop == &Template) { + if ((prop == &KeepUpdated) && + KeepUpdated.getValue()) { if (!isRestoring() && !isDeleting()) { - //TODO: reload if Template prop changes (ie different Template) + auto views(Views.getValues()); + for (auto& v: views) { + v->touch(); //get all views up to date + } } - } else if (prop == &Views) { + } else if (prop == &Template) { if (!isRestoring() && - !isDeleting() ) { - //TODO: reload if Views prop changes (ie adds/deletes) + !isDeleting()) { + Template.getValue()->touch(); } } else if(prop == &Scale) { // touch all views in the Page as they may be dependent on this scale - const std::vector &vals = Views.getValues(); - for(std::vector::const_iterator it = vals.begin(); it < vals.end(); ++it) { - TechDraw::DrawView *view = dynamic_cast(*it); - if (view != NULL && view->ScaleType.isValue("Page")) { - view->Scale.touch(); - } + // but the views know how to get their own Scale correctly. + const std::vector &vals = Views.getValues(); + for(std::vector::const_iterator it = vals.begin(); it < vals.end(); ++it) { + TechDraw::DrawView *view = dynamic_cast(*it); + if (view != NULL && view->ScaleType.isValue("Page")) { + view->Scale.touch(); + } } } else if (prop == &ProjectionType) { // touch all ortho views in the Page as they may be dependent on Projection Type @@ -140,37 +149,18 @@ void DrawPage::onChanged(const App::Property* prop) // TODO: Also update Template graphic. } - App::DocumentObject::onChanged(prop); //<<<< + App::DocumentObject::onChanged(prop); } +//Page is just a container. It doesn't "do" anything. App::DocumentObjectExecReturn *DrawPage::execute(void) { - //Page is just a property storage area? no real logic involved? - //all this does is trigger onChanged in this and ViewProviderPage - Template.touch(); - Views.touch(); return App::DocumentObject::StdReturn; } +// this is now irrelevant, b/c DP::execute doesn't do anything. short DrawPage::mustExecute() const { - if(Scale.isTouched()) - return 1; - - // Check the value of template if this has been modified - App::DocumentObject* tmpl = Template.getValue(); - if(tmpl && tmpl->isTouched()) - return 1; - - // Check if within this Page, any Views have been touched - // Why does Page have to execute if a View changes? - const std::vector &vals = Views.getValues(); - for(std::vector::const_iterator it = vals.begin(); it < vals.end(); ++it) { - if((*it)->isTouched()) { - return 1; - } - } - return App::DocumentObject::mustExecute(); } @@ -248,6 +238,8 @@ int DrawPage::addView(App::DocumentObject *docObj) if(!docObj->isDerivedFrom(TechDraw::DrawView::getClassTypeId())) return -1; DrawView* view = static_cast(docObj); +//TODO: replace list of views with PropertyLink to Page in subordinate DrawView +// view->Page.setValue(this); //position all new views in center of Page (exceptDVDimension) if (!docObj->isDerivedFrom(TechDraw::DrawViewDimension::getClassTypeId())) { diff --git a/src/Mod/TechDraw/App/DrawPage.h b/src/Mod/TechDraw/App/DrawPage.h index 002da38eec..51d47b1df8 100644 --- a/src/Mod/TechDraw/App/DrawPage.h +++ b/src/Mod/TechDraw/App/DrawPage.h @@ -42,6 +42,7 @@ public: App::PropertyLinkList Views; App::PropertyLink Template; + App::PropertyBool KeepUpdated; App::PropertyFloatConstraint Scale; App::PropertyEnumeration ProjectionType; // First or Third Angle diff --git a/src/Mod/TechDraw/App/DrawProjGroup.cpp b/src/Mod/TechDraw/App/DrawProjGroup.cpp index 1f5e51b812..5739a3dd2d 100644 --- a/src/Mod/TechDraw/App/DrawProjGroup.cpp +++ b/src/Mod/TechDraw/App/DrawProjGroup.cpp @@ -144,6 +144,10 @@ void DrawProjGroup::setCubeFromProps(void) } App::DocumentObjectExecReturn *DrawProjGroup::execute(void) { + if (!keepUpdated()) { + return App::DocumentObject::StdReturn; + } + //if group hasn't been added to page yet, can't scale or distribute projItems TechDraw::DrawPage *page = getPage(); if (!page) { diff --git a/src/Mod/TechDraw/App/DrawSVGTemplate.cpp b/src/Mod/TechDraw/App/DrawSVGTemplate.cpp index 75ad473c30..6dedb3df94 100644 --- a/src/Mod/TechDraw/App/DrawSVGTemplate.cpp +++ b/src/Mod/TechDraw/App/DrawSVGTemplate.cpp @@ -57,14 +57,14 @@ PROPERTY_SOURCE(TechDraw::DrawSVGTemplate, TechDraw::DrawTemplate) DrawSVGTemplate::DrawSVGTemplate() { - static const char *group = "Drawing view"; + static const char *group = "Template"; //TODO: Do we need PageResult anymore? -wf Yes! // PageResult points to a temporary file in tmp/FreeCAD-AB-CD-EF-.../myTemplate.svg // which is really copy of original Template with EditableFields replaced // When restoring saved document, Template is redundant/incorrect/not present - PageResult is the correct info. -wf- - ADD_PROPERTY_TYPE(PageResult, (0), group, App::Prop_Output, "Resulting SVG document of that page"); - ADD_PROPERTY_TYPE(Template, (""), group, App::Prop_Transient, "Template for the page"); + ADD_PROPERTY_TYPE(PageResult, (0), group, App::Prop_Output, "Current SVG code for template"); + ADD_PROPERTY_TYPE(Template, (""), group, App::Prop_Transient, "Template for the page"); //sb TemplateFileName??? // Width and Height properties shouldn't be set by the user Height.setStatus(App::Property::ReadOnly,true); @@ -105,7 +105,7 @@ void DrawSVGTemplate::onChanged(const App::Property* prop) //original template has been stored in fcstd file Template.setValue(PageResult.getValue()); } - } else if (prop == &Template) { + } else if (prop == &Template) { //fileName has changed if (!isRestoring()) { EditableTexts.setValues(getEditableTextsFromTemplate()); updatePage = true; @@ -118,11 +118,6 @@ void DrawSVGTemplate::onChanged(const App::Property* prop) if (updatePage) { execute(); - - // Update the parent page if exists - TechDraw::DrawPage *page = getParentPage(); - if (page) - page->touch(); } TechDraw::DrawTemplate::onChanged(prop); @@ -253,11 +248,6 @@ App::DocumentObjectExecReturn * DrawSVGTemplate::execute(void) Orientation.setValue(isLandscape ? 1 : 0); - // Housekeeping close the file - //resultFile.close(); - - touch(); - return TechDraw::DrawTemplate::execute(); } diff --git a/src/Mod/TechDraw/App/DrawTemplate.cpp b/src/Mod/TechDraw/App/DrawTemplate.cpp index ec0c62ec43..89db103663 100644 --- a/src/Mod/TechDraw/App/DrawTemplate.cpp +++ b/src/Mod/TechDraw/App/DrawTemplate.cpp @@ -120,7 +120,7 @@ App::DocumentObjectExecReturn *DrawTemplate::execute(void) } if(page) { - page->Template.touch(); + page->Template.touch(); //if you are on a page, execute yourself??? } return App::DocumentObject::execute(); diff --git a/src/Mod/TechDraw/App/DrawView.cpp b/src/Mod/TechDraw/App/DrawView.cpp index 2b336ec16a..4260d981ab 100644 --- a/src/Mod/TechDraw/App/DrawView.cpp +++ b/src/Mod/TechDraw/App/DrawView.cpp @@ -95,7 +95,8 @@ DrawView::~DrawView() App::DocumentObjectExecReturn *DrawView::execute(void) { TechDraw::DrawPage *page = findParentPage(); - if(page) { + if(page && + keepUpdated()) { if (ScaleType.isValue("Page")) { if(std::abs(page->Scale.getValue() - Scale.getValue()) > FLT_EPSILON) { Scale.setValue(page->Scale.getValue()); @@ -116,6 +117,7 @@ App::DocumentObjectExecReturn *DrawView::execute(void) } else if (ScaleType.isValue("Custom")) { //Base::Console().Message("TRACE - DV::execute - custom %s Scale: %.3f\n",getNameInDocument(),Scale.getValue()); } + requestPaint(); } return App::DocumentObject::StdReturn; //DO::execute returns 0 } @@ -306,6 +308,20 @@ void DrawView::Restore(Base::XMLReader &reader) reader.readEndElement("Properties"); } +bool DrawView::keepUpdated(void) +{ + bool result = false; + TechDraw::DrawPage *page = findParentPage(); + if(page) { + result = page->KeepUpdated.getValue(); + } + return result; +} + +void DrawView::requestPaint(void) +{ + signalGuiPaint(this); +} PyObject *DrawView::getPyObject(void) { diff --git a/src/Mod/TechDraw/App/DrawView.h b/src/Mod/TechDraw/App/DrawView.h index 2e2cff1bba..3dd374a1c5 100644 --- a/src/Mod/TechDraw/App/DrawView.h +++ b/src/Mod/TechDraw/App/DrawView.h @@ -23,6 +23,8 @@ #ifndef _DrawView_h_ #define _DrawView_h_ +#include + #include #include @@ -82,12 +84,15 @@ public: virtual double autoScale(double w, double h) const; virtual bool checkFit(DrawPage*) const; virtual void setPosition(double x, double y); + bool keepUpdated(void); + boost::signal signalGuiPaint; protected: void onChanged(const App::Property* prop); std::string pageFeatName; bool autoPos; bool mouseMove; + void requestPaint(void); private: static const char* ScaleTypeEnums[]; diff --git a/src/Mod/TechDraw/App/DrawViewArch.cpp b/src/Mod/TechDraw/App/DrawViewArch.cpp index 9705e65efe..51c1e1422e 100644 --- a/src/Mod/TechDraw/App/DrawViewArch.cpp +++ b/src/Mod/TechDraw/App/DrawViewArch.cpp @@ -92,6 +92,10 @@ void DrawViewArch::onChanged(const App::Property* prop) App::DocumentObjectExecReturn *DrawViewArch::execute(void) { + if (!keepUpdated()) { + return App::DocumentObject::StdReturn; + } + App::DocumentObject* sourceObj = Source.getValue(); if (sourceObj) { std::string svgFrag; diff --git a/src/Mod/TechDraw/App/DrawViewClip.cpp b/src/Mod/TechDraw/App/DrawViewClip.cpp index 50c0b14ee2..631dbd1abb 100644 --- a/src/Mod/TechDraw/App/DrawViewClip.cpp +++ b/src/Mod/TechDraw/App/DrawViewClip.cpp @@ -103,6 +103,10 @@ void DrawViewClip::removeView(DrawView *view) App::DocumentObjectExecReturn *DrawViewClip::execute(void) { + if (!keepUpdated()) { + return App::DocumentObject::StdReturn; + } + touch(); std::vector children = Views.getValues(); diff --git a/src/Mod/TechDraw/App/DrawViewCollection.cpp b/src/Mod/TechDraw/App/DrawViewCollection.cpp index a0f158d2d5..388e82ecc8 100644 --- a/src/Mod/TechDraw/App/DrawViewCollection.cpp +++ b/src/Mod/TechDraw/App/DrawViewCollection.cpp @@ -190,6 +190,10 @@ void DrawViewCollection::unsetupObject() App::DocumentObjectExecReturn *DrawViewCollection::execute(void) { + if (!keepUpdated()) { + return App::DocumentObject::StdReturn; + } + if (ScaleType.isValue("Page")) { const std::vector &views = Views.getValues(); for(std::vector::const_iterator it = views.begin(); it != views.end(); ++it) { diff --git a/src/Mod/TechDraw/App/DrawViewDetail.cpp b/src/Mod/TechDraw/App/DrawViewDetail.cpp index b9f7a182dd..e68904aa9e 100644 --- a/src/Mod/TechDraw/App/DrawViewDetail.cpp +++ b/src/Mod/TechDraw/App/DrawViewDetail.cpp @@ -146,6 +146,10 @@ void DrawViewDetail::onChanged(const App::Property* prop) App::DocumentObjectExecReturn *DrawViewDetail::execute(void) { + if (!keepUpdated()) { + return App::DocumentObject::StdReturn; + } + App::DocumentObject* link = Source.getValue(); App::DocumentObject* base = BaseView.getValue(); if (!link || !base) { diff --git a/src/Mod/TechDraw/App/DrawViewDimension.cpp b/src/Mod/TechDraw/App/DrawViewDimension.cpp index ad442ce87e..031a9efe5b 100644 --- a/src/Mod/TechDraw/App/DrawViewDimension.cpp +++ b/src/Mod/TechDraw/App/DrawViewDimension.cpp @@ -177,6 +177,10 @@ short DrawViewDimension::mustExecute() const App::DocumentObjectExecReturn *DrawViewDimension::execute(void) { + if (!keepUpdated()) { + return App::DocumentObject::StdReturn; + } + if (!has2DReferences()) { //too soon return App::DocumentObject::StdReturn; } diff --git a/src/Mod/TechDraw/App/DrawViewDraft.cpp b/src/Mod/TechDraw/App/DrawViewDraft.cpp index a582d6874e..928b4ba51a 100644 --- a/src/Mod/TechDraw/App/DrawViewDraft.cpp +++ b/src/Mod/TechDraw/App/DrawViewDraft.cpp @@ -88,6 +88,10 @@ void DrawViewDraft::onChanged(const App::Property* prop) App::DocumentObjectExecReturn *DrawViewDraft::execute(void) { + if (!keepUpdated()) { + return App::DocumentObject::StdReturn; + } + App::DocumentObject* sourceObj = Source.getValue(); if (sourceObj) { std::string svgFrag; diff --git a/src/Mod/TechDraw/App/DrawViewMulti.cpp b/src/Mod/TechDraw/App/DrawViewMulti.cpp index 0bd03b48ad..7d5a54526c 100644 --- a/src/Mod/TechDraw/App/DrawViewMulti.cpp +++ b/src/Mod/TechDraw/App/DrawViewMulti.cpp @@ -118,6 +118,10 @@ void DrawViewMulti::onChanged(const App::Property* prop) App::DocumentObjectExecReturn *DrawViewMulti::execute(void) { + if (!keepUpdated()) { + return App::DocumentObject::StdReturn; + } + const std::vector& links = Sources.getValues(); if (links.empty()) { Base::Console().Log("INFO - DVM::execute - No Sources - creation?\n"); diff --git a/src/Mod/TechDraw/App/DrawViewPart.cpp b/src/Mod/TechDraw/App/DrawViewPart.cpp index 2a51a9b530..9030c79e08 100644 --- a/src/Mod/TechDraw/App/DrawViewPart.cpp +++ b/src/Mod/TechDraw/App/DrawViewPart.cpp @@ -155,6 +155,9 @@ DrawViewPart::~DrawViewPart() App::DocumentObjectExecReturn *DrawViewPart::execute(void) { + if (!keepUpdated()) { + return App::DocumentObject::StdReturn; + } App::DocumentObject *link = Source.getValue(); if (!link) { return new App::DocumentObjectExecReturn("DVP - No Source object linked"); @@ -201,7 +204,7 @@ App::DocumentObjectExecReturn *DrawViewPart::execute(void) // Base::Console().Message("TRACE _ DVP::exec - %s/%s u: %s v: %s w: %s\n",getNameInDocument(),Label.getValue(), // DrawUtil::formatVector(getUDir()).c_str(), DrawUtil::formatVector(getVDir()).c_str(),DrawUtil::formatVector(getWDir()).c_str()); - + requestPaint(); return App::DocumentObject::StdReturn; } diff --git a/src/Mod/TechDraw/App/DrawViewSection.cpp b/src/Mod/TechDraw/App/DrawViewSection.cpp index f331e2e6e1..55b946f734 100644 --- a/src/Mod/TechDraw/App/DrawViewSection.cpp +++ b/src/Mod/TechDraw/App/DrawViewSection.cpp @@ -191,6 +191,10 @@ void DrawViewSection::onChanged(const App::Property* prop) App::DocumentObjectExecReturn *DrawViewSection::execute(void) { + if (!keepUpdated()) { + return App::DocumentObject::StdReturn; + } + App::DocumentObject* link = Source.getValue(); App::DocumentObject* base = BaseView.getValue(); if (!link || !base) { diff --git a/src/Mod/TechDraw/App/DrawViewSymbol.cpp b/src/Mod/TechDraw/App/DrawViewSymbol.cpp index 2a63f39bd8..5a44cb10a6 100644 --- a/src/Mod/TechDraw/App/DrawViewSymbol.cpp +++ b/src/Mod/TechDraw/App/DrawViewSymbol.cpp @@ -89,6 +89,10 @@ void DrawViewSymbol::onChanged(const App::Property* prop) App::DocumentObjectExecReturn *DrawViewSymbol::execute(void) { + if (!keepUpdated()) { + return App::DocumentObject::StdReturn; + } + std::string svg = Symbol.getValue(); const std::vector& editText = EditableTexts.getValues(); diff --git a/src/Mod/TechDraw/Gui/DlgPrefsTechDraw.ui b/src/Mod/TechDraw/Gui/DlgPrefsTechDraw.ui index 5b918bba00..6831bdbeee 100644 --- a/src/Mod/TechDraw/Gui/DlgPrefsTechDraw.ui +++ b/src/Mod/TechDraw/Gui/DlgPrefsTechDraw.ui @@ -7,7 +7,7 @@ 0 0 558 - 648 + 709 @@ -131,6 +131,22 @@ + + + + Keep Pages Up to Date + + + true + + + KeepPagesUpToDate + + + Mod/TechDraw/General + + + diff --git a/src/Mod/TechDraw/Gui/QGIViewPart.cpp b/src/Mod/TechDraw/Gui/QGIViewPart.cpp index c552a9b797..11c1efdb38 100644 --- a/src/Mod/TechDraw/Gui/QGIViewPart.cpp +++ b/src/Mod/TechDraw/Gui/QGIViewPart.cpp @@ -349,7 +349,6 @@ void QGIViewPart::updateView(bool update) void QGIViewPart::draw() { drawViewPart(); drawMatting(); -// drawBorder(); QGIView::draw(); } diff --git a/src/Mod/TechDraw/Gui/Resources/TechDraw.qrc b/src/Mod/TechDraw/Gui/Resources/TechDraw.qrc index aa958470fd..bede76852f 100644 --- a/src/Mod/TechDraw/Gui/Resources/TechDraw.qrc +++ b/src/Mod/TechDraw/Gui/Resources/TechDraw.qrc @@ -3,6 +3,7 @@ icons/TechDraw_Tree_Annotation.svg icons/TechDraw_Tree_Hatch.svg icons/TechDraw_Tree_Page.svg + icons/TechDraw_Tree_Page_Unsync.svg icons/TechDraw_Tree_PageTemplate.svg icons/TechDraw_Tree_ProjGroup.svg icons/TechDraw_Tree_Section.svg diff --git a/src/Mod/TechDraw/Gui/Resources/icons/TechDraw_Tree_Page_Unsync.svg b/src/Mod/TechDraw/Gui/Resources/icons/TechDraw_Tree_Page_Unsync.svg new file mode 100644 index 0000000000..5be629784e --- /dev/null +++ b/src/Mod/TechDraw/Gui/Resources/icons/TechDraw_Tree_Page_Unsync.svg @@ -0,0 +1,664 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Jakub Steiner + + + http://jimmac.musichall.cz + + + + + reload + refresh + view + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Mod/TechDraw/Gui/ViewProviderAnnotation.cpp b/src/Mod/TechDraw/Gui/ViewProviderAnnotation.cpp index c4bdc023b8..043588eaee 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderAnnotation.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderAnnotation.cpp @@ -77,7 +77,6 @@ std::vector ViewProviderAnnotation::getDisplayModes(void) const void ViewProviderAnnotation::updateData(const App::Property* prop) { - Base::Console().Log("ViewProviderViewSection::updateData - Update View: %s\n",prop->getName()); if (prop == &(getViewObject()->Text) || prop == &(getViewObject()->Font) || prop == &(getViewObject()->TextColor) || @@ -90,7 +89,7 @@ void ViewProviderAnnotation::updateData(const App::Property* prop) if (qgiv) { qgiv->updateView(true); } - } + } ViewProviderDrawingView::updateData(prop); } diff --git a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp index 2e1eac9da6..26d9b9d14e 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp @@ -25,6 +25,9 @@ #include "PreCompiled.h" #ifndef _PreComp_ +#include +#include + #endif /// Here the FreeCAD includes sorted by Base,App,Gui...... @@ -43,6 +46,7 @@ #include #include +#include #include "ViewProviderPage.h" #include "QGIView.h" @@ -61,6 +65,7 @@ ViewProviderDrawingView::ViewProviderDrawingView() // Do not show in property editor why? wf DisplayMode.setStatus(App::Property::ReadOnly,true); m_docReady = true; + } ViewProviderDrawingView::~ViewProviderDrawingView() @@ -70,6 +75,14 @@ ViewProviderDrawingView::~ViewProviderDrawingView() void ViewProviderDrawingView::attach(App::DocumentObject *pcFeat) { ViewProviderDocumentObject::attach(pcFeat); + + auto bnd = boost::bind(&ViewProviderDrawingView::onGuiRepaint, this, _1); + auto feature = getViewObject(); + if (feature != nullptr) { + connectGuiRepaint = feature->signalGuiPaint.connect(bnd); + } else { + Base::Console().Log("VPDV::attach has no Feature!\n"); + } } void ViewProviderDrawingView::setDisplayMode(const char* ModeName) @@ -137,10 +150,6 @@ void ViewProviderDrawingView::hide(void) QGIView* ViewProviderDrawingView::getQView(void) { - //TODO: vp can get its MDIView with 1 call getActiveView()? - // instead of going back to App side an up tree and back to Gui? - //MDIVPage* mdivp = static_cast(getActiveView()); - //qView = mdivp->getQGVPage()->findQViewForDocObj(getViewObject()); QGIView *qView = nullptr; if (m_docReady){ TechDraw::DrawView* dv = getViewObject(); @@ -185,12 +194,12 @@ void ViewProviderDrawingView::finishRestoring() void ViewProviderDrawingView::updateData(const App::Property* prop) { if (prop == &(getViewObject()->Rotation) ) { - // redraw QGIVP QGIView* qgiv = getQView(); if (qgiv) { qgiv->updateView(true); } - } + } + Gui::ViewProviderDocumentObject::updateData(prop); } @@ -216,6 +225,23 @@ MDIViewPage* ViewProviderDrawingView::getMDIViewPage() const return result; } +void ViewProviderDrawingView::onGuiRepaint(const TechDraw::DrawView* dv) +{ + if (dv == getViewObject()) { + QGIView* qgiv = getQView(); + if (qgiv) { + qgiv->updateView(true); + } +// } else { +// auto vo = getViewObject(); +// auto page = vo->findParentPage(); +// if (page != nullptr) { +// page->requestPaint() ; +// } + + } +} + TechDraw::DrawView* ViewProviderDrawingView::getViewObject() const { return dynamic_cast(pcObject); diff --git a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.h b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.h index acf90a0947..f4481dad4f 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.h +++ b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.h @@ -31,6 +31,10 @@ #include #include "QGIView.h" +namespace TechDraw { +class DrawView; +} + namespace TechDrawGui { class QGIView; class MDIViewPage; @@ -71,6 +75,11 @@ public: //@} virtual TechDraw::DrawView* getViewObject() const; + + void onGuiRepaint(const TechDraw::DrawView* dv); + typedef boost::signals::connection Connection; + Connection connectGuiRepaint; + private: bool m_docReady; //sb MDI + QGraphicsScene ready diff --git a/src/Mod/TechDraw/Gui/ViewProviderPage.cpp b/src/Mod/TechDraw/Gui/ViewProviderPage.cpp index 47fcd045fb..52ea59d7e4 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderPage.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderPage.cpp @@ -126,6 +126,18 @@ void ViewProviderPage::hide(void) void ViewProviderPage::updateData(const App::Property* prop) { + if (prop == &(getDrawPage()->KeepUpdated)) { + if (getDrawPage()->KeepUpdated.getValue()) { + sPixmap = "TechDraw_Tree_Page"; + if (!m_mdiView.isNull() && + !getDrawPage()->isDeleting()) { + m_mdiView->updateDrawing(); + } + } else { + sPixmap = "TechDraw_Tree_Page_Unsync"; + } + } + if (prop == &(getDrawPage()->Views)) { if(!m_mdiView.isNull() && !getDrawPage()->isDeleting()) { @@ -310,11 +322,7 @@ void ViewProviderPage::onSelectionChanged(const Gui::SelectionChanges& msg) void ViewProviderPage::onChanged(const App::Property *prop) { - if (prop == &(getDrawPage()->Views)) { - if(m_mdiView) { - m_mdiView->updateDrawing(); - } - } else if (prop == &(getDrawPage()->Template)) { + if (prop == &(getDrawPage()->Template)) { if(m_mdiView) { m_mdiView->updateTemplate(); } @@ -336,6 +344,10 @@ void ViewProviderPage::finishRestoring() Gui::ViewProviderDocumentObject::finishRestoring(); } +bool ViewProviderPage::isShow(void) const +{ + return Visibility.getValue(); +} TechDraw::DrawPage* ViewProviderPage::getDrawPage() const { diff --git a/src/Mod/TechDraw/Gui/ViewProviderPage.h b/src/Mod/TechDraw/Gui/ViewProviderPage.h index d3a770f41c..2297d00350 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderPage.h +++ b/src/Mod/TechDraw/Gui/ViewProviderPage.h @@ -62,6 +62,7 @@ public: virtual void hide(void); /// Shows the view provider virtual void show(void); + virtual bool isShow(void) const; void onSelectionChanged(const Gui::SelectionChanges& msg); diff --git a/src/Mod/TechDraw/Gui/ViewProviderTemplate.cpp b/src/Mod/TechDraw/Gui/ViewProviderTemplate.cpp index 8cea6d4243..3d95a05fbe 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderTemplate.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderTemplate.cpp @@ -86,7 +86,6 @@ std::vector ViewProviderTemplate::getDisplayModes(void) const void ViewProviderTemplate::updateData(const App::Property* prop) { - //Base::Console().Log("ViewProviderTemplate::updateData(%s)/n",prop->getName()); Gui::ViewProviderDocumentObject::updateData(prop); } @@ -105,6 +104,7 @@ void ViewProviderTemplate::onChanged(const App::Property *prop) hide(); } } + Gui::ViewProviderDocumentObject::onChanged(prop); } diff --git a/src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp b/src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp index b2d9c44a77..048c77edc0 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp @@ -95,7 +95,8 @@ void ViewProviderViewPart::attach(App::DocumentObject *pcFeat) } // call parent attach method - ViewProviderDocumentObject::attach(pcFeat); +// ViewProviderDocumentObject::attach(pcFeat); + ViewProviderDrawingView::attach(pcFeat); } void ViewProviderViewPart::setDisplayMode(const char* ModeName)