]> git.tdb.fi Git - libs/gltk.git/blob - source/arrangement.h
Combine common parts of Column and Row into LinearArrangement
[libs/gltk.git] / source / arrangement.h
1 #ifndef MSP_GLTK_ARRANGEMENT_H_
2 #define MSP_GLTK_ARRANGEMENT_H_
3
4 #include <list>
5 #include <stdexcept>
6 #include "layout.h"
7
8 namespace Msp {
9 namespace GLtk {
10
11 class Widget;
12
13 class arrangement_error: public std::logic_error
14 {
15 public:
16         arrangement_error(const std::string &w): std::logic_error(w) { }
17         virtual ~arrangement_error() throw() { }
18 };
19
20 class Arrangement
21 {
22 protected:
23         enum Side
24         {
25                 TOP,
26                 RIGHT,
27                 BOTTOM,
28                 LEFT
29         };
30
31         struct Edge
32         {
33                 std::list<Widget *> widgets;
34                 bool aligned;
35
36                 Edge();
37
38                 bool empty() { return widgets.empty(); }
39                 void clear();
40                 void add(Widget &, bool);
41         };
42
43         Layout &layout;
44         Arrangement *parent;
45         Edge edges[4];
46
47         Arrangement(Layout &);
48 public:
49         virtual ~Arrangement();
50
51         void arrange(Widget &);
52         void arrange(Arrangement &);
53
54 protected:
55         virtual void process_widget(Widget &, Side, bool) = 0;
56         virtual void finish_widget(Widget &) = 0;
57         virtual void finish_slot() = 0;
58         const Edge &get_edge(Side s) const { return edges[s]; }
59         void add_constraint(Widget &, Layout::ConstraintType, Side);
60         void add_constraint(Widget &, Layout::ConstraintType, const Edge &);
61
62         static Layout::ConstraintType get_order_constraint(Side, bool);
63         static Layout::ConstraintType get_align_constraint(Side);
64 };
65
66 } // namespace GLtk
67 } // namespace Msp
68
69 #endif