class Container;
class Widget;
+/**
+Positions Widgets inside a Container.
+
+A layout operates on constraints, which are used to form a linear program that
+is then solved to obtain positions and dimensions that fulfill the constraints.
+There are three kinds of constraints available: ordering, alignment and
+dimension matching.
+
+Ordering constraints specify that the widgets should be placed next to each
+other along X or Y axis. These operate on one axis at a time, so a widget
+could be "right of" another even if they are separated by hundreds of pixels
+vertically. The widgets will be separated by a spacing value, which is
+settable on a per-layout basis.
+
+Alignment constraints make the corresponding edges of two widgets be on the
+same line. These are incompatible with ordering constraints, so only one or
+the other should be used between any pair of widgets for the same axis.
+
+Dimension matching constraints force the two widgets to have the same dimension
+along the relevant axis.
+
+In addition to constraints, there are some other properties that can be set on
+widgets to determine how they are laid out. Gravity affects which edge of the
+container the widget should be placed at. This is a relatively weak hint and
+will be overridden by many other things. Margins can also be specified to
+prevent widgets from getting too close to the container's edges.
+
+Usually widgets are made as small as their content allows. Setting the expand
+flag for a widget causes it to use as much space as possible. If multiple co-
+dependent widgets have the expand flag set, the results are currently
+undefined.
+
+Since specifiyng constraints manually can be quite tedious, there are some
+derived Layout classes that implement common positioning patterns. See Row,
+Column, MixedRows and Grid.
+*/
class Layout
{
private:
{
ConstraintType type;
Slot ⌖
+ int spacing;
Constraint(ConstraintType, Slot &);
};
Layout &layout;
unsigned index;
Widget &widget;
+ Geometry autosize_geom;
Geometry geom;
std::list<Constraint> constraints;
Packing horiz_pack;
void autosize_changed();
};
+ enum SolveMode
+ {
+ UPDATE,
+ AUTOSIZE
+ };
+
class LinearProgram;
struct Pointers;
Sides margin;
unsigned row_spacing;
unsigned col_spacing;
+ Geometry autosize_geom;
static Pointers pointers[2];
virtual Slot *create_slot(Widget &);
Slot &get_slot_for_widget(Widget &);
static ConstraintType complement(ConstraintType);
+ void create_constraint(Widget &, ConstraintType, Widget &, int);
+
public:
- void add_constraint(Widget &, ConstraintType, Widget &);
+ /** Adds a constraint between two widgets. */
+ void add_constraint(Widget &src, ConstraintType type, Widget &tgt);
+
+ /** Adds a constraint between two widgets, overriding the default spacing.
+ Not all constraint types use a spacing. */
+ void add_constraint(Widget &src, ConstraintType type, Widget &tgt, unsigned);
+
void set_gravity(Widget &, int, int);
void set_expand(Widget &, bool, bool);
void update();
+ void autosize();
protected:
- void find_constraint_group(Slot &, ConstraintType, std::set<Slot *> &);
- void sort_slots(std::list<Slot *> &, ConstraintType);
- void solve_constraints(int);
+ void solve_constraints(int, SolveMode);
};
} // namespace GLtk