1 #ifndef MSP_GLTK_LAYOUT_H_
2 #define MSP_GLTK_LAYOUT_H_
6 #include <sigc++/trackable.h>
16 Positions Widgets inside a Container.
18 A layout operates on constraints, which are used to form a linear program that
19 is then solved to obtain positions and dimensions that fulfill the constraints.
20 There are three kinds of constraints available: ordering, alignment and
23 Ordering constraints specify that the widgets should be placed next to each
24 other along X or Y axis. These operate on one axis at a time, so a widget
25 could be "right of" another even if they are separated by hundreds of pixels
26 vertically. The widgets will be separated by a spacing value, which is
27 settable on a per-layout basis.
29 Alignment constraints make the corresponding edges of two widgets be on the
30 same line. These are incompatible with ordering constraints, so only one or
31 the other should be used between any pair of widgets for the same axis.
33 Dimension matching constraints force the two widgets to have the same dimension
34 along the relevant axis.
36 In addition to constraints, there are some other properties that can be set on
37 widgets to determine how they are laid out. Gravity affects which edge of the
38 container the widget should be placed at. This is a relatively weak hint and
39 will be overridden by many other things. Margins can also be specified to
40 prevent widgets from getting too close to the container's edges.
42 Usually widgets are made as small as their content allows. Setting the expand
43 flag for a widget causes it to use as much space as possible. If multiple co-
44 dependent widgets have the expand flag set, the results are currently
47 Since specifiyng constraints manually can be quite tedious, there are some
48 derived Layout classes that implement common positioning patterns. See Row,
49 Column, MixedRows and Grid.
71 ABOVE = VERTICAL|SELF_POS|TARGET_POS|TARGET_DIM|SPACING,
72 BELOW = VERTICAL|SELF_POS|SELF_DIM|TARGET_POS|SPACING,
73 RIGHT_OF = HORIZONTAL|SELF_POS|TARGET_POS|TARGET_DIM|SPACING,
74 LEFT_OF = HORIZONTAL|SELF_POS|SELF_DIM|TARGET_POS|SPACING,
75 FAR_ABOVE = VERTICAL|SELF_POS|TARGET_POS|TARGET_DIM|SPACING|SLACK,
76 FAR_BELOW = VERTICAL|SELF_POS|SELF_DIM|TARGET_POS|SPACING|SLACK,
77 FAR_RIGHT_OF = HORIZONTAL|SELF_POS|TARGET_POS|TARGET_DIM|SPACING|SLACK,
78 FAR_LEFT_OF = HORIZONTAL|SELF_POS|SELF_DIM|TARGET_POS|SPACING|SLACK,
79 ALIGN_TOP = VERTICAL|SELF_POS|SELF_DIM|TARGET_POS|TARGET_DIM,
80 ALIGN_BOTTOM = VERTICAL|SELF_POS|TARGET_POS,
81 ALIGN_RIGHT = HORIZONTAL|SELF_POS|SELF_DIM|TARGET_POS|TARGET_DIM,
82 ALIGN_LEFT = HORIZONTAL|SELF_POS|TARGET_POS,
83 COPY_WIDTH = HORIZONTAL|SELF_DIM|TARGET_DIM,
84 COPY_HEIGHT = VERTICAL|SELF_DIM|TARGET_DIM
96 Constraint(ConstraintType, Slot &);
107 struct Slot: public sigc::trackable
112 Geometry autosize_geom;
114 std::list<Constraint> constraints;
118 Slot(Layout &, Widget &);
121 void autosize_changed();
122 void visibility_changed(bool);
134 Container *container;
135 std::list<Slot *> slots;
136 unsigned n_active_slots;
137 unsigned n_slack_constraints[2];
139 unsigned row_spacing;
140 unsigned col_spacing;
141 Geometry autosize_geom;
143 static Pointers pointers[2];
149 void set_container(Container &);
150 void set_margin(const Sides &);
152 /** Sets the default spacing between widgets in bothg directions. */
153 void set_spacing(unsigned);
155 /** Sets the default vertical spacing between widgets. Affects the ABOVE
156 and BELOW constraints. */
157 void set_row_spacing(unsigned);
159 /** Sets the default horizontal spacing between widgets. Affects the
160 LEFT_OF and RIGHT_OF constraints. */
161 void set_column_spacing(unsigned);
163 void add_widget(Widget &);
164 void remove_widget(Widget &);
166 virtual Slot *create_slot(Widget &);
167 void update_slot_indices();
168 Slot &get_slot_for_widget(Widget &);
169 static ConstraintType complement(ConstraintType);
170 void create_constraint(Widget &, ConstraintType, Widget &, int);
173 /** Adds a constraint between two widgets. */
174 void add_constraint(Widget &src, ConstraintType type, Widget &tgt);
176 /** Adds a constraint between two widgets, overriding the default spacing.
177 Not all constraint types use a spacing. */
178 void add_constraint(Widget &src, ConstraintType type, Widget &tgt, unsigned);
180 void set_gravity(Widget &, int, int);
181 void set_expand(Widget &, bool, bool);
187 void solve_constraints(int, SolveMode);