]> git.tdb.fi Git - libs/gltk.git/blobdiff - source/lineararrangement.cpp
Use nullptr instead of 0 for pointers
[libs/gltk.git] / source / lineararrangement.cpp
index 5d18cfb309423bae9a99553264d9031f5ad965e5..269b68e34f71fe9933b668695d51b0eaa5806662 100644 (file)
@@ -5,13 +5,16 @@ namespace GLtk {
 
 LinearArrangement::LinearArrangement(Layout &l, Side p):
        Arrangement(l),
-       primary(p),
-       opposite(static_cast<Side>((primary+2)%4)),
-       first(true),
-       split_here(false),
-       gravity(opposite)
+       primary(p)
 { }
 
+void LinearArrangement::set_uniform(bool u)
+{
+       uniform = u;
+       if(!uniform)
+               uniform_ref = nullptr;
+}
+
 void LinearArrangement::split()
 {
        if(gravity==primary)
@@ -29,17 +32,22 @@ void LinearArrangement::expand()
                throw arrangement_error("no widgets");
 
        add_constraint(*edges[primary].widgets.front(), get_align_constraint(primary), primary);
-       layout.set_expand(*edges[primary].widgets.front(), false, true);
+       layout.set_expand(*edges[primary].widgets.front(), (primary==LEFT || primary==RIGHT), (primary==TOP || primary==BOTTOM));
        edges[primary].align();
        gravity = primary;
 }
 
+void LinearArrangement::spacing(unsigned s)
+{
+       next_spacing = s;
+}
+
 void LinearArrangement::process_widget(Widget &wdg, Side side, bool aligned)
 {
        if(side==opposite)
        {
                bool snug = (internal_aligned && aligned && !split_here);
-               add_constraint(wdg, get_order_constraint(primary, !snug), primary);
+               add_constraint(wdg, get_order_constraint(primary, !snug), primary, next_spacing);
                if(first)
                        edges[side].add(wdg, (aligned && gravity==opposite));
        }
@@ -53,6 +61,20 @@ void LinearArrangement::process_widget(Widget &wdg, Side side, bool aligned)
        }
 }
 
+void LinearArrangement::finish_widget(Widget &wdg)
+{
+       if(uniform)
+       {
+               if(!uniform_ref)
+                       uniform_ref = &wdg;
+               else
+               {
+                       Layout::ConstraintType ct = ((primary==LEFT || primary==RIGHT) ? Layout::COPY_WIDTH : Layout::COPY_HEIGHT);
+                       layout.add_constraint(wdg, ct, *uniform_ref);
+               }
+       }
+}
+
 void LinearArrangement::finish_slot()
 {
        internal_aligned = next.aligned;
@@ -62,6 +84,7 @@ void LinearArrangement::finish_slot()
        next.clear();
        split_here = false;
        first = false;
+       next_spacing = -1;
 }
 
 
@@ -69,7 +92,9 @@ LinearArrangement::Loader::Loader(LinearArrangement &c):
        DataFile::ObjectLoader<LinearArrangement>(c)
 {
        add("expand", &Loader::expand);
+       add("spacing", &Loader::spacing);
        add("split", &Loader::split);
+       add("uniform", &Loader::uniform);
 }
 
 void LinearArrangement::Loader::expand()
@@ -77,10 +102,20 @@ void LinearArrangement::Loader::expand()
        obj.expand();
 }
 
+void LinearArrangement::Loader::spacing(unsigned s)
+{
+       obj.spacing(s);
+}
+
 void LinearArrangement::Loader::split()
 {
        obj.split();
 }
 
+void LinearArrangement::Loader::uniform(bool u)
+{
+       obj.set_uniform(u);
+}
+
 } // namespace GLtk
 } // namespace Msp