]> git.tdb.fi Git - libs/gltk.git/blobdiff - source/layout.h
Simplify constructors with C++11
[libs/gltk.git] / source / layout.h
index 2de4013a5d1e8b943cf939abd5b63b114e5fd1e3..8b1c527640e4e29e69bd61c3f9fab4a4188044be 100644 (file)
@@ -6,6 +6,7 @@
 #include <sigc++/trackable.h>
 #include <msp/strings/lexicalcast.h>
 #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<Layout>
+       {
+       public:
+               typedef std::map<std::string, Widget *> 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 &target;
-               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<Constraint> 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<Slot *> 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 *> 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