]> git.tdb.fi Git - libs/gltk.git/blob - source/lineararrangement.cpp
Allow overriding the spacing between two widgets in LinearArrangement
[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         opposite(static_cast<Side>((primary+2)%4)),
10         first(true),
11         split_here(false),
12         gravity(opposite),
13         internal_aligned(false),
14         next_spacing(-1)
15 { }
16
17 void LinearArrangement::split()
18 {
19         if(gravity==primary)
20                 throw arrangement_error("already split");
21
22         split_here = true;
23         gravity = primary;
24 }
25
26 void LinearArrangement::expand()
27 {
28         if(gravity==primary)
29                 throw arrangement_error("already split");
30         if(edges[primary].empty())
31                 throw arrangement_error("no widgets");
32
33         add_constraint(*edges[primary].widgets.front(), get_align_constraint(primary), primary);
34         layout.set_expand(*edges[primary].widgets.front(), (primary==LEFT || primary==RIGHT), (primary==TOP || primary==BOTTOM));
35         edges[primary].align();
36         gravity = primary;
37 }
38
39 void LinearArrangement::spacing(unsigned s)
40 {
41         next_spacing = s;
42 }
43
44 void LinearArrangement::process_widget(Widget &wdg, Side side, bool aligned)
45 {
46         if(side==opposite)
47         {
48                 bool snug = (internal_aligned && aligned && !split_here);
49                 add_constraint(wdg, get_order_constraint(primary, !snug), primary, next_spacing);
50                 if(first)
51                         edges[side].add(wdg, (aligned && gravity==opposite));
52         }
53         else if(side==primary)
54                 next.add(wdg, aligned);
55         else
56         {
57                 if(edges[side].aligned && aligned)
58                         add_constraint(wdg, get_align_constraint(side), side);
59                 edges[side].add(wdg, aligned);
60         }
61 }
62
63 void LinearArrangement::finish_slot()
64 {
65         internal_aligned = next.aligned;
66         if(gravity!=primary)
67                 next.aligned = false;
68         edges[primary] = next;
69         next.clear();
70         split_here = false;
71         first = false;
72         next_spacing = -1;
73 }
74
75
76 LinearArrangement::Loader::Loader(LinearArrangement &c):
77         DataFile::ObjectLoader<LinearArrangement>(c)
78 {
79         add("expand", &Loader::expand);
80         add("spacing", &Loader::spacing);
81         add("split", &Loader::split);
82 }
83
84 void LinearArrangement::Loader::expand()
85 {
86         obj.expand();
87 }
88
89 void LinearArrangement::Loader::spacing(unsigned s)
90 {
91         obj.spacing(s);
92 }
93
94 void LinearArrangement::Loader::split()
95 {
96         obj.split();
97 }
98
99 } // namespace GLtk
100 } // namespace Msp