]> git.tdb.fi Git - libs/gltk.git/blobdiff - source/arrangement.cpp
Replace the derived layout classes with a more flexible design
[libs/gltk.git] / source / arrangement.cpp
diff --git a/source/arrangement.cpp b/source/arrangement.cpp
new file mode 100644 (file)
index 0000000..ec890ef
--- /dev/null
@@ -0,0 +1,75 @@
+#include "arrangement.h"
+
+using namespace std;
+
+namespace Msp {
+namespace GLtk {
+
+Arrangement::Arrangement(Layout &l):
+       layout(l),
+       parent(layout.get_arrangement())
+{
+       layout.push_arrangement(*this);
+}
+
+Arrangement::~Arrangement()
+{
+       layout.pop_arrangement(*this);
+}
+
+void Arrangement::arrange(Widget &wdg)
+{
+       for(unsigned i=0; i<4; ++i)
+               process_widget(wdg, static_cast<Side>(i), true);
+       finish_widget(wdg);
+       finish_slot();
+}
+
+void Arrangement::arrange(Arrangement &arr)
+{
+       for(unsigned i=0; i<4; ++i)
+       {
+               Side side = static_cast<Side>(i);
+               const Edge &edge = arr.get_edge(side);
+               for(list<Widget *>::const_iterator j=edge.widgets.begin(); j!=edge.widgets.end(); ++j)
+                       process_widget(**j, side, edge.aligned);
+       }
+       finish_slot();
+}
+
+void Arrangement::add_constraint(Widget &wdg, Layout::ConstraintType type, Side side)
+{
+       add_constraint(wdg, type, edges[side]);
+}
+
+void Arrangement::add_constraint(Widget &wdg, Layout::ConstraintType type, const Edge &edge)
+{
+       for(list<Widget *>::const_iterator i=edge.widgets.begin(); i!=edge.widgets.end(); ++i)
+               layout.add_constraint(wdg, type, **i);
+}
+
+
+Arrangement::Edge::Edge():
+       aligned(false)
+{ }
+
+void Arrangement::Edge::clear()
+{
+       widgets.clear();
+       aligned = false;
+}
+
+void Arrangement::Edge::add(Widget &wdg, bool algn)
+{
+       if(aligned)
+               return;
+
+       if(algn)
+               widgets.clear();
+
+       widgets.push_back(&wdg);
+       aligned = algn;
+}
+
+} // namespace GLtk
+} // namespace Msp