VERTICAL = 1,
SELF_POS = 2,
SELF_DIM = 4,
+ SELF_MASK = 6,
TARGET_POS = 8,
TARGET_DIM = 16,
+ TARGET_MASK = 24,
SPACING = 32
};
{
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;
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;
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 solve_constraints(int);
+ void solve_constraints(int, SolveMode);
};
} // namespace GLtk