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;
};