X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flayout.h;h=0ea47a11c3bdbcef50821bf619ed361b09d48ad5;hb=43a75e4e9be56c58be5e224f19016bb14b56a7ef;hp=540c5ee4d90bacfe9b233e824ad181b81a21aeeb;hpb=01eaaef90f4c56cd4669d2f621e3061a938753eb;p=libs%2Fgltk.git diff --git a/source/layout.h b/source/layout.h index 540c5ee..0ea47a1 100644 --- a/source/layout.h +++ b/source/layout.h @@ -12,6 +12,42 @@ namespace GLtk { 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: @@ -48,6 +84,7 @@ protected: { ConstraintType type; Slot ⌖ + int spacing; Constraint(ConstraintType, Slot &); }; @@ -63,8 +100,9 @@ protected: struct Slot: public sigc::trackable { Layout &layout; - unsigned index; + int index; Widget &widget; + Geometry autosize_geom; Geometry geom; std::list constraints; Packing horiz_pack; @@ -74,6 +112,13 @@ protected: virtual ~Slot() { } void autosize_changed(); + void visibility_changed(bool); + }; + + enum SolveMode + { + UPDATE, + AUTOSIZE }; class LinearProgram; @@ -81,9 +126,11 @@ protected: Container *container; std::list slots; + unsigned n_active_slots; Sides margin; unsigned row_spacing; unsigned col_spacing; + Geometry autosize_geom; static Pointers pointers[2]; @@ -93,27 +140,43 @@ public: void set_container(Container &); void set_margin(const Sides &); + + /** Sets the default spacing between widgets in bothg directions. */ void set_spacing(unsigned); + + /** Sets the default vertical spacing between widgets. Affects the ABOVE + and BELOW constraints. */ void set_row_spacing(unsigned); + + /** Sets the default horizontal spacing between widgets. Affects the + LEFT_OF and RIGHT_OF constraints. */ void set_column_spacing(unsigned); void add_widget(Widget &); void remove_widget(Widget &); protected: virtual Slot *create_slot(Widget &); + void update_slot_indices(); 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 &); - void sort_slots(std::list &, ConstraintType); - void solve_constraints(int); + void solve_constraints(int, SolveMode); }; } // namespace GLtk