]> git.tdb.fi Git - libs/gltk.git/commitdiff
Make widgets aware of their parents
authorMikko Rasa <tdb@tdb.fi>
Tue, 11 Dec 2007 08:00:41 +0000 (08:00 +0000)
committerMikko Rasa <tdb@tdb.fi>
Tue, 11 Dec 2007 08:00:41 +0000 (08:00 +0000)
Support removing widgets from panels

source/panel.cpp
source/panel.h
source/widget.cpp
source/widget.h

index 529ec199183d20e1b31cdb3675b3025450fb4ca5..36585c97716778431c96cdcf4285c2cbaedc1b5b 100644 (file)
@@ -27,15 +27,26 @@ Panel::Panel(const Resources &r):
 
 Panel::~Panel()
 {
-       for(ChildSeq::iterator i=children.begin(); i!=children.end(); ++i)
-               delete *i;
+       while(!children.empty())
+               delete children.front();
 }
 
 void Panel::add(Widget &wdg)
 {
+       set_parent(wdg, this);
        children.push_back(&wdg);
 }
 
+void Panel::remove(Widget &wdg)
+{
+       ChildSeq::iterator i=find(children.begin(), children.end(), &wdg);
+       if(i!=children.end())
+       {
+               set_parent(wdg, 0);
+               children.erase(i);
+       }
+}
+
 void Panel::button_press(int x, int y, unsigned btn)
 {
        if(pointer_grab>0)
index 7279d78276289d35411f3c372524dcfb426d9be0..3d268751979b0b0a6f9097f167881d4412448e8a 100644 (file)
@@ -50,6 +50,7 @@ public:
        ~Panel();
 
        void add(Widget &);
+       void remove(Widget &);
 
        virtual void button_press(int, int, unsigned);
        virtual void button_release(int, int, unsigned);
index e20ea82b56fcf085a2cab9a8eb7a1e0e96aaad19..e41310a50c5fd5cba82298dd3149983b16a0f8a1 100644 (file)
@@ -7,6 +7,7 @@ Distributed under the LGPL
 
 #include <msp/gl/matrix.h>
 #include <msp/gl/transform.h>
+#include "panel.h"
 #include "resources.h"
 #include "widget.h"
 
@@ -19,9 +20,16 @@ Widget::Widget(const Resources &r):
        res(r),
        style(0),
        state(NORMAL),
-       visible(true)
+       visible(true),
+       parent(0)
 { }
 
+Widget::~Widget()
+{
+       if(parent)
+               parent->remove(*this);
+}
+
 void Widget::set_position(int x, int y)
 {
        geom.x=x;
@@ -100,6 +108,18 @@ void Widget::update_style()
        style=res.get<Style>(sname);
 }
 
+void Widget::set_parent(Panel *p)
+{
+       if(parent && p)
+               throw InvalidState("Widget is already in a Panel");
+       parent=p;
+}
+
+void Widget::set_parent(Widget &w, Panel *p)
+{
+       w.set_parent(p);
+}
+
 
 Widget::Loader::Loader(Widget &w):
        wdg(w)
index 255f0425bcc719f3161ccb32e8aaa3b75888d1e5..6cb5e4a1bd670ae13bb930a6b06c9db7af887e40 100644 (file)
@@ -15,6 +15,7 @@ Distributed under the LGPL
 namespace Msp {
 namespace GLtk {
 
+class Panel;
 class Part;
 class Resources;
 class Style;
@@ -47,10 +48,11 @@ protected:
        const Style *style;
        State state;
        bool visible;
+       Panel *parent;
 
        Widget(const Resources &);
 public:
-       virtual ~Widget() { }
+       virtual ~Widget();
        void set_position(int, int);
        void set_size(unsigned, unsigned);
        void set_geometry(const Geometry &);
@@ -88,7 +90,22 @@ protected:
        */
        virtual const char *get_class() const { return "widget"; }
 
+       /**
+       Gets a style object from the resource collection based on the class and
+       style names of the widget.
+       */
        void update_style();
+
+       /**
+       Sets the widget's parent Panel.  The widget must be unparented when calling
+       this function.
+       */
+       void set_parent(Panel *);
+
+       /**
+       A helper function to set the parent of another widget.
+       */
+       void set_parent(Widget &, Panel *);
 };
 
 } // namespace GLtk