]> git.tdb.fi Git - libs/gltk.git/blobdiff - source/layout.cpp
Add lexical conversion for the centering constraints
[libs/gltk.git] / source / layout.cpp
index 02e1ec4479dd17643dbbc8056b8b578c8bac0adb..1cf35c722a3a95476532ec1d35898aa7a0e5b903 100644 (file)
@@ -259,7 +259,7 @@ Layout::ConstraintType Layout::complement(ConstraintType type)
 void Layout::create_constraint(Widget &src, ConstraintType type, Widget &tgt, int sp)
 {
        if(&src==&tgt)
-               throw invalid_argument("&src==&tgt");
+               throw invalid_argument("Layout::create_constraint");
 
        Slot &src_slot = get_slot_for_widget(src);
        Slot &tgt_slot = get_slot_for_widget(tgt);
@@ -362,7 +362,7 @@ void Layout::solve_constraints(int dir, SolveMode mode)
        columns of a widget are its position and dimension, respectively.  The
        remaining three are slack columns; see below for their purposes. */
        LinearProgram linprog(n_active_slots*5+n_slack_vars[dir]+1);
-       float weight = slots.size();
+       float weight = slots.size()+1;
        unsigned k = n_active_slots*5;
        for(list<Slot *>::iterator i=slots.begin(); i!=slots.end(); ++i)
        {
@@ -439,14 +439,15 @@ void Layout::solve_constraints(int dir, SolveMode mode)
                        {
                                LinearProgram::Row row = linprog.add_row();
                                float polarity = ((j->type&SELF_DIM) ? -1 : 1);
+                               float dim_weight = ((j->type&HALF_DIM) ? 0.5f : 1);
                                if(j->type&SELF_POS)
                                        row[(*i)->index*5] = polarity;
                                if(j->type&SELF_DIM)
-                                       row[(*i)->index*5+1] = polarity;
+                                       row[(*i)->index*5+1] = polarity*dim_weight;
                                if(j->type&TARGET_POS)
                                        row[j->target.index*5] = -polarity;
                                if(j->type&TARGET_DIM)
-                                       row[j->target.index*5+1] = -polarity;
+                                       row[j->target.index*5+1] = -polarity*dim_weight;
                                if(j->type&SPACING)
                                        row.back() = (j->spacing>=0 ? j->spacing : this->*(ptrs.spacing));
                                if(j->type&SLACK)
@@ -626,10 +627,14 @@ void operator>>(const LexicalConverter &conv, Layout::ConstraintType &ctype)
                ctype = Layout::FAR_LEFT_OF;
        else if(str=="ALIGN_TOP")
                ctype = Layout::ALIGN_TOP;
+       else if(str=="ALIGN_VCENTER")
+               ctype = Layout::ALIGN_VCENTER;
        else if(str=="ALIGN_BOTTOM")
                ctype = Layout::ALIGN_BOTTOM;
        else if(str=="ALIGN_RIGHT")
                ctype = Layout::ALIGN_RIGHT;
+       else if(str=="ALIGN_HCENTER")
+               ctype = Layout::ALIGN_HCENTER;
        else if(str=="ALIGN_LEFT")
                ctype = Layout::ALIGN_LEFT;
        else if(str=="COPY_WIDTH")