]> git.tdb.fi Git - libs/gltk.git/blobdiff - source/lineararrangement.cpp
Change Root::render to use the passed in Renderer
[libs/gltk.git] / source / lineararrangement.cpp
index 891b858115f016b73900423d69b85a75df382e06..fb2e71c180dac87aa81c41ec3fce0d6c80b06a4b 100644 (file)
@@ -9,7 +9,9 @@ LinearArrangement::LinearArrangement(Layout &l, Side p):
        opposite(static_cast<Side>((primary+2)%4)),
        first(true),
        split_here(false),
-       gravity(opposite)
+       gravity(opposite),
+       internal_aligned(false),
+       next_spacing(-1)
 { }
 
 void LinearArrangement::split()
@@ -21,17 +23,35 @@ void LinearArrangement::split()
        gravity = primary;
 }
 
+void LinearArrangement::expand()
+{
+       if(gravity==primary)
+               throw arrangement_error("already split");
+       if(edges[primary].empty())
+               throw arrangement_error("no widgets");
+
+       add_constraint(*edges[primary].widgets.front(), get_align_constraint(primary), primary);
+       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 = (edges[primary].aligned && aligned && !split_here);
-               add_constraint(wdg, get_order_constraint(primary, !snug), primary);
+               bool snug = (internal_aligned && aligned && !split_here);
+               add_constraint(wdg, get_order_constraint(primary, !snug), primary, next_spacing);
                if(first)
-                       edges[side].add(wdg, aligned);
+                       edges[side].add(wdg, (aligned && gravity==opposite));
        }
        else if(side==primary)
-               next.add(wdg, (aligned && gravity==primary));
+               next.add(wdg, aligned);
        else
        {
                if(edges[side].aligned && aligned)
@@ -42,19 +62,35 @@ void LinearArrangement::process_widget(Widget &wdg, Side side, bool aligned)
 
 void LinearArrangement::finish_slot()
 {
+       internal_aligned = next.aligned;
+       if(gravity!=primary)
+               next.aligned = false;
        edges[primary] = next;
        next.clear();
        split_here = false;
        first = false;
+       next_spacing = -1;
 }
 
 
 LinearArrangement::Loader::Loader(LinearArrangement &c):
        DataFile::ObjectLoader<LinearArrangement>(c)
 {
+       add("expand", &Loader::expand);
+       add("spacing", &Loader::spacing);
        add("split", &Loader::split);
 }
 
+void LinearArrangement::Loader::expand()
+{
+       obj.expand();
+}
+
+void LinearArrangement::Loader::spacing(unsigned s)
+{
+       obj.spacing(s);
+}
+
 void LinearArrangement::Loader::split()
 {
        obj.split();