X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flayout.h;h=8b1c527640e4e29e69bd61c3f9fab4a4188044be;hb=9f38197854e699a6093a906ab43f4238f3cd2388;hp=2de4013a5d1e8b943cf939abd5b63b114e5fd1e3;hpb=b30edd979e6e9c7acfaaf3a90903814a7e62a71e;p=libs%2Fgltk.git diff --git a/source/layout.h b/source/layout.h index 2de4013..8b1c527 100644 --- a/source/layout.h +++ b/source/layout.h @@ -6,6 +6,7 @@ #include #include #include "geometry.h" +#include "mspgltk_api.h" namespace Msp { namespace GLtk { @@ -50,7 +51,7 @@ Since specifiyng constraints manually can be quite tedious, an Arrangement interface is provided to automatically arrange widgets. See classes Row, Column and Grid for some commonly used arrangements. */ -class Layout +class MSPGLTK_API Layout { private: enum @@ -63,8 +64,9 @@ private: TARGET_POS = 8, TARGET_DIM = 16, TARGET_MASK = 24, - SPACING = 32, - SLACK = 64 + HALF_DIM = 32, + SPACING = 64, + SLACK = 128 }; public: @@ -79,43 +81,81 @@ public: 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_VCENTER = VERTICAL|SELF_POS|SELF_DIM|TARGET_POS|TARGET_DIM|HALF_DIM, ALIGN_BOTTOM = VERTICAL|SELF_POS|TARGET_POS, ALIGN_RIGHT = HORIZONTAL|SELF_POS|SELF_DIM|TARGET_POS|TARGET_DIM, + ALIGN_HCENTER = HORIZONTAL|SELF_POS|SELF_DIM|TARGET_POS|TARGET_DIM|HALF_DIM, ALIGN_LEFT = HORIZONTAL|SELF_POS|TARGET_POS, COPY_WIDTH = HORIZONTAL|SELF_DIM|TARGET_DIM, COPY_HEIGHT = VERTICAL|SELF_DIM|TARGET_DIM }; + class Loader: public DataFile::ObjectLoader + { + public: + typedef std::map WidgetMap; + + private: + const WidgetMap &wdg_map; + + public: + Loader(Layout &, const WidgetMap &); + + private: + void column_spacing(unsigned); + void margin(); + void row_spacing(unsigned); + void spacing(unsigned); + void widget(const std::string &); + }; + private: + class WidgetLoader: public DataFile::Loader + { + private: + Layout &layout; + Widget &widget; + const Layout::Loader::WidgetMap &wdg_map; + + public: + WidgetLoader(Layout &, Widget &, const Layout::Loader::WidgetMap &); + + private: + void constraint(ConstraintType, const std::string &); + void expand(bool, bool); + void ghost(bool); + void gravity(int, int); + }; + struct Slot; struct Constraint { ConstraintType type; Slot ⌖ - int spacing; + int spacing = -1; Constraint(ConstraintType, Slot &); }; struct Packing { - int gravity; - bool expand; - - Packing(); + int gravity = -1; + bool expand = false; }; struct Slot: public sigc::trackable { Layout &layout; - int index; + int index = 0; Widget &widget; Geometry autosize_geom; Geometry geom; std::list constraints; Packing horiz_pack; Packing vert_pack; + bool ghost = false; + bool floating = false; Slot(Layout &, Widget &); @@ -132,26 +172,26 @@ private: class LinearProgram; struct Pointers; - Container *container; + Container *container = 0; std::list slots; - unsigned n_active_slots; - unsigned n_slack_constraints[2]; - Sides margin; - unsigned row_spacing; - unsigned col_spacing; + unsigned n_active_slots = 0; + unsigned n_slack_vars[2] = { 0, 0 }; + Sides margin{ 8 }; + unsigned row_spacing = 5; + unsigned col_spacing = 4; Geometry autosize_geom; std::list arrangement_stack; static Pointers pointers[2]; public: - Layout(); ~Layout(); void set_container(Container &); void set_margin(const Sides &); + const Sides &get_margin() const { return margin; } - /** Sets the default spacing between widgets in bothg directions. */ + /** Sets the default spacing between widgets in both directions. */ void set_spacing(unsigned); /** Sets the default vertical spacing between widgets. Affects the ABOVE @@ -162,6 +202,9 @@ public: LEFT_OF and RIGHT_OF constraints. */ void set_column_spacing(unsigned); + unsigned get_row_spacing() const { return row_spacing; } + unsigned get_column_spacing() const { return col_spacing; } + void push_arrangement(Arrangement &); Arrangement *get_arrangement() const; void pop_arrangement(Arrangement &); @@ -185,14 +228,19 @@ public: void set_gravity(Widget &, int, int); void set_expand(Widget &, bool, bool); + /// Sets a widget as a ghost, taking up space even if it is hidden. + void set_ghost(Widget &, bool); + + void set_floating(Widget &, bool); + void update(); - void autosize(); + void autosize(Geometry &); private: void solve_constraints(int, SolveMode); }; -void operator>>(const LexicalConverter &, Layout::ConstraintType &); +MSPGLTK_API void operator>>(const LexicalConverter &, Layout::ConstraintType &); } // namespace GLtk } // namespace Msp