void Container::add(Widget &wdg)
{
wdg.set_parent(this);
- children.push_back(create_child(&wdg));
+ children.push_back(make_unique<Child>(*this, &wdg));
if(wdg.get_animation_interval())
check_animation_interval();
children_rebuild_needed = true;
void Container::remove(Widget &wdg)
{
- auto i = find_if(children, [&wdg](const Child *c){ return c->widget==&wdg; });
+ auto i = find_if(children, [&wdg](const unique_ptr<Child> &c){ return c->widget==&wdg; });
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);
if(wdg.get_animation_interval())
check_animation_interval();
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();
vector<Widget *> Container::get_children() const
{
vector<Widget *> result;
- for(const Child *c: children)
+ for(const unique_ptr<Child> &c: children)
result.push_back(c->widget);
return result;
}
if(Container *cont = dynamic_cast<Container *>(wdg))
{
const Geometry &cgeom = wdg->get_geometry();
- Widget *wdg2 = cont->find_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;
void Container::raise(Widget &wdg)
{
- auto i = find_if(children, [&wdg](const Child *c){ return c->widget==&wdg; });
+ auto i = find_if(children, [&wdg](const unique_ptr<Child> &c){ return c->widget==&wdg; });
if(i==children.end())
throw hierarchy_error("widget not in container");
- Child *c = *i;
+ unique_ptr<Child> c = move(*i);
children.erase(i);
- children.push_back(c);
+ children.push_back(move(c));
}
void Container::set_pointer_focus(Widget *wdg, bool grab)
void Container::check_animation_interval()
{
Time::TimeDelta shortest;
- for(const Child *c: children)
+ for(const unique_ptr<Child> &c: children)
{
const Time::TimeDelta &child_iv = c->widget->get_animation_interval();
if(child_iv && (!shortest || child_iv<shortest))
if(children_rebuild_needed)
{
children_rebuild_needed = false;
- for(Child *c: children)
+ for(const unique_ptr<Child> &c: children)
c->widget->rebuild_hierarchy();
}
}
void Container::animate(const Time::TimeDelta &dt)
{
- for(Child *c: children)
+ for(const unique_ptr<Child> &c: children)
{
const Time::TimeDelta &child_iv = c->widget->get_animation_interval();
if(!child_iv)
void Container::on_reparent()
{
- for(const Child *c: children)
+ for(const unique_ptr<Child> &c: children)
{
if(Container *o = dynamic_cast<Container *>(c->widget))
o->on_reparent();