]> git.tdb.fi Git - libs/gltk.git/blob - source/lineararrangement.cpp
Rework how widget ownership works in Container
[libs/gltk.git] / source / lineararrangement.cpp
1 #include "lineararrangement.h"
2
3 namespace Msp {
4 namespace GLtk {
5
6 LinearArrangement::LinearArrangement(Layout &l, Side p):
7         Arrangement(l),
8         primary(p)
9 { }
10
11 void LinearArrangement::set_uniform(bool u)
12 {
13         uniform = u;
14         if(!uniform)
15                 uniform_ref = nullptr;
16 }
17
18 void LinearArrangement::split()
19 {
20         if(gravity==primary)
21                 throw arrangement_error("already split");
22
23         split_here = true;
24         gravity = primary;
25 }
26
27 void LinearArrangement::expand()
28 {
29         if(gravity==primary)
30                 throw arrangement_error("already split");
31         if(edges[primary].empty())
32                 throw arrangement_error("no widgets");
33
34         add_constraint(*edges[primary].widgets.front(), get_align_constraint(primary), primary);
35         layout.set_expand(*edges[primary].widgets.front(), (primary==LEFT || primary==RIGHT), (primary==TOP || primary==BOTTOM));
36         edges[primary].align();
37         gravity = primary;
38 }
39
40 void LinearArrangement::spacing(unsigned s)
41 {
42         next_spacing = s;
43 }
44
45 void LinearArrangement::process_widget(Widget &wdg, Side side, bool aligned)
46 {
47         if(side==opposite)
48         {
49                 bool snug = (internal_aligned && aligned && !split_here);
50                 add_constraint(wdg, get_order_constraint(primary, !snug), primary, next_spacing);
51                 if(first)
52                         edges[side].add(wdg, (aligned && gravity==opposite));
53         }
54         else if(side==primary)
55                 next.add(wdg, aligned);
56         else
57         {
58                 if(edges[side].aligned && aligned)
59                         add_constraint(wdg, get_align_constraint(side), side);
60                 edges[side].add(wdg, aligned);
61         }
62 }
63
64 void LinearArrangement::finish_widget(Widget &wdg)
65 {
66         if(uniform)
67         {
68                 if(!uniform_ref)
69                         uniform_ref = &wdg;
70                 else
71                 {
72                         Layout::ConstraintType ct = ((primary==LEFT || primary==RIGHT) ? Layout::COPY_WIDTH : Layout::COPY_HEIGHT);
73                         layout.add_constraint(wdg, ct, *uniform_ref);
74                 }
75         }
76 }
77
78 void LinearArrangement::finish_slot()
79 {
80         internal_aligned = next.aligned;
81         if(gravity!=primary)
82                 next.aligned = false;
83         edges[primary] = next;
84         next.clear();
85         split_here = false;
86         first = false;
87         next_spacing = -1;
88 }
89
90
91 LinearArrangement::Loader::Loader(LinearArrangement &c):
92         DataFile::ObjectLoader<LinearArrangement>(c)
93 {
94         add("expand", &Loader::expand);
95         add("spacing", &Loader::spacing);
96         add("split", &Loader::split);
97         add("uniform", &Loader::uniform);
98 }
99
100 void LinearArrangement::Loader::expand()
101 {
102         obj.expand();
103 }
104
105 void LinearArrangement::Loader::spacing(unsigned s)
106 {
107         obj.spacing(s);
108 }
109
110 void LinearArrangement::Loader::split()
111 {
112         obj.split();
113 }
114
115 void LinearArrangement::Loader::uniform(bool u)
116 {
117         obj.set_uniform(u);
118 }
119
120 } // namespace GLtk
121 } // namespace Msp