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