]> git.tdb.fi Git - libs/gltk.git/blob - source/grid.cpp
c8631cf84bc6d6b6e8ed4ac714a2c9dac1e44213
[libs/gltk.git] / source / grid.cpp
1 #include "grid.h"
2
3 namespace Msp {
4 namespace GLtk {
5
6 Grid::Grid(Layout &l, unsigned c):
7         Arrangement(l),
8         columns(c)
9 { }
10
11 void Grid::skip()
12 {
13         finish_slot();
14 }
15
16 void Grid::next_row()
17 {
18         if(row_bottom.empty())
19                 throw arrangement_error("empty row not allowed");
20
21         finish_row();
22 }
23
24 void Grid::process_widget(Widget &wdg, Side side, bool aligned)
25 {
26         if(side==TOP)
27         {
28                 Edge &top_edge = (first_row ? edges[TOP] : row_top);
29                 if(top_edge.aligned && aligned)
30                         add_constraint(wdg, Layout::ALIGN_TOP, top_edge);
31
32                 bool snug = (edges[BOTTOM].aligned && aligned);
33                 add_constraint(wdg, (snug ? Layout::BELOW : Layout::FAR_BELOW), BOTTOM);
34
35                 top_edge.add(wdg, aligned);
36         }
37         else if(side==BOTTOM)
38         {
39                 if(row_bottom.aligned && aligned)
40                         add_constraint(wdg, Layout::ALIGN_BOTTOM, row_bottom);
41
42                 row_bottom.add(wdg, aligned);
43         }
44         else if(side==LEFT)
45         {
46                 if(columns[column].left.aligned && aligned)
47                         add_constraint(wdg, Layout::ALIGN_LEFT, columns[column].left);
48                 else if(column>0)
49                 {
50                         bool snug = (columns[column-1].right.aligned && aligned);
51                         add_constraint(wdg, (snug ? Layout::RIGHT_OF : Layout::FAR_RIGHT_OF), columns[column-1].right);
52                 }
53
54                 edges[LEFT].add(wdg, (aligned && !column));
55                 columns[column].left.add(wdg, aligned);
56         }
57         else if(side==RIGHT)
58         {
59                 if(columns[column].right.aligned && aligned)
60                         add_constraint(wdg, Layout::ALIGN_RIGHT, columns[column].right);
61
62                 edges[RIGHT].add(wdg, (aligned && column+1==columns.size()));
63                 columns[column].right.add(wdg, aligned);
64         }
65 }
66
67 void Grid::finish_widget(Widget &wdg)
68 {
69         layout.set_gravity(wdg, -1, 1);
70 }
71
72 void Grid::finish_slot()
73 {
74         ++column;
75         if(column==columns.size())
76                 finish_row();
77 }
78
79 void Grid::finish_row()
80 {
81         edges[BOTTOM] = row_bottom;
82         row_bottom.clear();
83         row_top.clear();
84         first_row = false;
85         column = 0;
86 }
87
88
89 Grid::Loader::Loader(Grid &g):
90         DataFile::ObjectLoader<Grid>(g)
91 {
92         add("next_row", &Loader::next_row);
93         add("skip",     &Loader::skip);
94 }
95
96 void Grid::Loader::next_row()
97 {
98         obj.next_row();
99 }
100
101 void Grid::Loader::skip()
102 {
103         obj.skip();
104 }
105
106 } // namespace GLtk
107 } // namespace Msp