From b44ac46e4e54f228fd9c25c042da2efd2ab45b64 Mon Sep 17 00:00:00 2001
From: Alexander Sulfrian <alexander@sulfrian.net>
Date: Thu, 22 Mar 2012 22:49:14 +0100
Subject: menu/container: cleanup while destruction of container

while a container is destructed, the parent of all containing
controls will be removed, so that the controls it self do not try to
unregister itself from the destroyed container later (while
destruction the control class of the container and destroying all
slave controls)
---
 src/menu/container.cpp        |  5 +++++
 src/menu/drawable_control.cpp | 13 +++++++++----
 src/menu/drawable_control.hpp |  2 ++
 3 files changed, 16 insertions(+), 4 deletions(-)

(limited to 'src')

diff --git a/src/menu/container.cpp b/src/menu/container.cpp
index 4ac26548..795d57ab 100644
--- a/src/menu/container.cpp
+++ b/src/menu/container.cpp
@@ -46,6 +46,11 @@ namespace usdx
 
 	Container::~Container()
 	{
+		for (std::list<DrawableControl*>::iterator next = controls.begin(), it = next++;
+			 it != controls.end(); it = next++) {
+			(*it)->remove_parent();
+		}
+
 		controls.clear();
 	}
 
diff --git a/src/menu/drawable_control.cpp b/src/menu/drawable_control.cpp
index 72486d42..00b6fa78 100644
--- a/src/menu/drawable_control.cpp
+++ b/src/menu/drawable_control.cpp
@@ -52,10 +52,7 @@ namespace usdx
 
 	DrawableControl::~DrawableControl()
 	{
-		if (parent) {
-			parent->remove(this);
-			parent = NULL;
-		}
+		remove_parent();
 	}
 
 	bool DrawableControl::get_clipping_required(void) const
@@ -151,6 +148,14 @@ namespace usdx
 		return size.get_height();
 	}
 
+	void DrawableControl::remove_parent(void)
+	{
+		if (parent) {
+			parent->remove(this);
+			parent = NULL;
+		}
+	}
+
 	DrawableControl::ContainerHelper::ContainerHelper(DrawableControl* self) :
 		self(self)
 	{
diff --git a/src/menu/drawable_control.hpp b/src/menu/drawable_control.hpp
index 64bd5a24..2acdd7ec 100644
--- a/src/menu/drawable_control.hpp
+++ b/src/menu/drawable_control.hpp
@@ -90,6 +90,8 @@ namespace usdx
 		const Dimension<int>& get_size(void) const;
 		int get_width(void) const;
 		int get_height(void) const;
+
+		void remove_parent(void);
 	};
 };
 
-- 
cgit v1.2.3