]> git.tdb.fi Git - libs/gltk.git/blobdiff - source/layout.h
Combine common parts of Column and Row into LinearArrangement
[libs/gltk.git] / source / layout.h
index 0ea47a11c3bdbcef50821bf619ed361b09d48ad5..2de4013a5d1e8b943cf939abd5b63b114e5fd1e3 100644 (file)
@@ -4,11 +4,13 @@
 #include <list>
 #include <set>
 #include <sigc++/trackable.h>
+#include <msp/strings/lexicalcast.h>
 #include "geometry.h"
 
 namespace Msp {
 namespace GLtk {
 
+class Arrangement;
 class Container;
 class Widget;
 
@@ -44,9 +46,9 @@ 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.
+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
 {
@@ -57,9 +59,12 @@ private:
                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:
@@ -69,6 +74,10 @@ 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,
@@ -77,7 +86,7 @@ public:
                COPY_HEIGHT = VERTICAL|SELF_DIM|TARGET_DIM
        };
 
-protected:
+private:
        struct Slot;
 
        struct Constraint
@@ -109,7 +118,6 @@ protected:
                Packing vert_pack;
 
                Slot(Layout &, Widget &);
-               virtual ~Slot() { }
 
                void autosize_changed();
                void visibility_changed(bool);
@@ -127,16 +135,18 @@ protected:
        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;
+       std::list<Arrangement *> arrangement_stack;
 
        static Pointers pointers[2];
 
 public:
        Layout();
-       virtual ~Layout();
+       ~Layout();
 
        void set_container(Container &);
        void set_margin(const Sides &);
@@ -152,10 +162,13 @@ public:
        LEFT_OF and RIGHT_OF constraints. */
        void set_column_spacing(unsigned);
 
+       void push_arrangement(Arrangement &);
+       Arrangement *get_arrangement() const;
+       void pop_arrangement(Arrangement &);
+
        void add_widget(Widget &);
        void remove_widget(Widget &);
-protected:
-       virtual Slot *create_slot(Widget &);
+private:
        void update_slot_indices();
        Slot &get_slot_for_widget(Widget &);
        static ConstraintType complement(ConstraintType);
@@ -175,10 +188,12 @@ public:
        void update();
        void autosize();
 
-protected:
+private:
        void solve_constraints(int, SolveMode);
 };
 
+void operator>>(const LexicalConverter &, Layout::ConstraintType &);
+
 } // namespace GLtk
 } // namespace Msp