1 #include "arrangement.h"
8 Arrangement::Arrangement(Layout &l):
10 parent(layout.get_arrangement())
12 layout.push_arrangement(*this);
15 Arrangement::~Arrangement()
17 layout.pop_arrangement(*this);
20 void Arrangement::arrange(Widget &wdg)
22 for(unsigned i=0; i<4; ++i)
23 process_widget(wdg, static_cast<Side>(i), true);
28 void Arrangement::arrange(Arrangement &arr)
30 for(unsigned i=0; i<4; ++i)
32 Side side = static_cast<Side>(i);
33 const Edge &edge = arr.get_edge(side);
34 for(Widget *w: edge.widgets)
35 process_widget(*w, side, edge.aligned);
40 void Arrangement::add_constraint(Widget &wdg, Layout::ConstraintType type, Side side, int spacing)
42 add_constraint(wdg, type, edges[side], spacing);
45 void Arrangement::add_constraint(Widget &wdg, Layout::ConstraintType type, const Edge &edge, int spacing)
47 for(Widget *w: edge.widgets)
51 layout.add_constraint(wdg, type, *w);
53 layout.add_constraint(wdg, type, *w, spacing);
57 Layout::ConstraintType Arrangement::get_order_constraint(Side s, bool slack)
61 case TOP: return (slack ? Layout::FAR_ABOVE : Layout::ABOVE);
62 case RIGHT: return (slack ? Layout::FAR_RIGHT_OF : Layout::RIGHT_OF);
63 case BOTTOM: return (slack ? Layout::FAR_BELOW : Layout::BELOW);
64 case LEFT: return (slack ? Layout::FAR_LEFT_OF : Layout::LEFT_OF);
65 default: throw invalid_argument("Arrangement::get_align_constraint");
69 Layout::ConstraintType Arrangement::get_align_constraint(Side s)
73 case TOP: return Layout::ALIGN_TOP;
74 case RIGHT: return Layout::ALIGN_RIGHT;
75 case BOTTOM: return Layout::ALIGN_BOTTOM;
76 case LEFT: return Layout::ALIGN_LEFT;
77 default: throw invalid_argument("Arrangement::get_align_constraint");
82 void Arrangement::Edge::clear()
88 void Arrangement::Edge::add(Widget &wdg, bool algn)
96 widgets.push_back(&wdg);
100 void Arrangement::Edge::align()
102 if(aligned || widgets.empty())
105 auto second = widgets.begin();
108 widgets.erase(second, widgets.end());