X-Git-Url: http://git.tdb.fi/?p=libs%2Fgltk.git;a=blobdiff_plain;f=source%2Flayout.cpp;fp=source%2Flayout.cpp;h=495d6261c6483b55f3f76bee50b7980eb0fd33a1;hp=e9461b5eddf855e72fed34b8e6b4fa31bd90eefa;hb=394e5c9969a30b604bfaf78fc05a8c2d5c98ab5b;hpb=90d5f5f2ebaeb8aaa4aa47a0c2207f96758cba8c diff --git a/source/layout.cpp b/source/layout.cpp index e9461b5..495d626 100644 --- a/source/layout.cpp +++ b/source/layout.cpp @@ -85,12 +85,6 @@ Layout::Pointers Layout::pointers[2] = } }; -Layout::~Layout() -{ - for(Slot *s: slots) - delete s; -} - void Layout::set_container(Container &c) { if(container) @@ -163,7 +157,7 @@ void Layout::add_widget(Widget &wdg) if(!container) throw logic_error("!container"); - slots.push_back(new Slot(*this, wdg)); + slots.emplace_back(make_unique(*this, wdg)); update_slot_indices(); if(!arrangement_stack.empty()) arrangement_stack.back()->arrange(wdg); @@ -173,23 +167,22 @@ void Layout::add_widget(Widget &wdg) void Layout::remove_widget(Widget &wdg) { - auto i = find_if(slots, [&wdg](Slot *s){ return &s->widget==&wdg; }); + auto i = find_if(slots, [&wdg](const unique_ptr &s){ return &s->widget==&wdg; }); if(i==slots.end()) return; - for(Slot *s: slots) + for(const unique_ptr &s: slots) if(s!=*i) { for(auto k=s->constraints.begin(); k!=s->constraints.end(); ) { - if(k->target==*i) + if(k->target==i->get()) k = s->constraints.erase(k); else ++k; } } - delete *i; slots.erase(i); update_slot_indices(); @@ -200,7 +193,7 @@ void Layout::update_slot_indices() { n_active_slots = 0; size_t n_floating = 0; - for(Slot *s: slots) + for(const unique_ptr &s: slots) { if(s->widget.is_visible() || s->ghost) { @@ -214,13 +207,13 @@ void Layout::update_slot_indices() n_slack_vars[0] = n_floating*2; n_slack_vars[1] = n_floating*2; - for(const Slot *s: slots) + for(const unique_ptr &s: slots) if(s->index>=0) { if(!s->floating) { for(unsigned j=0; j<2; ++j) - if((s->*(pointers[j].packing)).gravity==0) + if((s.get()->*(pointers[j].packing)).gravity==0) n_slack_vars[j] += 2; } @@ -232,7 +225,7 @@ void Layout::update_slot_indices() Layout::Slot &Layout::get_slot_for_widget(Widget &wdg) { - auto i = find_if(slots, [&wdg](const Slot *s){ return &s->widget==&wdg; }); + auto i = find_if(slots, [&wdg](const unique_ptr &s){ return &s->widget==&wdg; }); if(i==slots.end()) throw hierarchy_error("widget not in layout"); @@ -324,7 +317,7 @@ void Layout::update() solve_constraints(HORIZONTAL, UPDATE); solve_constraints(VERTICAL, UPDATE); - for(const Slot *s: slots) + for(const unique_ptr &s: slots) s->widget.set_geometry(s->geom); } @@ -352,7 +345,7 @@ void Layout::solve_constraints(int dir, SolveMode mode) LinearProgram linprog(n_active_slots*5+n_slack_vars[dir]+1); float weight = slots.size()+1; size_t k = n_active_slots*5; - for(const Slot *s: slots) + for(const unique_ptr &s: slots) { if(s->index<0) continue; @@ -366,8 +359,8 @@ void Layout::solve_constraints(int dir, SolveMode mode) else { if(!s->floating) - objective[s->index*5] = (s->*(ptrs.packing)).gravity/weight; - objective[s->index*5+1] = ((s->*(ptrs.packing)).expand ? weight : -1); + objective[s->index*5] = (s.get()->*(ptrs.packing)).gravity/weight; + objective[s->index*5+1] = ((s.get()->*(ptrs.packing)).expand ? weight : -1); } { @@ -388,12 +381,12 @@ void Layout::solve_constraints(int dir, SolveMode mode) row.back() = geom.*(ptrs.dim)-margin.*(ptrs.high_margin); } - if(s->floating || (s->*(ptrs.packing)).gravity==0) + if(s->floating || (s.get()->*(ptrs.packing)).gravity==0) { /* Try to keep the widget as close to a target position as possible. Since linear programs can't express absolute values directly, use two opposing slack variables that are optimized for a low value. */ - float a = (s->*(ptrs.packing)).gravity*0.5+0.5; + float a = (s.get()->*(ptrs.packing)).gravity*0.5+0.5; LinearProgram::Row row = linprog.add_row(); row[s->index*5] = 1; row[s->index*5+1] = a; @@ -449,7 +442,7 @@ void Layout::solve_constraints(int dir, SolveMode mode) if(mode==AUTOSIZE) { autosize_geom.*(ptrs.dim) = 0; - for(const Slot *s: slots) + for(const unique_ptr &s: slots) if(s->index>=0) { int high_edge = linprog.get_variable(s->index*5)+linprog.get_variable(s->index*5+1); @@ -458,7 +451,7 @@ void Layout::solve_constraints(int dir, SolveMode mode) } else { - for(Slot *s: slots) + for(const unique_ptr &s: slots) if(s->index>=0) { s->geom.*(ptrs.pos) = linprog.get_variable(s->index*5);