namespace Msp {
namespace GLtk {
-Column::Column(bool u):
- uniform(u)
+Column::Column(Layout &l):
+ Arrangement(l),
+ first(true),
+ split_here(false),
+ gravity(1)
{ }
-Layout::Slot *Column::create_slot(Widget &w)
+void Column::split()
{
- Slot *slot = new Slot(*this, w);
+ if(gravity<0)
+ throw arrangement_error("already split");
- if(!slots.empty())
+ split_here = true;
+ gravity = -1;
+}
+
+void Column::process_widget(Widget &wdg, Side side, bool aligned)
+{
+ if(side==TOP)
+ {
+ bool snug = (edges[BOTTOM].aligned && aligned && !split_here);
+ add_constraint(wdg, (snug ? Layout::BELOW : Layout::FAR_BELOW), BOTTOM);
+ if(first)
+ edges[TOP].add(wdg, aligned);
+ }
+ else if(side==BOTTOM)
+ next_bottom.add(wdg, (aligned && gravity<0));
+ else
{
- Slot &prev = *slots.back();
- slot->constraints.push_back(Constraint(BELOW, prev));
- slot->constraints.push_back(Constraint(ALIGN_LEFT, prev));
- slot->constraints.push_back(Constraint(ALIGN_RIGHT, prev));
- if(uniform)
- slot->constraints.push_back(Constraint(COPY_HEIGHT, prev));
- slot->horiz_pack.expand = true;
+ if(edges[side].aligned && aligned)
+ add_constraint(wdg, (side==LEFT ? Layout::ALIGN_LEFT : Layout::ALIGN_RIGHT), side);
+ edges[side].add(wdg, aligned);
}
+}
+
+void Column::finish_widget(Widget &wdg)
+{
+ layout.set_gravity(wdg, -1, gravity);
+}
- return slot;
+void Column::finish_slot()
+{
+ edges[BOTTOM] = next_bottom;
+ next_bottom.clear();
+ split_here = false;
+ first = false;
+}
+
+
+Column::Loader::Loader(Column &c):
+ DataFile::ObjectLoader<Column>(c)
+{
+ add("split", &Loader::split);
+}
+
+void Column::Loader::split()
+{
+ obj.split();
}
} // namespace GLtk