]> git.tdb.fi Git - libs/gltk.git/blob - source/grid.cpp
Replace the derived layout classes with a more flexible design
[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 } // namespace GLtk
88 } // namespace Msp