From ab4f6fc5cab3e65448145fda2995dc75bd866a2a Mon Sep 17 00:00:00 2001
From: Alexander Sulfrian <alexander@sulfrian.net>
Date: Thu, 22 Mar 2012 22:15:36 +0100
Subject: menu: frame should not be added to container item list

if a frame is constructed, it needs a container as parent to get the
size of it, but it should not be in the container item list and should
be painted first, to be under every component

the inner classes are used as helper classes, to be able to call a
virtual method in the constructor of drawable_control to decide
whether to add the control to the controls list of the container or
not
---
 src/menu/container.cpp        |  5 +++++
 src/menu/container.hpp        |  2 ++
 src/menu/drawable_control.cpp | 24 +++++++++++++++++++++---
 src/menu/drawable_control.hpp | 13 +++++++++++++
 src/menu/frame.cpp            | 21 +++++++++++++++++++--
 src/menu/frame.hpp            | 10 ++++++++++
 6 files changed, 70 insertions(+), 5 deletions(-)

(limited to 'src')

diff --git a/src/menu/container.cpp b/src/menu/container.cpp
index 379dd7c1..755a8b3b 100644
--- a/src/menu/container.cpp
+++ b/src/menu/container.cpp
@@ -37,6 +37,11 @@ namespace usdx
 	{
 	}
 
+	Container::Container(Container* owner, const ContainerHelper& add)
+		: DrawableControl(owner, add), frame(NULL)
+	{
+	}
+
 	Container::~Container()
 	{
 		controls.clear();
diff --git a/src/menu/container.hpp b/src/menu/container.hpp
index dd5a8a32..9b30b117 100644
--- a/src/menu/container.hpp
+++ b/src/menu/container.hpp
@@ -45,6 +45,8 @@ namespace usdx
 		std::list<DrawableControl*> controls;
 
 	protected:
+		Container(Container*, const ContainerHelper&);
+
 		virtual void draw(void);
 
 	public:
diff --git a/src/menu/drawable_control.cpp b/src/menu/drawable_control.cpp
index 6967d5fc..222ef3d5 100644
--- a/src/menu/drawable_control.cpp
+++ b/src/menu/drawable_control.cpp
@@ -35,15 +35,33 @@ namespace usdx
 	DrawableControl::DrawableControl(Container* parent)
 		: Control(parent), parent(parent)
 	{
-		if (parent) {
-			parent->add(this);
-		}
+		ContainerHelper(this).add(parent);
+	}
+
+	DrawableControl::DrawableControl(Container* parent,
+									 const ContainerHelper& helper)
+		: Control(parent), parent(parent)
+	{
+		helper.add(parent);
 	}
 
 	DrawableControl::~DrawableControl()
 	{
 		if (parent) {
 			parent->remove(this);
+			parent = NULL;
+		}
+	}
+
+	DrawableControl::ContainerHelper::ContainerHelper(DrawableControl* self) :
+		self(self)
+	{
+	}
+
+	void DrawableControl::ContainerHelper::add(Container* c) const
+	{
+		if (c) {
+			c->add(self);
 		}
 	}
 };
diff --git a/src/menu/drawable_control.hpp b/src/menu/drawable_control.hpp
index 5605ab62..a2f672c6 100644
--- a/src/menu/drawable_control.hpp
+++ b/src/menu/drawable_control.hpp
@@ -41,8 +41,21 @@ namespace usdx
 	{
 	private:
 		static log4cpp::Category& log;
+
+	protected:
 		Container* parent;
 
+		class ContainerHelper
+		{
+		private:
+			DrawableControl* self;
+
+		public:
+			ContainerHelper(DrawableControl*);
+			virtual void add(Container*) const;
+		};
+		DrawableControl(Container*, const ContainerHelper&);
+
 	public:
 		DrawableControl(Container*);
 		virtual ~DrawableControl();
diff --git a/src/menu/frame.cpp b/src/menu/frame.cpp
index d3695392..cbf073f5 100644
--- a/src/menu/frame.cpp
+++ b/src/menu/frame.cpp
@@ -32,17 +32,22 @@ namespace usdx
 		log4cpp::Category::getInstance("usdx.menu.frame");
 
 	Frame::Frame(Container* parent)
-		: Container(parent), background(NULL)
+		: Container(parent, FrameContainerHelper(this)), background(NULL)
 	{
 	}
 
 	Frame::Frame(Container* parent, FrameBackground* background)
-		: Container(parent), background(background)
+		: Container(parent, FrameContainerHelper(this)), background(background)
 	{
 	}
 
 	Frame::~Frame()
 	{
+		if (parent) {
+			parent->removeFrame();
+			parent = NULL;
+		}
+
 		if (background) {
 			delete background;
 			background = NULL;
@@ -71,4 +76,16 @@ namespace usdx
 
 		Container::draw();
 	}
+
+	Frame::FrameContainerHelper::FrameContainerHelper(Frame* self) :
+		ContainerHelper(self), self(self)
+	{
+	}
+
+	void Frame::FrameContainerHelper::add(Container* c) const
+	{
+		if (c) {
+			c->setFrame(self);
+		}
+	}
 };
diff --git a/src/menu/frame.hpp b/src/menu/frame.hpp
index 6a2b0892..7b2e315a 100644
--- a/src/menu/frame.hpp
+++ b/src/menu/frame.hpp
@@ -42,6 +42,16 @@ namespace usdx
 		FrameBackground* background;
 
 	protected:
+		class FrameContainerHelper : public ContainerHelper
+		{
+		private:
+			Frame* self;
+
+		public:
+			FrameContainerHelper(Frame*);
+			virtual void add(Container*) const;
+		};
+
 		virtual void draw(void);
 
 	public:
-- 
cgit v1.2.3