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