]> git.tdb.fi Git - libs/gltk.git/blob - source/arrangement.h
Allow overriding the spacing between two widgets in 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                 void align();
42         };
43
44         Layout &layout;
45         Arrangement *parent;
46         Edge edges[4];
47
48         Arrangement(Layout &);
49 public:
50         virtual ~Arrangement();
51
52         void arrange(Widget &);
53         void arrange(Arrangement &);
54
55 protected:
56         virtual void process_widget(Widget &, Side, bool) = 0;
57         virtual void finish_widget(Widget &) = 0;
58         virtual void finish_slot() = 0;
59         const Edge &get_edge(Side s) const { return edges[s]; }
60         void add_constraint(Widget &, Layout::ConstraintType, Side, int = -1);
61         void add_constraint(Widget &, Layout::ConstraintType, const Edge &, int = -1);
62
63         static Layout::ConstraintType get_order_constraint(Side, bool);
64         static Layout::ConstraintType get_align_constraint(Side);
65 };
66
67 } // namespace GLtk
68 } // namespace Msp
69
70 #endif