X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flineararrangement.cpp;h=fb2e71c180dac87aa81c41ec3fce0d6c80b06a4b;hb=HEAD;hp=891b858115f016b73900423d69b85a75df382e06;hpb=32539688068fad9614291159b069da10ead10f47;p=libs%2Fgltk.git diff --git a/source/lineararrangement.cpp b/source/lineararrangement.cpp index 891b858..269b68e 100644 --- a/source/lineararrangement.cpp +++ b/source/lineararrangement.cpp @@ -5,13 +5,16 @@ namespace GLtk { LinearArrangement::LinearArrangement(Layout &l, Side p): Arrangement(l), - primary(p), - opposite(static_cast((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) @@ -21,17 +24,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) @@ -40,19 +61,50 @@ 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; + 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(c) { + add("expand", &Loader::expand); + add("spacing", &Loader::spacing); add("split", &Loader::split); + add("uniform", &Loader::uniform); +} + +void LinearArrangement::Loader::expand() +{ + obj.expand(); +} + +void LinearArrangement::Loader::spacing(unsigned s) +{ + obj.spacing(s); } void LinearArrangement::Loader::split() @@ -60,5 +112,10 @@ void LinearArrangement::Loader::split() obj.split(); } +void LinearArrangement::Loader::uniform(bool u) +{ + obj.set_uniform(u); +} + } // namespace GLtk } // namespace Msp