void Container::add(Widget &wdg)
{
wdg.set_parent(this);
- children.push_back(create_child(&wdg));
+ children.push_back(new Child(*this, &wdg));
if(wdg.get_animation_interval())
check_animation_interval();
children_rebuild_needed = true;
if(i==children.end())
throw hierarchy_error("widget not in container");
+ if(&wdg==saved_input_focus)
+ saved_input_focus = nullptr;
wdg.set_parent(nullptr);
delete *i;
children.erase(i);
on_child_removed(wdg);
}
-Container::Child *Container::create_child(Widget *wdg)
-{
- return new Child(*this, wdg);
-}
-
Geometry Container::determine_child_geometry(const Widget &child, const Part &part) const
{
Geometry pgeom = part.get_geometry();
child.set_geometry(determine_child_geometry(child, part));
}
-list<Widget *> Container::get_children() const
+vector<Widget *> Container::get_children() const
{
- list<Widget *> result;
+ vector<Widget *> result;
for(const Child *c: children)
result.push_back(c->widget);
return result;
}
-Widget *Container::get_child_at(int x, int y) const
+Widget *Container::find_child_at(int x, int y) const
{
for(auto i=children.end(); i!=children.begin();)
if((*--i)->widget->is_visible() && (*i)->widget->get_geometry().is_inside(x, y))
return nullptr;
}
-Widget *Container::get_descendant_at(int x, int y) const
+Widget *Container::find_descendant_at(int x, int y) const
{
- Widget *wdg = get_child_at(x, y);
+ Widget *wdg = find_child_at(x, y);
if(Container *cont = dynamic_cast<Container *>(wdg))
{
const Geometry &cgeom = wdg->get_geometry();
- Widget *wdg2 = cont->get_descendant_at(x-cgeom.x, y-cgeom.y);
- if(wdg2)
+ if(Widget *wdg2 = cont->find_descendant_at(x-cgeom.x, y-cgeom.y))
return wdg2;
}
return wdg;
if(i==children.end())
throw hierarchy_error("widget not in container");
- children.splice(children.end(), children, i);
+ Child *c = *i;
+ children.erase(i);
+ children.push_back(c);
}
void Container::set_pointer_focus(Widget *wdg, bool grab)
{
click_focus = nullptr;
if(!pointer_focus)
- set_pointer_focus(get_child_at(x, y));
+ set_pointer_focus(find_child_at(x, y));
}
const Geometry &cgeom = child->get_geometry();
return touch_focus;
else
{
- Widget *child = get_child_at(x, y);
+ Widget *child = find_child_at(x, y);
if(child && child->is_enabled())
return child;
else
void Container::focus_in()
{
- if(saved_input_focus && saved_input_focus->get_parent()==this)
+ if(saved_input_focus)
set_input_focus(saved_input_focus);
Widget::focus_in();
}