]> git.tdb.fi Git - libs/gltk.git/blobdiff - source/layout.cpp
Rework exceptions and use maputils
[libs/gltk.git] / source / layout.cpp
index 35019482bcfbc1efe288be7cf6136723ce3f39a3..ed7b93617dcd485c54759b7c00df05f90827f626 100644 (file)
@@ -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<Constraint>::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<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();
@@ -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)