diff --git a/src/Base/Tools.h b/src/Base/Tools.h index 158c7bb319..35f3e1c788 100644 --- a/src/Base/Tools.h +++ b/src/Base/Tools.h @@ -165,6 +165,20 @@ private: // ---------------------------------------------------------------------------- +class StateLocker +{ +public: + StateLocker(bool& flag, bool st = true) : lock(flag), state(st) + { lock = state; } + ~StateLocker() + { lock = !state; } +private: + bool& lock; + bool state; +}; + +// ---------------------------------------------------------------------------- + class ConnectionBlocker { typedef boost::BOOST_SIGNALS_NAMESPACE::connection Connection; bool b; diff --git a/src/Gui/ViewProviderGroupExtension.cpp b/src/Gui/ViewProviderGroupExtension.cpp index 8ac8961385..4bb4678d99 100644 --- a/src/Gui/ViewProviderGroupExtension.cpp +++ b/src/Gui/ViewProviderGroupExtension.cpp @@ -32,6 +32,7 @@ #include "Command.h" #include "Application.h" #include "Document.h" +#include #include #include #include @@ -43,7 +44,7 @@ using namespace Gui; EXTENSION_PROPERTY_SOURCE(Gui::ViewProviderGroupExtension, Gui::ViewProviderExtension) -ViewProviderGroupExtension::ViewProviderGroupExtension() : visible(false) +ViewProviderGroupExtension::ViewProviderGroupExtension() : visible(false), guard(false) { initExtensionType(ViewProviderGroupExtension::getExtensionClassTypeId()); } @@ -116,6 +117,11 @@ std::vector< App::DocumentObject* > ViewProviderGroupExtension::extensionClaimCh void ViewProviderGroupExtension::extensionShow(void) { + // avoid possible infinite recursion + if (guard) + return; + Base::StateLocker lock(guard); + // when reading the Visibility property from file then do not hide the // objects of this group because they have stored their visibility status, too if (!getExtendedViewProvider()->isRestoring() && !this->visible) { @@ -136,6 +142,11 @@ void ViewProviderGroupExtension::extensionShow(void) { void ViewProviderGroupExtension::extensionHide(void) { + // avoid possible infinite recursion + if (guard) + return; + Base::StateLocker lock(guard); + // when reading the Visibility property from file then do not hide the // objects of this group because they have stored their visibility status, too if (!getExtendedViewProvider()->isRestoring() && this->visible) { diff --git a/src/Gui/ViewProviderGroupExtension.h b/src/Gui/ViewProviderGroupExtension.h index 635af005b8..58c73e0353 100644 --- a/src/Gui/ViewProviderGroupExtension.h +++ b/src/Gui/ViewProviderGroupExtension.h @@ -54,6 +54,7 @@ public: private: bool visible; // helper variable + bool guard; std::vector nodes; };