Edging ever closer to getting grids working right on Windows.

This commit is contained in:
Pietro Gagliardi 2016-06-14 21:55:14 -04:00
parent cf8c1c67fe
commit 106d4b544a
2 changed files with 39 additions and 26 deletions

View File

@ -179,7 +179,7 @@ struct uiGrid {
if (ymax < (gc.top + gc.yspan)) if (ymax < (gc.top + gc.yspan))
ymax = gc.top + gc.yspan; ymax = gc.top + gc.yspan;
} }
if (first == YES) // the entire grid is hidden; do nothing if (first != NO) // the entire grid is hidden; do nothing
return; return;
xcount = xmax - xmin; xcount = xmax - xmin;
ycount = ymax - ymin; ycount = ymax - ymin;

View File

@ -36,6 +36,34 @@ struct uiGrid {
int xmax, ymax; int xmax, ymax;
}; };
static bool gridRecomputeMinMax(uiGrid *g)
{
bool first = true;
for (struct gridChild *gc : *(g->children)) {
// this is important; we want g->xmin/g->ymin to satisfy gridLayoutData::visibleRow()/visibleColumn()
if (!uiControlVisible(gc->c))
continue;
if (first) {
g->xmin = gc->left;
g->ymin = gc->top;
g->xmax = gc->left + gc->xspan;
g->ymax = gc->top + gc->yspan;
first = false;
continue;
}
if (g->xmin > gc->left)
g->xmin = gc->left;
if (g->ymin > gc->top)
g->ymin = gc->top;
if (g->xmax < (gc->left + gc->xspan))
g->xmax = gc->left + gc->xspan;
if (g->ymax < (gc->top + gc->yspan))
g->ymax = gc->top + gc->yspan;
}
return first != false;
}
#define xcount(g) ((g)->xmax - (g)->xmin) #define xcount(g) ((g)->xmax - (g)->xmin)
#define ycount(g) ((g)->ymax - (g)->ymin) #define ycount(g) ((g)->ymax - (g)->ymin)
#define toxindex(g, x) ((x) - (g)->xmin) #define toxindex(g, x) ((x) - (g)->xmin)
@ -52,11 +80,15 @@ public:
int nVisibleRows; int nVisibleRows;
int nVisibleColumns; int nVisibleColumns;
bool noVisible;
gridLayoutData(uiGrid *g) gridLayoutData(uiGrid *g)
{ {
size_t i; size_t i;
int x, y; int x, y;
this->noVisible = gridRecomputeMinMax(g);
this->gg = new int *[ycount(g)]; this->gg = new int *[ycount(g)];
for (y = 0; y < ycount(g); y++) { for (y = 0; y < ycount(g); y++) {
this->gg[y] = new int[xcount(g)]; this->gg[y] = new int[xcount(g)];
@ -89,6 +121,8 @@ public:
// if a row or column only contains emptys and spanning cells of a opposite-direction spannings, it is invisible and should not be considered for padding amount calculations // if a row or column only contains emptys and spanning cells of a opposite-direction spannings, it is invisible and should not be considered for padding amount calculations
// furthermore, remove it by duplicating the previous row or column // furthermore, remove it by duplicating the previous row or column
// note that the first row and column will always be visible because the first for loop above computed a smallest fitting rectangle // note that the first row and column will always be visible because the first for loop above computed a smallest fitting rectangle
if (this->noVisible)
return;
this->nVisibleRows = 0; this->nVisibleRows = 0;
for (y = 0; y < this->ycount; y++) for (y = 0; y < this->ycount; y++)
if (this->visibleRow(g, y)) if (this->visibleRow(g, y))
@ -183,6 +217,8 @@ static void gridRelayout(uiGrid *g)
gridPadding(g, &xpadding, &ypadding); gridPadding(g, &xpadding, &ypadding);
ld = new gridLayoutData(g); ld = new gridLayoutData(g);
if (ld->noVisible) // nothing to do
return;
// 0) discount padding from width/height // 0) discount padding from width/height
width -= (ld->nVisibleColumns - 1) * xpadding; width -= (ld->nVisibleColumns - 1) * xpadding;
@ -252,7 +288,6 @@ static void gridRelayout(uiGrid *g)
} }
} }
// 4) compute and assign expanded widths/heights // 4) compute and assign expanded widths/heights
nhexpand = 0; nhexpand = 0;
nvexpand = 0; nvexpand = 0;
@ -434,6 +469,8 @@ static void uiGridMinimumSize(uiWindowsControl *c, int *width, int *height)
gridPadding(g, &xpadding, &ypadding); gridPadding(g, &xpadding, &ypadding);
ld = new gridLayoutData(g); ld = new gridLayoutData(g);
if (ld->noVisible) // nothing to do; return 0x0
return;
// 1) compute colwidths and rowheights before handling expansion // 1) compute colwidths and rowheights before handling expansion
// TODO put this in its own function (but careful about the spanning calculation in gridRelayout()) // TODO put this in its own function (but careful about the spanning calculation in gridRelayout())
@ -520,30 +557,6 @@ static void gridArrangeChildren(uiGrid *g)
delete ld; delete ld;
} }
static void gridRecomputeMinMax(uiGrid *g)
{
bool first = true;
for (struct gridChild *gc : *(g->children)) {
if (first) {
g->xmin = gc->left;
g->ymin = gc->top;
g->xmax = gc->left + gc->xspan;
g->ymax = gc->top + gc->yspan;
first = false;
continue;
}
if (g->xmin > gc->left)
g->xmin = gc->left;
if (g->ymin > gc->top)
g->ymin = gc->top;
if (g->xmax < (gc->left + gc->xspan))
g->xmax = gc->left + gc->xspan;
if (g->ymax < (gc->top + gc->yspan))
g->ymax = gc->top + gc->yspan;
}
}
static struct gridChild *toChild(uiControl *c, int xspan, int yspan, int hexpand, uiAlign halign, int vexpand, uiAlign valign) static struct gridChild *toChild(uiControl *c, int xspan, int yspan, int hexpand, uiAlign halign, int vexpand, uiAlign valign)
{ {
struct gridChild *gc; struct gridChild *gc;