/* $Id$
This file is part of libmspgltk
-Copyright © 2009 Mikko Rasa, Mikkosoft Productions
+Copyright © 2009-2011 Mikko Rasa, Mikkosoft Productions
Distributed under the LGPL
*/
namespace Msp {
namespace GLtk {
-Container::Container(const Resources &r):
- Widget(r),
+Container::Container():
click_focus(0),
click_button(0)
{ }
void Container::add(Widget &wdg)
{
- set_parent(wdg, this);
+ wdg.set_parent(this);
children.push_back(create_child(&wdg));
+ on_child_added(wdg);
}
void Container::remove(Widget &wdg)
for(list<Child *>::iterator i=children.begin(); i!=children.end(); ++i)
if((*i)->widget==&wdg)
{
- set_parent(wdg, 0);
+ wdg.set_parent(0);
delete *i;
children.erase(i);
+ on_child_removed(wdg);
return;
}
throw InvalidState("That Widget is not in this Container");
}
+Container::Child *Container::create_child(Widget *wdg)
+{
+ return new Child(*this, wdg);
+}
+
list<Widget *> Container::get_children() const
{
list<Widget *> result;
Widget *Container::get_descendant_at(int x, int y)
{
- Widget *wdg=get_child_at(x, y);
- if(Container *cont=dynamic_cast<Container *>(wdg))
+ Widget *wdg = get_child_at(x, y);
+ if(Container *cont = dynamic_cast<Container *>(wdg))
{
- const Geometry &cgeom=wdg->get_geometry();
- return cont->get_descendant_at(x-cgeom.x, y-cgeom.y);
+ const Geometry &cgeom = wdg->get_geometry();
+ Widget *wdg2 = cont->get_descendant_at(x-cgeom.x, y-cgeom.y);
+ if(wdg2)
+ return wdg2;
}
return wdg;
}
{
if(click_focus)
{
- const Geometry &cgeom=click_focus->get_geometry();
+ const Geometry &cgeom = click_focus->get_geometry();
click_focus->button_press(x-cgeom.x, y-cgeom.y, btn);
}
else
{
- if(Widget *wdg=get_child_at(x, y))
+ if(Widget *wdg = get_child_at(x, y))
{
- click_focus=wdg;
- click_button=btn;
+ click_focus = wdg;
+ click_button = btn;
- const Geometry &cgeom=wdg->get_geometry();
+ const Geometry &cgeom = wdg->get_geometry();
wdg->button_press(x-cgeom.x, y-cgeom.y, btn);
}
}
{
if(click_focus)
{
- Widget *wdg=click_focus;
+ Widget *wdg = click_focus;
if(btn==click_button)
- click_focus=0;
+ click_focus = 0;
- const Geometry &cgeom=wdg->get_geometry();
+ const Geometry &cgeom = wdg->get_geometry();
wdg->button_release(x-cgeom.x, y-cgeom.y, btn);
}
else
{
- if(Widget *wdg=get_child_at(x, y))
+ if(Widget *wdg = get_child_at(x, y))
{
- const Geometry &cgeom=wdg->get_geometry();
+ const Geometry &cgeom = wdg->get_geometry();
wdg->button_release(x-cgeom.x, y-cgeom.y, btn);
}
}
{
if(click_focus)
{
- const Geometry &cgeom=click_focus->get_geometry();
+ const Geometry &cgeom = click_focus->get_geometry();
click_focus->pointer_motion(x-cgeom.x, y-cgeom.y);
}
else
{
- Widget *wdg=get_child_at(x, y);
+ Widget *wdg = get_child_at(x, y);
if(wdg)
{
- const Geometry &cgeom=wdg->get_geometry();
+ const Geometry &cgeom = wdg->get_geometry();
wdg->pointer_motion(x-cgeom.x, y-cgeom.y);
}
}
void Container::pointer_leave()
{
Widget::pointer_leave();
- click_focus=0;
+ click_focus = 0;
}
-Container::Child *Container::create_child(Widget *wdg)
+void Container::on_reparent()
{
- return new Child(*this, wdg);
+ for(list<Child *>::iterator i=children.begin(); i!=children.end(); ++i)
+ {
+ if(Container *c = dynamic_cast<Container *>((*i)->widget))
+ c->on_reparent();
+ (*i)->widget->update_style();
+ }
}
Container::Child::~Child()
{
if(widget==container.click_focus)
- container.click_focus=0;
+ container.click_focus = 0;
}
void Container::Child::visibility_changed(bool v)
{
if(!v && widget==container.click_focus)
- container.click_focus=0;
+ container.click_focus = 0;
}
} // namespace GLtk