From d8e0df9e973b38b1c5557da9402d56fa7f0a621e Mon Sep 17 00:00:00 2001 From: wmayer Date: Sat, 3 Jan 2015 17:09:17 +0100 Subject: [PATCH] + fixes #0001678: Visibility property is ignored on drawing sheets --- src/Gui/Document.cpp | 1 - src/Gui/ViewProviderDocumentObject.cpp | 1 + src/Mod/Drawing/App/FeatureClip.cpp | 4 + src/Mod/Drawing/App/FeatureClip.h | 1 + src/Mod/Drawing/App/FeaturePage.cpp | 18 ++-- src/Mod/Drawing/App/FeatureView.cpp | 4 + src/Mod/Drawing/App/FeatureView.h | 1 + src/Mod/Drawing/Gui/ViewProviderView.cpp | 109 ++++++++++++++++++++++- src/Mod/Drawing/Gui/ViewProviderView.h | 24 ++++- 9 files changed, 151 insertions(+), 12 deletions(-) diff --git a/src/Gui/Document.cpp b/src/Gui/Document.cpp index 55779b85ef6b..981c0ab00df6 100644 --- a/src/Gui/Document.cpp +++ b/src/Gui/Document.cpp @@ -666,7 +666,6 @@ void Document::Restore(Base::XMLReader &reader) // RestoreDocFile then restores the visibility status again std::map::iterator it; for (it = d->_ViewProviderMap.begin(); it != d->_ViewProviderMap.end(); ++it) { - it->second->hide(); it->second->startRestoring(); } } diff --git a/src/Gui/ViewProviderDocumentObject.cpp b/src/Gui/ViewProviderDocumentObject.cpp index 026b6f36db43..dfb6b585a3e7 100644 --- a/src/Gui/ViewProviderDocumentObject.cpp +++ b/src/Gui/ViewProviderDocumentObject.cpp @@ -71,6 +71,7 @@ void ViewProviderDocumentObject::getTaskViewContent(std::vector(App::Prop_Hidden|App::Prop_Output); + ADD_PROPERTY_TYPE(Visible, (true),group,propType,"Control whether frame is visible in page object"); } FeatureClip::~FeatureClip() diff --git a/src/Mod/Drawing/App/FeatureClip.h b/src/Mod/Drawing/App/FeatureClip.h index 95d6d59b2a43..225f871af0cb 100644 --- a/src/Mod/Drawing/App/FeatureClip.h +++ b/src/Mod/Drawing/App/FeatureClip.h @@ -48,6 +48,7 @@ class DrawingExport FeatureClip: public App::DocumentObjectGroup App::PropertyFloat Height; App::PropertyBool ShowFrame; App::PropertyString ViewResult; + App::PropertyBool Visible; /** @name methods overide Feature */ //@{ diff --git a/src/Mod/Drawing/App/FeaturePage.cpp b/src/Mod/Drawing/App/FeaturePage.cpp index 377201423199..28959032dc44 100644 --- a/src/Mod/Drawing/App/FeaturePage.cpp +++ b/src/Mod/Drawing/App/FeaturePage.cpp @@ -148,12 +148,16 @@ App::DocumentObjectExecReturn *FeaturePage::execute(void) for (std::vector::const_iterator It= Grp.begin();It!=Grp.end();++It) { if ( (*It)->getTypeId().isDerivedFrom(Drawing::FeatureView::getClassTypeId()) ) { Drawing::FeatureView *View = dynamic_cast(*It); - ofile << View->ViewResult.getValue(); - ofile << tempendl << tempendl << tempendl; + if (View->Visible.getValue()) { + ofile << View->ViewResult.getValue(); + ofile << tempendl << tempendl << tempendl; + } } else if ( (*It)->getTypeId().isDerivedFrom(Drawing::FeatureClip::getClassTypeId()) ) { Drawing::FeatureClip *Clip = dynamic_cast(*It); - ofile << Clip->ViewResult.getValue(); - ofile << tempendl << tempendl << tempendl; + if (Clip->Visible.getValue()) { + ofile << Clip->ViewResult.getValue(); + ofile << tempendl << tempendl << tempendl; + } } else if ( (*It)->getTypeId().isDerivedFrom(App::DocumentObjectGroup::getClassTypeId()) ) { // getting children inside subgroups too App::DocumentObjectGroup *SubGroup = dynamic_cast(*It); @@ -161,8 +165,10 @@ App::DocumentObjectExecReturn *FeaturePage::execute(void) for (std::vector::const_iterator Grit= SubGrp.begin();Grit!=SubGrp.end();++Grit) { if ( (*Grit)->getTypeId().isDerivedFrom(Drawing::FeatureView::getClassTypeId()) ) { Drawing::FeatureView *SView = dynamic_cast(*Grit); - ofile << SView->ViewResult.getValue(); - ofile << tempendl << tempendl << tempendl; + if (SView->Visible.getValue()) { + ofile << SView->ViewResult.getValue(); + ofile << tempendl << tempendl << tempendl; + } } } } diff --git a/src/Mod/Drawing/App/FeatureView.cpp b/src/Mod/Drawing/App/FeatureView.cpp index e570ca46fab3..cd93ddf801b0 100644 --- a/src/Mod/Drawing/App/FeatureView.cpp +++ b/src/Mod/Drawing/App/FeatureView.cpp @@ -55,6 +55,10 @@ FeatureView::FeatureView(void) ADD_PROPERTY_TYPE(Y ,(0),group,App::Prop_None,"Y position of the view on the drawing in modelling units (mm)"); ADD_PROPERTY_TYPE(Scale ,(1.0),group,App::Prop_None,"Scale factor of the view"); ADD_PROPERTY_TYPE(Rotation ,(0),group,App::Prop_None,"Rotation of the view in degrees counterclockwise"); + // The 'Visible' property is handled by the view provider exclusively. It has the 'Output' flag set to + // avoid to call the execute() method. The view provider touches the page object, instead. + App::PropertyType propType = static_cast(App::Prop_Hidden|App::Prop_Output); + ADD_PROPERTY_TYPE(Visible, (true),group,propType,"Control whether view is visible in page object"); App::PropertyType type = (App::PropertyType)(App::Prop_Hidden); ADD_PROPERTY_TYPE(ViewResult ,(0),group,type,"Resulting SVG fragment of that view"); diff --git a/src/Mod/Drawing/App/FeatureView.h b/src/Mod/Drawing/App/FeatureView.h index 9d4607fffffc..f4ea8f28b5d8 100644 --- a/src/Mod/Drawing/App/FeatureView.h +++ b/src/Mod/Drawing/App/FeatureView.h @@ -50,6 +50,7 @@ class DrawingExport FeatureView : public App::DocumentObject App::PropertyFloat X,Y,Scale,Rotation; App::PropertyString ViewResult; + App::PropertyBool Visible; /** @name methods overide Feature */ diff --git a/src/Mod/Drawing/Gui/ViewProviderView.cpp b/src/Mod/Drawing/Gui/ViewProviderView.cpp index be746e71619f..ca0f86afa7cd 100644 --- a/src/Mod/Drawing/Gui/ViewProviderView.cpp +++ b/src/Mod/Drawing/Gui/ViewProviderView.cpp @@ -40,7 +40,8 @@ #include #include - +#include +#include #include "ViewProviderView.h" @@ -51,6 +52,9 @@ PROPERTY_SOURCE(DrawingGui::ViewProviderDrawingView, Gui::ViewProviderDocumentOb ViewProviderDrawingView::ViewProviderDrawingView() { sPixmap = "Page"; + + // Do not show in property editor + DisplayMode.StatusBits.set(3, true); } ViewProviderDrawingView::~ViewProviderDrawingView() @@ -70,12 +74,59 @@ void ViewProviderDrawingView::setDisplayMode(const char* ModeName) std::vector ViewProviderDrawingView::getDisplayModes(void) const { - // get the modes of the father std::vector StrList = ViewProviderDocumentObject::getDisplayModes(); - return StrList; } +void ViewProviderDrawingView::show(void) +{ + ViewProviderDocumentObject::show(); + + App::DocumentObject* obj = getObject(); + if (!obj || obj->isRestoring()) + return; + if (obj->getTypeId().isDerivedFrom(Drawing::FeatureView::getClassTypeId())) { + // The 'Visible' property is marked as 'Output'. To update the drawing on recompute + // the parent page object is touched. + static_cast(obj)->Visible.setValue(true); + std::vector inp = obj->getInList(); + for (std::vector::iterator it = inp.begin(); it != inp.end(); ++it) + (*it)->touch(); + } +} + +void ViewProviderDrawingView::hide(void) +{ + ViewProviderDocumentObject::hide(); + + App::DocumentObject* obj = getObject(); + if (!obj || obj->isRestoring()) + return; + if (obj->getTypeId().isDerivedFrom(Drawing::FeatureView::getClassTypeId())) { + // The 'Visible' property is marked as 'Output'. To update the drawing on recompute + // the parent page object is touched. + static_cast(obj)->Visible.setValue(false); + std::vector inp = obj->getInList(); + for (std::vector::iterator it = inp.begin(); it != inp.end(); ++it) + (*it)->touch(); + } +} + +bool ViewProviderDrawingView::isShow(void) const +{ + return Visibility.getValue(); +} + +void ViewProviderDrawingView::startRestoring() +{ + // do nothing +} + +void ViewProviderDrawingView::finishRestoring() +{ + // do nothing +} + void ViewProviderDrawingView::updateData(const App::Property*) { } @@ -87,6 +138,9 @@ PROPERTY_SOURCE(DrawingGui::ViewProviderDrawingClip, Gui::ViewProviderDocumentOb ViewProviderDrawingClip::ViewProviderDrawingClip() { sPixmap = "Page"; + + // Do not show in property editor + DisplayMode.StatusBits.set(3, true); } ViewProviderDrawingClip::~ViewProviderDrawingClip() @@ -111,6 +165,55 @@ std::vector ViewProviderDrawingClip::getDisplayModes(void) const return StrList; } +void ViewProviderDrawingClip::show(void) +{ + ViewProviderDocumentObjectGroup::show(); + + App::DocumentObject* obj = getObject(); + if (!obj || obj->isRestoring()) + return; + if (obj->getTypeId().isDerivedFrom(Drawing::FeatureClip::getClassTypeId())) { + // The 'Visible' property is marked as 'Output'. To update the drawing on recompute + // the parent page object is touched. + static_cast(obj)->Visible.setValue(true); + std::vector inp = obj->getInList(); + for (std::vector::iterator it = inp.begin(); it != inp.end(); ++it) + (*it)->touch(); + } +} + +void ViewProviderDrawingClip::hide(void) +{ + ViewProviderDocumentObjectGroup::hide(); + + App::DocumentObject* obj = getObject(); + if (!obj || obj->isRestoring()) + return; + if (obj->getTypeId().isDerivedFrom(Drawing::FeatureClip::getClassTypeId())) { + // The 'Visible' property is marked as 'Output'. To update the drawing on recompute + // the parent page object is touched. + static_cast(obj)->Visible.setValue(false); + std::vector inp = obj->getInList(); + for (std::vector::iterator it = inp.begin(); it != inp.end(); ++it) + (*it)->touch(); + } +} + +bool ViewProviderDrawingClip::isShow(void) const +{ + return Visibility.getValue(); +} + +void ViewProviderDrawingClip::startRestoring() +{ + // do nothing +} + +void ViewProviderDrawingClip::finishRestoring() +{ + // do nothing +} + void ViewProviderDrawingClip::updateData(const App::Property*) { } diff --git a/src/Mod/Drawing/Gui/ViewProviderView.h b/src/Mod/Drawing/Gui/ViewProviderView.h index 0dd731abe141..6fff56c2cf04 100644 --- a/src/Mod/Drawing/Gui/ViewProviderView.h +++ b/src/Mod/Drawing/Gui/ViewProviderView.h @@ -48,7 +48,17 @@ class DrawingGuiExport ViewProviderDrawingView : public Gui::ViewProviderDocumen /// returns a list of all possible modes virtual std::vector getDisplayModes(void) const; virtual void updateData(const App::Property*); - + /// Hide the object in the view + virtual void hide(void); + /// Show the object in the view + virtual void show(void); + virtual bool isShow(void) const; + + /** @name Restoring view provider from document load */ + //@{ + virtual void startRestoring(); + virtual void finishRestoring(); + //@} }; class DrawingGuiExport ViewProviderDrawingClip : public Gui::ViewProviderDocumentObjectGroup @@ -68,7 +78,17 @@ class DrawingGuiExport ViewProviderDrawingClip : public Gui::ViewProviderDocumen /// returns a list of all possible modes virtual std::vector getDisplayModes(void) const; virtual void updateData(const App::Property*); - + /// Hide the object in the view + virtual void hide(void); + /// Show the object in the view + virtual void show(void); + virtual bool isShow(void) const; + + /** @name Restoring view provider from document load */ + //@{ + virtual void startRestoring(); + virtual void finishRestoring(); + //@} }; } // namespace DrawingGui