r717: Made the highlighted text color of the menus WHITE
[cinelerra_cv/mob.git] / guicast / bcwidgetgrid.C
blob08706ebfc62eede7efaf1386b05b9d10b0304499
1 #include "bctitle.h"
2 #include "bcpot.h"
3 #include "bcslider.h"
4 #include "bcwidgetgrid.h"
7 BC_WidgetGrid::BC_WidgetGrid(int x1, int y1, int x2, int y2,int cgs,int rgs){
8         x_l = x1;  // x position
9         y_t = y1;  // y position
10         x_r = x2;  // right margin (used only in get_w_wm)
11         y_b = y2;  // left margin (used only in get_w_wm)
12         rowgaps = rgs; 
13         colgaps = cgs;
15         for (int r = 0; r < BC_WG_Rows; r++)
16                 for (int c = 0; c < BC_WG_Cols; c++) {
17                         widget_types[r][c] = BC_WT_NONE;
18                         widget_valign[r][c] = VALIGN_CENTER;
19                         widget_halign[r][c] = HALIGN_LEFT;
20                 }
23 BC_RelocatableWidget * BC_WidgetGrid::add(BC_RelocatableWidget *h, int row, int column) {
24         widget_types[row][column] = BC_WT_RelocatableWidget;
25         widget_widgs[row][column] = h;
26         return(h);
29 int BC_WidgetGrid::getw_h(int row, int column) {
30         switch (widget_types[row][column]) {
31         case BC_WT_NONE:
32                 return(0);
33         case BC_WT_RelocatableWidget: 
34                 return(widget_widgs[row][column]->get_h());
35         }
38 int BC_WidgetGrid::getw_w(int row, int column) {
39         switch (widget_types[row][column]) {
40         case BC_WT_NONE:
41                 return(0);
42         case BC_WT_RelocatableWidget: 
43                 return(widget_widgs[row][column]->get_w());
44         }
47 void BC_WidgetGrid::setw_position(int row,int column,int x, int y) {
48         switch (widget_types[row][column]) {
49         case BC_WT_NONE:
50                 break;
51         case BC_WT_RelocatableWidget: 
52                 widget_widgs[row][column]->reposition_widget(x,y);
53                 break;
54         }
57 void BC_WidgetGrid::clear_widget(int row, int column){
58         widget_types[row][column] = BC_WT_NONE;
61 int BC_WidgetGrid::guess_x(int colno){
62         calculate_maxs();
63         int x = x_l;
64         for (int i = 0; i < colno; i++)
65                 x += maxw[i] + colgaps;
66         return (x);
69 int BC_WidgetGrid::guess_y(int colno){
70         calculate_maxs();
71         int y = y_t;
72         for (int i = 0; i < colno; i++)
73                 y += maxh[i] + rowgaps;
74         return (y);
77 int BC_WidgetGrid::get_w_wm(){
78         return (x_l + get_w() + x_r);
82 int BC_WidgetGrid::get_w(){
83         calculate_maxs();
84         int x = 0;
85         for (int i = 0; i < BC_WG_Cols; i++)
86                 if (maxw[i] > 0)
87                         x += maxw[i] + colgaps;
88         return (x);
91 int BC_WidgetGrid::get_h_wm(){
92         return (y_t + get_h() + y_b);
95 int BC_WidgetGrid::get_h(){
96         calculate_maxs();
97         int y = 0;
98         for (int i = 0; i < BC_WG_Rows; i++)
99                 if (maxh[i] > 0)
100                         y += maxh[i] + rowgaps;
101         return (y);
104 void BC_WidgetGrid::set_align(int r,int c,int va, int ha){
105         widget_valign[r][c] = va;
106         widget_halign[r][c] = ha;
109 int BC_WidgetGrid::reposition_widget(int x, int y, int w1, int h){
110         x_l = x;
111         y_t = y;
112         move_widgets();
113         return(0);
116 void BC_WidgetGrid::move_widgets(){
117         calculate_maxs();
118         int r,c,x,y;
119         int xn,yn;
120         y = y_t;
121         for (r = 0; r < BC_WG_Rows; r++) {
122                 x = x_l;
123                 for (c = 0; c < BC_WG_Cols; c++) {
124                         switch (widget_valign[r][c]){
125                         case VALIGN_TOP:
126                                 yn = y;
127                                 break;
128                         case VALIGN_CENTER:
129                                 yn = y + (maxh[r] - getw_h(r,c))/2;
130                                 break;
131                         case VALIGN_BOTTOM:
132                                 yn = y + (maxh[r] - getw_h(r,c));
133                                 break;
134                         }
135                                 
136                         switch (widget_halign[r][c]){
137                         case HALIGN_LEFT:
138                                 xn = x;
139                                 break;
140                         case HALIGN_CENTER:
141                                 xn = x + (maxw[c] - getw_w(r,c))/2;
142                                 break;
143                         case HALIGN_RIGHT:
144                                 xn = x + (maxw[c] - getw_w(r,c));
145                                 break;
146                         }
147                         setw_position(r,c,xn,yn); // + (maxh[r] - getw_h(r,c))/2);
148                         x += colgaps + maxw[c];
149                 }
150                 y += rowgaps + maxh[r];
151         }
154 void BC_WidgetGrid::calculate_maxs(){
155         int r,c;
156         for (r = 0; r < BC_WG_Rows; r++) {
157                 maxh[r] = 0;
158                 for (c = 0; c < BC_WG_Cols; c++) {
159                         if (getw_h(r,c) > maxh[r])
160                                 maxh[r] = getw_h(r,c);
161                 }
162         }
163         for (c = 0; c < BC_WG_Cols; c++) {
164                 maxw[c] = 0;
165                 for (r = 0; r < BC_WG_Rows; r++) {
166                         if (getw_w(r,c) > maxw[c])
167                                 maxw[c] = getw_w(r,c);
168                 }
169         }
172 void BC_WidgetGrid::print(){
173         printf("\nWidget Grid: Widths: x_l=%d y_t=%d x_r=%d y_b=%d\n",x_l,y_t,x_r,y_b);
174         calculate_maxs();
175         for (int r = 0; r < BC_WG_Rows; r++) {
176                 for (int c = 0; c < BC_WG_Cols; c++) {
177                         printf("%d,%d\t",getw_w(r,c),getw_h(r,c));
178                 }
179                 printf("MAX: %d\n",maxh[r]);
180         }
181         printf("---------------------------------------------\n");
182         for (int c = 0; c < BC_WG_Cols; c++) 
183                 printf("%d\t",maxw[c]);
184         printf("\n\n");