-/* $Id$
-
-This file is part of libmspgltk
-Copyright © 2011 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
#ifndef MSP_GLTK_LAYOUT_H_
#define MSP_GLTK_LAYOUT_H_
There are three kinds of constraints available: ordering, alignment and
dimension matching.
-Ordering constraints specify that the widgets should be placed next to 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.
+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
undefined.
Since specifiyng constraints manually can be quite tedious, there are some
-derived Layout classes that implement common positioning patterns. See
-MixedRows and Grid.
+derived Layout classes that implement common positioning patterns. See Row,
+Column, MixedRows and Grid.
*/
class Layout
{
VERTICAL = 1,
SELF_POS = 2,
SELF_DIM = 4,
+ SELF_MASK = 6,
TARGET_POS = 8,
TARGET_DIM = 16,
- SPACING = 32
+ TARGET_MASK = 24,
+ SPACING = 32,
+ SLACK = 64
};
public:
BELOW = VERTICAL|SELF_POS|SELF_DIM|TARGET_POS|SPACING,
RIGHT_OF = HORIZONTAL|SELF_POS|TARGET_POS|TARGET_DIM|SPACING,
LEFT_OF = HORIZONTAL|SELF_POS|SELF_DIM|TARGET_POS|SPACING,
+ FAR_ABOVE = VERTICAL|SELF_POS|TARGET_POS|TARGET_DIM|SPACING|SLACK,
+ FAR_BELOW = VERTICAL|SELF_POS|SELF_DIM|TARGET_POS|SPACING|SLACK,
+ FAR_RIGHT_OF = HORIZONTAL|SELF_POS|TARGET_POS|TARGET_DIM|SPACING|SLACK,
+ FAR_LEFT_OF = HORIZONTAL|SELF_POS|SELF_DIM|TARGET_POS|SPACING|SLACK,
ALIGN_TOP = VERTICAL|SELF_POS|SELF_DIM|TARGET_POS|TARGET_DIM,
ALIGN_BOTTOM = VERTICAL|SELF_POS|TARGET_POS,
ALIGN_RIGHT = HORIZONTAL|SELF_POS|SELF_DIM|TARGET_POS|TARGET_DIM,
{
ConstraintType type;
Slot ⌖
+ int spacing;
Constraint(ConstraintType, Slot &);
};
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;
virtual ~Slot() { }
void autosize_changed();
+ void visibility_changed(bool);
+ };
+
+ enum SolveMode
+ {
+ UPDATE,
+ AUTOSIZE
};
class LinearProgram;
Container *container;
std::list<Slot *> slots;
+ unsigned n_active_slots;
+ unsigned n_slack_constraints[2];
Sides margin;
unsigned row_spacing;
unsigned col_spacing;
+ Geometry autosize_geom;
static Pointers pointers[2];
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