void BC_WidgetGrid::calculate_maxs(){ int r,c; for (r = 0; r < BC_WG_Rows; r++) { maxh[r] = minh[r]; for (c = 0; c < BC_WG_Cols; c++) { if ((widget_rowspan[r][c] == 1) && (getw_h(r,c) > maxh[r])) maxh[r] = getw_h(r,c); } } for (c = 0; c < BC_WG_Cols; c++) { maxw[c] = minw[c]; for (r = 0; r < BC_WG_Rows; r++) { if ((widget_colspan[r][c] == 1) && (getw_w(r,c) > maxw[c])) maxw[c] = getw_w(r,c); } } // Fix up for row & colspans: for (c = 0; c < BC_WG_Cols; c++) { for (r = 0; r < BC_WG_Rows; r++) { int c_cs = MIN(BC_WG_Cols - c + 1, widget_colspan[r][c]); int c_rs = MIN(BC_WG_Rows - c + 1, widget_rowspan[r][c]); if ((widget_colspan[r][c] > 1)) { int csw = 0; int c2; for (c2 = c; c2 < c + c_cs; c2++) { csw += maxw[c2]; } if (csw < getw_w(r,c)) { for (c2 = c; c2 < c + c_cs; c2++) { maxw[c2] += (csw - getw_w(r,c))/c_cs; } } } if ((widget_rowspan[r][c] > 1)) { int csh = 0; int r2; for (r2 = c; r2 < r + c_rs; r2++) { csh += maxh[r2]; } if (csh < getw_h(r,c)) { for (r2 = c; r2 < r + c_rs; r2++) { maxh[r2] += (csh - getw_h(r,c))/c_rs; } } } } } }
void BC_WidgetGrid::move_widgets(){ calculate_maxs(); int r,c,x,y; int xn,yn; y = y_t; for (r = 0; r < BC_WG_Rows; r++) { x = x_l; for (c = 0; c < BC_WG_Cols; c++) { switch (widget_valign[r][c]){ default: case VALIGN_TOP: yn = y; break; case VALIGN_CENTER: yn = y + (maxh[r] - getw_h(r,c))/2; break; case VALIGN_BOTTOM: yn = y + (maxh[r] - getw_h(r,c)); break; } switch (widget_halign[r][c]){ default: case HALIGN_LEFT: xn = x; break; case HALIGN_CENTER: xn = x + (maxw[c] - getw_w(r,c))/2; break; case HALIGN_RIGHT: xn = x + (maxw[c] - getw_w(r,c)); break; } setw_position(r,c,xn,yn); // + (maxh[r] - getw_h(r,c))/2); x += colgaps + maxw[c]; } y += rowgaps + maxh[r]; } }
void BC_WidgetGrid::print(){ 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); calculate_maxs(); for (int r = 0; r < BC_WG_Rows; r++) { for (int c = 0; c < BC_WG_Cols; c++) { printf("%d,%d\t",getw_w(r,c),getw_h(r,c)); } printf("MAX: %d\n",maxh[r]); } printf("---------------------------------------------\n"); for (int c = 0; c < BC_WG_Cols; c++) printf("%d\t",maxw[c]); printf("\n\n"); }