X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flayout.cpp;h=ba726f7ccbc5b88e29534625cc77b1de026fd1bb;hb=b15a68afd1d1c36cb953bc29bf234413991c911d;hp=bfe46c47f8b1dcd683238532bdd0fc7497185879;hpb=815194201203afd6fa59e650e1007a355c829544;p=libs%2Fgltk.git diff --git a/source/layout.cpp b/source/layout.cpp index bfe46c4..ba726f7 100644 --- a/source/layout.cpp +++ b/source/layout.cpp @@ -203,7 +203,7 @@ Layout::ConstraintType Layout::complement(ConstraintType type) return type; } -void Layout::add_constraint(Widget &src, ConstraintType type, Widget &tgt) +void Layout::create_constraint(Widget &src, ConstraintType type, Widget &tgt, int sp) { if(&src==&tgt) throw invalid_argument("&src==&tgt"); @@ -216,11 +216,23 @@ void Layout::add_constraint(Widget &src, ConstraintType type, Widget &tgt) return; src_slot.constraints.push_back(Constraint(type, tgt_slot)); + src_slot.constraints.back().spacing = sp; tgt_slot.constraints.push_back(Constraint(complement(type), src_slot)); + tgt_slot.constraints.back().spacing = sp; update(); } +void Layout::add_constraint(Widget &src, ConstraintType type, Widget &tgt) +{ + create_constraint(src, type, tgt, -1); +} + +void Layout::add_constraint(Widget &src, ConstraintType type, Widget &tgt, unsigned spacing) +{ + create_constraint(src, type, tgt, spacing); +} + void Layout::set_gravity(Widget &wdg, int h, int v) { Slot &slot = get_slot_for_widget(wdg); @@ -339,7 +351,7 @@ void Layout::solve_constraints(int dir, SolveMode mode) if(j->type&TARGET_DIM) row[j->target.index*5+1] = -1; if(j->type&SPACING) - row.back() = this->*(ptrs.spacing); + row.back() = (j->spacing>=0 ? j->spacing : this->*(ptrs.spacing)); } } @@ -368,7 +380,8 @@ void Layout::solve_constraints(int dir, SolveMode mode) Layout::Constraint::Constraint(ConstraintType t, Slot &s): type(t), - target(s) + target(s), + spacing(-1) { } @@ -484,11 +497,12 @@ void Layout::LinearProgram::prepare_columns() /* See if any variables are already basic. A basic variable must only have a nonzero coefficient on one row, and its product with the constant column must not be negative. Only one variable can be basic for any given row. */ - vector basic_coeff(n_rows, 0.0f); + vector obj_coeff(n_rows, 0.0f); + vector row_coeff(n_rows, 1.0f); const vector &constants = columns.back().values; for(vector::iterator i=columns.begin(); i!=columns.end(); ++i) { - if(i->values.size()>=2 && i->values.back()!=0.0f && (constants.size()values.size() || i->values.back()*constants[i->values.size()-1]>=0.0f) && basic_coeff[i->values.size()-1]==0.0f) + if(i->values.size()>=2 && i->values.back()!=0.0f && (constants.size()values.size() || i->values.back()*constants[i->values.size()-1]>=0.0f) && obj_coeff[i->values.size()-1]==0.0f) { bool basic = true; for(unsigned j=1; (basic && j+1values.size()); ++j) @@ -496,7 +510,8 @@ void Layout::LinearProgram::prepare_columns() if(basic) { i->basic = i->values.size()-1; - basic_coeff[i->basic] = -i->values.front()/i->values.back(); + row_coeff[i->basic] = 1.0f/i->values.back(); + obj_coeff[i->basic] = -i->values.front(); i->values.clear(); } } @@ -507,7 +522,10 @@ void Layout::LinearProgram::prepare_columns() if(!i->values.empty()) { for(unsigned j=0; jvalues.size(); ++j) - i->values.front() += basic_coeff[j]*i->values[j]; + { + i->values[j] *= row_coeff[j]; + i->values.front() += obj_coeff[j]*i->values[j]; + } } }