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;
}
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<Constraint>::iterator i=slot->constraints.begin(); i!=slot->constraints.end(); ++i)
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)
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);
Pointers &ptrs = pointers[dir&VERTICAL];
LinearProgram linprog(slots.size()*5+1);
+ float weight = slots.size();
for(list<Slot *>::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();
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);
}
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];
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)