]> git.tdb.fi Git - libs/gltk.git/blobdiff - source/layout.h
Comment and style updates
[libs/gltk.git] / source / layout.h
index 540c5ee4d90bacfe9b233e824ad181b81a21aeeb..0ea47a11c3bdbcef50821bf619ed361b09d48ad5 100644 (file)
@@ -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<Constraint> 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<Slot *> 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<Slot *> &);
-       void sort_slots(std::list<Slot *> &, ConstraintType);
-       void solve_constraints(int);
+       void solve_constraints(int, SolveMode);
 };
 
 } // namespace GLtk