1 #ifndef MSP_GLTK_LAYOUT_H_
2 #define MSP_GLTK_LAYOUT_H_
6 #include <sigc++/trackable.h>
17 Positions Widgets inside a Container.
19 A layout operates on constraints, which are used to form a linear program that
20 is then solved to obtain positions and dimensions that fulfill the constraints.
21 There are three kinds of constraints available: ordering, alignment and
24 Ordering constraints specify that the widgets should be placed next to each
25 other along X or Y axis. These operate on one axis at a time, so a widget
26 could be "right of" another even if they are separated by hundreds of pixels
27 vertically. The widgets will be separated by a spacing value, which is
28 settable on a per-layout basis.
30 Alignment constraints make the corresponding edges of two widgets be on the
31 same line. These are incompatible with ordering constraints, so only one or
32 the other should be used between any pair of widgets for the same axis.
34 Dimension matching constraints force the two widgets to have the same dimension
35 along the relevant axis.
37 In addition to constraints, there are some other properties that can be set on
38 widgets to determine how they are laid out. Gravity affects which edge of the
39 container the widget should be placed at. This is a relatively weak hint and
40 will be overridden by many other things. Margins can also be specified to
41 prevent widgets from getting too close to the container's edges.
43 Usually widgets are made as small as their content allows. Setting the expand
44 flag for a widget causes it to use as much space as possible. If multiple co-
45 dependent widgets have the expand flag set, the results are currently
48 Since specifiyng constraints manually can be quite tedious, an Arrangement
49 interface is provided to automatically arrange widgets. See classes Row,
50 Column and Grid for some commonly used arrangements.
72 ABOVE = VERTICAL|SELF_POS|TARGET_POS|TARGET_DIM|SPACING,
73 BELOW = VERTICAL|SELF_POS|SELF_DIM|TARGET_POS|SPACING,
74 RIGHT_OF = HORIZONTAL|SELF_POS|TARGET_POS|TARGET_DIM|SPACING,
75 LEFT_OF = HORIZONTAL|SELF_POS|SELF_DIM|TARGET_POS|SPACING,
76 FAR_ABOVE = VERTICAL|SELF_POS|TARGET_POS|TARGET_DIM|SPACING|SLACK,
77 FAR_BELOW = VERTICAL|SELF_POS|SELF_DIM|TARGET_POS|SPACING|SLACK,
78 FAR_RIGHT_OF = HORIZONTAL|SELF_POS|TARGET_POS|TARGET_DIM|SPACING|SLACK,
79 FAR_LEFT_OF = HORIZONTAL|SELF_POS|SELF_DIM|TARGET_POS|SPACING|SLACK,
80 ALIGN_TOP = VERTICAL|SELF_POS|SELF_DIM|TARGET_POS|TARGET_DIM,
81 ALIGN_BOTTOM = VERTICAL|SELF_POS|TARGET_POS,
82 ALIGN_RIGHT = HORIZONTAL|SELF_POS|SELF_DIM|TARGET_POS|TARGET_DIM,
83 ALIGN_LEFT = HORIZONTAL|SELF_POS|TARGET_POS,
84 COPY_WIDTH = HORIZONTAL|SELF_DIM|TARGET_DIM,
85 COPY_HEIGHT = VERTICAL|SELF_DIM|TARGET_DIM
97 Constraint(ConstraintType, Slot &);
108 struct Slot: public sigc::trackable
113 Geometry autosize_geom;
115 std::list<Constraint> constraints;
119 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;
142 std::list<Arrangement *> arrangement_stack;
144 static Pointers pointers[2];
150 void set_container(Container &);
151 void set_margin(const Sides &);
153 /** Sets the default spacing between widgets in bothg directions. */
154 void set_spacing(unsigned);
156 /** Sets the default vertical spacing between widgets. Affects the ABOVE
157 and BELOW constraints. */
158 void set_row_spacing(unsigned);
160 /** Sets the default horizontal spacing between widgets. Affects the
161 LEFT_OF and RIGHT_OF constraints. */
162 void set_column_spacing(unsigned);
164 void push_arrangement(Arrangement &);
165 Arrangement *get_arrangement() const;
166 void pop_arrangement(Arrangement &);
168 void add_widget(Widget &);
169 void remove_widget(Widget &);
171 void update_slot_indices();
172 Slot &get_slot_for_widget(Widget &);
173 static ConstraintType complement(ConstraintType);
174 void create_constraint(Widget &, ConstraintType, Widget &, int);
177 /** Adds a constraint between two widgets. */
178 void add_constraint(Widget &src, ConstraintType type, Widget &tgt);
180 /** Adds a constraint between two widgets, overriding the default spacing.
181 Not all constraint types use a spacing. */
182 void add_constraint(Widget &src, ConstraintType type, Widget &tgt, unsigned);
184 void set_gravity(Widget &, int, int);
185 void set_expand(Widget &, bool, bool);
191 void solve_constraints(int, SolveMode);