]> git.tdb.fi Git - libs/gltk.git/blobdiff - source/layout.cpp
Report non-basic variables in Layout::LinearProgram as having zero value
[libs/gltk.git] / source / layout.cpp
index 6cf7b348a4dc5c753f0d5bd7574cc39c477ed365..2972ec8567829a9faabe9caa7d7ab09733a26914 100644 (file)
@@ -217,12 +217,6 @@ void Layout::set_expand(Widget &wdg, bool h, bool v)
 
 void Layout::update()
 {
-       for(list<Slot *>::iterator i=slots.begin(); i!=slots.end(); ++i)
-       {
-               (*i)->widget.autosize();
-               (*i)->geom = (*i)->widget.get_geometry();
-       }
-
        solve_constraints(HORIZONTAL);
        solve_constraints(VERTICAL);
 
@@ -268,7 +262,7 @@ void Layout::solve_constraints(int dir)
                        LinearProgram::Row row = linprog.add_row();
                        row[(*i)->index*5+1] = 1;
                        row[(*i)->index*5+4] = -1;
-                       row.back() = (*i)->geom.*(ptrs.dim);
+                       row.back() = (*i)->autosize_geom.*(ptrs.dim);
                }
 
                /* Add rows for user-defined constraints.  Below/above and left/right of
@@ -321,11 +315,20 @@ Layout::Slot::Slot(Layout &l, Widget &w):
 {
        vert_pack.gravity = 1;
        widget.signal_autosize_changed.connect(sigc::mem_fun(this, &Slot::autosize_changed));
+       widget.autosize();
+       autosize_geom = widget.get_geometry();
 }
 
 void Layout::Slot::autosize_changed()
 {
-       layout.update();
+       widget.autosize();
+       autosize_geom = widget.get_geometry();
+
+       // If the widget fits in the area it had, just leave it there.
+       if(autosize_geom.w<=geom.w && autosize_geom.h<=geom.h)
+               widget.set_geometry(geom);
+       else
+               layout.update();
 }
 
 
@@ -362,8 +365,10 @@ float Layout::LinearProgram::get_variable(unsigned i)
        if(i+1>=n_columns)
                throw out_of_range("LinearProgram::get_variable");
 
-       unsigned r = columns[i].basic;
-       return columns.back().values[r];
+       if(unsigned r = columns[i].basic)
+               return columns.back().values[r];
+       else
+               return 0;
 }
 
 bool Layout::LinearProgram::solve()
@@ -380,10 +385,14 @@ bool Layout::LinearProgram::solve()
        pricing out the constraint rows. */
        for(vector<Column>::iterator i=columns.begin(); i!=columns.end(); ++i)
        {
-               float objective = i->values.front();
-               i->values.front() = 0.0f;
-               for(vector<float>::iterator j=i->values.begin(); j!=i->values.end(); ++j)
-                       i->values.front() += *j;
+               float objective = 0.0f;
+               if(!i->values.empty())
+               {
+                       objective = i->values.front();
+                       i->values.front() = 0.0f;
+                       for(vector<float>::iterator j=i->values.begin(); j!=i->values.end(); ++j)
+                               i->values.front() += *j;
+               }
                i->values.resize(n_rows+1, 0.0f);
                i->values.back() = objective;
        }