X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flayout.cpp;h=ed7b93617dcd485c54759b7c00df05f90827f626;hb=411a387be30f4fc25e0ce8924fb115b5863356f1;hp=35019482bcfbc1efe288be7cf6136723ce3f39a3;hpb=01eaaef90f4c56cd4669d2f621e3061a938753eb;p=libs%2Fgltk.git diff --git a/source/layout.cpp b/source/layout.cpp index 3501948..ed7b936 100644 --- a/source/layout.cpp +++ b/source/layout.cpp @@ -94,7 +94,7 @@ Layout::~Layout() void Layout::set_container(Container &c) { if(container) - throw InvalidState("This layout is already assigned to a Container"); + throw logic_error("container!=0"); container = &c; } @@ -109,7 +109,7 @@ void Layout::set_margin(const Sides &m) void Layout::add_widget(Widget &wdg) { if(!container) - throw InvalidState("Can't add Widgets without a Container"); + throw logic_error("!container"); Slot *slot = create_slot(wdg); for(list::iterator i=slot->constraints.begin(); i!=slot->constraints.end(); ++i) @@ -160,7 +160,7 @@ Layout::Slot &Layout::get_slot_for_widget(Widget &wdg) if(&(*i)->widget==&wdg) return **i; - throw InvalidParameterValue("Widget is not in the Layout"); + throw hierarchy_error("widget not in layout"); } Layout::ConstraintType Layout::complement(ConstraintType type) @@ -179,6 +179,9 @@ Layout::ConstraintType Layout::complement(ConstraintType type) void Layout::add_constraint(Widget &src, ConstraintType type, Widget &tgt) { + if(&src==&tgt) + throw invalid_argument("&src==&tgt"); + Slot &src_slot = get_slot_for_widget(src); Slot &tgt_slot = get_slot_for_widget(tgt); @@ -233,10 +236,11 @@ void Layout::solve_constraints(int dir) Pointers &ptrs = pointers[dir&VERTICAL]; LinearProgram linprog(slots.size()*5+1); + float weight = slots.size(); for(list::iterator i=slots.begin(); i!=slots.end(); ++i) { - linprog.get_object_row()[(*i)->index*5] = 0.1*((*i)->*(ptrs.packing)).gravity; - linprog.get_object_row()[(*i)->index*5+1] = (((*i)->*(ptrs.packing)).expand ? 5 : -1); + linprog.get_object_row()[(*i)->index*5] = ((*i)->*(ptrs.packing)).gravity/weight; + linprog.get_object_row()[(*i)->index*5+1] = (((*i)->*(ptrs.packing)).expand ? weight : -1); { LinearProgram::Row row = linprog.add_row(); @@ -333,7 +337,7 @@ Layout::LinearProgram::Row Layout::LinearProgram::add_row() Layout::LinearProgram::Row Layout::LinearProgram::operator[](unsigned r) { if(r>=n_rows) - throw InvalidParameterValue("Row index out of range"); + throw out_of_range("LinearProgram::operator[]"); return Row(*this, r); } @@ -346,9 +350,9 @@ Layout::LinearProgram::Row Layout::LinearProgram::get_object_row() float Layout::LinearProgram::get_variable(unsigned i) { if(!solved || infeasible) - throw InvalidState("Not solved"); + throw logic_error("not solved"); if(i+1>=n_columns) - throw InvalidParameterValue("Variable index out of range"); + throw out_of_range("LinearProgram::get_variable"); unsigned r = columns[i].basic; return columns.back().values[r]; @@ -474,7 +478,7 @@ Layout::LinearProgram::Row::Row(LinearProgram &lp, unsigned i): float &Layout::LinearProgram::Row::operator[](unsigned c) { if(c>=linprog.n_columns) - throw InvalidParameterValue("Column index out of range"); + throw out_of_range("Row::operator[]"); Column &column = linprog.columns[c]; if(column.values.size()<=index)