Canvas: improve implementation/design of ConstraintPacker::preferred_size()
This commit is contained in:
parent
502a9e80dc
commit
ff6fe51d76
@ -70,6 +70,7 @@ public:
|
||||
|
||||
void add_constraints (kiwi::Solver&, ConstrainedItem*) const;
|
||||
|
||||
void non_const_preferred_size (Duple& mininum, Duple& natural);
|
||||
virtual void update_constraints ();
|
||||
};
|
||||
|
||||
|
@ -137,7 +137,12 @@ ConstraintPacker::constrain (kiwi::Constraint const &c)
|
||||
void
|
||||
ConstraintPacker::preferred_size (Duple& minimum, Duple& natural) const
|
||||
{
|
||||
#if 0
|
||||
const_cast<ConstraintPacker*>(this)->non_const_preferred_size (minimum, natural);
|
||||
}
|
||||
|
||||
void
|
||||
ConstraintPacker::non_const_preferred_size (Duple& minimum, Duple& natural)
|
||||
{
|
||||
/* our parent wants to know how big we are.
|
||||
|
||||
We may have some intrinsic size (i.e. "everything in this constraint
|
||||
@ -152,6 +157,12 @@ ConstraintPacker::preferred_size (Duple& minimum, Duple& natural) const
|
||||
We may have no intrinsic dimensions at all. This is the tricky one.
|
||||
*/
|
||||
|
||||
if (_intrinsic_width == 0 && _intrinsic_height == 0) {
|
||||
natural = Duple (100,100);
|
||||
minimum = natural;
|
||||
return;
|
||||
}
|
||||
|
||||
if (_need_constraint_update) {
|
||||
const_cast<ConstraintPacker*>(this)->update_constraints ();
|
||||
}
|
||||
@ -163,19 +174,24 @@ ConstraintPacker::preferred_size (Duple& minimum, Duple& natural) const
|
||||
}
|
||||
|
||||
_solver.updateVariables ();
|
||||
apply (0);
|
||||
|
||||
Rect bb (bounding_box());
|
||||
|
||||
Duple ret;
|
||||
|
||||
natural.x = width.value ();
|
||||
natural.y = height.value ();
|
||||
natural.x = std::max (bb.width(), _intrinsic_width);
|
||||
natural.y = std::max (bb.height(), _intrinsic_width);
|
||||
|
||||
minimum = natural;
|
||||
#endif
|
||||
natural.x = 100;
|
||||
natural.y = 100;
|
||||
minimum = natural;
|
||||
minimum.x = std::min (bb.width(), _intrinsic_width);
|
||||
minimum.y = std::min (bb.height(), _intrinsic_width);
|
||||
|
||||
cerr << "CP::sr returns " << natural<< endl;
|
||||
/* put solver back to default state */
|
||||
|
||||
_solver.reset ();
|
||||
_need_constraint_update = true;
|
||||
|
||||
cerr << "CP min " << minimum << " pref " << natural << endl;
|
||||
}
|
||||
|
||||
void
|
||||
@ -301,10 +317,10 @@ ConstraintPacker::update_constraints ()
|
||||
|
||||
x->first->preferred_size (min, natural);
|
||||
|
||||
_solver.addConstraint (ci->width() >= min.width() | kiwi::strength::required);
|
||||
_solver.addConstraint (ci->height() >= min.height() | kiwi::strength::required);
|
||||
_solver.addConstraint (ci->width() == natural.width() | kiwi::strength::medium);
|
||||
_solver.addConstraint (ci->height() == natural.width() | kiwi::strength::medium);
|
||||
_solver.addConstraint ((ci->width() >= min.width()) | kiwi::strength::required);
|
||||
_solver.addConstraint ((ci->height() >= min.height()) | kiwi::strength::required);
|
||||
_solver.addConstraint ((ci->width() == natural.width()) | kiwi::strength::medium);
|
||||
_solver.addConstraint ((ci->height() == natural.width()) | kiwi::strength::medium);
|
||||
|
||||
add_constraints (_solver, ci);
|
||||
}
|
||||
|
@ -35,8 +35,6 @@ main (int argc, char* argv[])
|
||||
|
||||
srandom (time ((time_t) 0));
|
||||
|
||||
cview.set_size_request (100, 100);
|
||||
|
||||
win.add (cview);
|
||||
|
||||
/* Make some items */
|
||||
@ -75,6 +73,10 @@ main (int argc, char* argv[])
|
||||
|
||||
ConstraintPacker* packer = new ConstraintPacker (c->root());
|
||||
|
||||
/* give it a minimum size */
|
||||
|
||||
packer->set_intrinsic_size (100, 100);
|
||||
|
||||
/* add stuff */
|
||||
|
||||
ConstrainedItem* left = packer->add_constrained (r1);
|
||||
|
Loading…
Reference in New Issue
Block a user