From 2d1c84a16c36869ca292b74348f2ef852f2f8a62 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Sun, 25 Dec 2011 16:33:45 +0100 Subject: menu: Container could contains and draw DrawableControls DrawableControls register/unregister itself during construction/destruction at the Container (supplied as owner) and get automatically drawn --- src/menu/container.cpp | 29 ++++++++++++++--------------- src/menu/container.hpp | 13 ++++++------- src/menu/drawable_control.cpp | 11 +++++++++-- src/menu/drawable_control.hpp | 7 ++++++- 4 files changed, 35 insertions(+), 25 deletions(-) (limited to 'src') diff --git a/src/menu/container.cpp b/src/menu/container.cpp index 3bed894e..d39ac736 100644 --- a/src/menu/container.cpp +++ b/src/menu/container.cpp @@ -28,32 +28,31 @@ namespace usdx { - Container::Container(Control* parent) - : DrawableControl(parent) + Container::Container(Container* owner) + : DrawableControl(owner) { } Container::~Container() + { + controls.clear(); + } + + void Container::draw(void) { for (std::list::iterator it = controls.begin(); it != controls.end(); it++) { - delete *it; + (*it)->repaint(); } - - controls.clear(); } - void Container::repaint(void) + void Container::add(DrawableControl *child) { - if (get_visible()) { - draw(); - - for (std::list::const_iterator it = - controls.begin(); - it != controls.end(); it++) { + controls.push_back(child); + } - (*it)->repaint(); - } - } + void Container::remove(DrawableControl *child) + { + controls.remove(child); } }; diff --git a/src/menu/container.hpp b/src/menu/container.hpp index 6ee6bde2..a558462e 100644 --- a/src/menu/container.hpp +++ b/src/menu/container.hpp @@ -28,7 +28,6 @@ #define CONTAINER_HPP #include - #include "drawable_control.hpp" namespace usdx @@ -38,15 +37,15 @@ namespace usdx private: std::list controls; + protected: + virtual void draw(void); + public: - Container(Control* parent); + Container(Container* parent); virtual ~Container(); - /** - * Method for redraw all contained objects. - */ - void repaint(void); - + void add(DrawableControl *child); + void remove(DrawableControl *child); }; }; diff --git a/src/menu/drawable_control.cpp b/src/menu/drawable_control.cpp index 895193f4..bf2ddc74 100644 --- a/src/menu/drawable_control.cpp +++ b/src/menu/drawable_control.cpp @@ -25,15 +25,22 @@ */ #include "drawable_control.hpp" +#include "container.hpp" namespace usdx { - DrawableControl::DrawableControl(Control* parent) - : Control(parent) + DrawableControl::DrawableControl(Container* parent) + : Control(parent), parent(parent) { + if (parent) { + parent->add(this); + } } DrawableControl::~DrawableControl() { + if (parent) { + parent->remove(this); + } } }; diff --git a/src/menu/drawable_control.hpp b/src/menu/drawable_control.hpp index d8b10d10..fcab05da 100644 --- a/src/menu/drawable_control.hpp +++ b/src/menu/drawable_control.hpp @@ -34,10 +34,15 @@ namespace usdx { + class Container; + class DrawableControl : public Drawable, public Control { + private: + Container* parent; + public: - DrawableControl(Control* parent); + DrawableControl(Container* parent); virtual ~DrawableControl(); }; }; -- cgit v1.2.3