X-Git-Url: http://git.tdb.fi/?p=libs%2Fgltk.git;a=blobdiff_plain;f=source%2Fcontainer.cpp;fp=source%2Fcontainer.cpp;h=f1f1934c071d724caaf17086076ccde92c111369;hp=88e59524e8ddac754a69b7506d230d6d019957be;hb=3ac64a18ea1825174b84adb8570368df51e66231;hpb=72de2dce79c76da9931e6bc80e59743526cc18fe diff --git a/source/container.cpp b/source/container.cpp index 88e5952..f1f1934 100644 --- a/source/container.cpp +++ b/source/container.cpp @@ -14,19 +14,21 @@ hierarchy_error::hierarchy_error(const string &w): Container::~Container() { + // Clear children here while members are still valid while(!children.empty()) - delete children.front()->widget; + { + if(children.back()->own_widget) + /* Avoid destroying the unique_ptr for the widget from within its own + reset() function */ + unique_ptr w = move(children.back()->own_widget); + else + children.pop_back(); + } } -void Container::add(Widget &wdg) +void Container::add(unique_ptr wdg) { - wdg.set_parent(this); - children.push_back(make_unique(*this, &wdg)); - if(wdg.get_animation_interval()) - check_animation_interval(); - children_rebuild_needed = true; - signal_rebuild_needed.emit(); - on_child_added(wdg); + add_child(*wdg).own_widget = move(wdg); } void Container::remove(Widget &wdg) @@ -35,6 +37,7 @@ void Container::remove(Widget &wdg) if(i==children.end()) throw hierarchy_error("widget not in container"); + unique_ptr owned = move((*i)->own_widget); if(&wdg==saved_input_focus) saved_input_focus = nullptr; wdg.set_parent(nullptr); @@ -44,6 +47,18 @@ void Container::remove(Widget &wdg) on_child_removed(wdg); } +Container::Child &Container::add_child(Widget &wdg) +{ + wdg.set_parent(this); + children.push_back(make_unique(*this, &wdg)); + if(wdg.get_animation_interval()) + check_animation_interval(); + children_rebuild_needed = true; + signal_rebuild_needed.emit(); + on_child_added(wdg); + return *children.back(); +} + Geometry Container::determine_child_geometry(const Widget &child, const Part &part) const { Geometry pgeom = part.get_geometry(); @@ -381,6 +396,12 @@ Container::Child::Child(Container &c, Widget *w): widget->signal_rebuild_needed.connect(sigc::mem_fun(this, &Child::rebuild_needed)); } +Container::Child::Child(Container &c, unique_ptr w): + Child(c, w.get()) +{ + own_widget = move(w); +} + Container::Child::~Child() { visibility_changed(false);