opposite(static_cast<Side>((primary+2)%4)),
first(true),
split_here(false),
- gravity(opposite)
+ gravity(opposite),
+ internal_aligned(false),
+ uniform(false),
+ uniform_ref(0),
+ next_spacing(-1)
{ }
+void LinearArrangement::set_uniform(bool u)
+{
+ uniform = u;
+ if(!uniform)
+ uniform_ref = 0;
+}
+
void LinearArrangement::split()
{
if(gravity==primary)
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)
}
}
+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<LinearArrangement>(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()
obj.split();
}
+void LinearArrangement::Loader::uniform(bool u)
+{
+ obj.set_uniform(u);
+}
+
} // namespace GLtk
} // namespace Msp