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);
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)
{
{
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)
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")