]> git.tdb.fi Git - libs/gltk.git/blob - source/arrangement.h
Remove unnecessary destructors from exception classes
[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 #include "mspgltk_api.h"
8
9 namespace Msp {
10 namespace GLtk {
11
12 class Widget;
13
14 class MSPGLTK_API arrangement_error: public std::logic_error
15 {
16 public:
17         arrangement_error(const std::string &w): std::logic_error(w) { }
18 };
19
20 class MSPGLTK_API 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 = false;
35
36                 bool empty() { return widgets.empty(); }
37                 void clear();
38                 void add(Widget &, bool);
39                 void align();
40         };
41
42         Layout &layout;
43         Arrangement *parent = nullptr;
44         Edge edges[4];
45
46         Arrangement(Layout &);
47 public:
48         virtual ~Arrangement();
49
50         void arrange(Widget &);
51         void arrange(Arrangement &);
52
53 protected:
54         virtual void process_widget(Widget &, Side, bool) = 0;
55         virtual void finish_widget(Widget &) = 0;
56         virtual void finish_slot() = 0;
57         const Edge &get_edge(Side s) const { return edges[s]; }
58         void add_constraint(Widget &, Layout::ConstraintType, Side, int = -1);
59         void add_constraint(Widget &, Layout::ConstraintType, const Edge &, int = -1);
60
61         static Layout::ConstraintType get_order_constraint(Side, bool);
62         static Layout::ConstraintType get_align_constraint(Side);
63 };
64
65 } // namespace GLtk
66 } // namespace Msp
67
68 #endif