Getting closer. Adding hidden views makes things harder... hm.
This commit is contained in:
parent
96ce336a8b
commit
0a4a8ae4f3
|
@ -21,6 +21,7 @@ This README is being written.<br>
|
||||||
* **14 June 2016**
|
* **14 June 2016**
|
||||||
* uiDarwinControl now has a `ChildVisibilityChanged()` method and a corresponding `NotifyVisibilityChanged()` function that is called by the default show/hide handlers. This is used to make visibility changes work on OS X; uiBox, uiForm, and uiGrid all respect these now.
|
* uiDarwinControl now has a `ChildVisibilityChanged()` method and a corresponding `NotifyVisibilityChanged()` function that is called by the default show/hide handlers. This is used to make visibility changes work on OS X; uiBox, uiForm, and uiGrid all respect these now.
|
||||||
* The same has been done on the Windows side as well.
|
* The same has been done on the Windows side as well.
|
||||||
|
* Hiding and showing controls and padding calculations are now correct on Windows at long last.
|
||||||
* Hiding a control in a uiForm now hides its label on all platforms.
|
* Hiding a control in a uiForm now hides its label on all platforms.
|
||||||
|
|
||||||
* **13 June 2016**
|
* **13 June 2016**
|
||||||
|
|
|
@ -42,13 +42,15 @@ struct uiGrid {
|
||||||
#define toyindex(g, y) ((y) - (g)->ymin)
|
#define toyindex(g, y) ((y) - (g)->ymin)
|
||||||
|
|
||||||
class gridLayoutData {
|
class gridLayoutData {
|
||||||
size_t ycount;
|
int ycount;
|
||||||
public:
|
public:
|
||||||
int **gg; // topological map gg[y][x] = control index
|
int **gg; // topological map gg[y][x] = control index
|
||||||
int *colwidths;
|
int *colwidths;
|
||||||
int *rowheights;
|
int *rowheights;
|
||||||
bool *hexpand;
|
bool *hexpand;
|
||||||
bool *vexpand;
|
bool *vexpand;
|
||||||
|
int nVisibleRows;
|
||||||
|
int nVisibleColumns;
|
||||||
|
|
||||||
gridLayoutData(uiGrid *g)
|
gridLayoutData(uiGrid *g)
|
||||||
{
|
{
|
||||||
|
@ -83,6 +85,24 @@ public:
|
||||||
ZeroMemory(this->vexpand, ycount(g) * sizeof (bool));
|
ZeroMemory(this->vexpand, ycount(g) * sizeof (bool));
|
||||||
|
|
||||||
this->ycount = ycount(g);
|
this->ycount = ycount(g);
|
||||||
|
|
||||||
|
// 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
|
||||||
|
// note that the first row and column will always be visible because the first for loop above computed a smallest fitting rectangle
|
||||||
|
this->nVisibleRows = 0;
|
||||||
|
for (y = 0; y < this->ycount; y++)
|
||||||
|
if (this->visibleRow(g, y))
|
||||||
|
this->nVisibleRows++;
|
||||||
|
else
|
||||||
|
for (x = 0; x < xcount(g); x++)
|
||||||
|
this->gg[y][x] = this->gg[y - 1][x];
|
||||||
|
this->nVisibleColumns = 0;
|
||||||
|
for (x = 0; x < xcount(g); x++)
|
||||||
|
if (this->visibleColumn(g, x))
|
||||||
|
this->nVisibleColumns++;
|
||||||
|
else
|
||||||
|
for (y = 0; y < ycount(g); y++)
|
||||||
|
this->gg[y][x] = this->gg[y][x - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
~gridLayoutData()
|
~gridLayoutData()
|
||||||
|
@ -97,6 +117,35 @@ public:
|
||||||
delete[] this->gg[y];
|
delete[] this->gg[y];
|
||||||
delete[] this->gg;
|
delete[] this->gg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool visibleRow(uiGrid *g, int y)
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
struct gridChild *gc;
|
||||||
|
|
||||||
|
for (x = 0; x < xcount(g); x++)
|
||||||
|
if (this->gg[y][x] != -1) {
|
||||||
|
gc = (*(g->children))[this->gg[y][x]];
|
||||||
|
if (gc->yspan == 1 || gc->top - g->ymin == y)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool visibleColumn(uiGrid *g, int x)
|
||||||
|
{
|
||||||
|
int y;
|
||||||
|
struct gridChild *gc;
|
||||||
|
|
||||||
|
for (y = 0; y < this->ycount; y++)
|
||||||
|
if (this->gg[y][x] != -1) {
|
||||||
|
gc = (*(g->children))[this->gg[y][x]];
|
||||||
|
if (gc->xspan == 1 || gc->left - g->xmin == x)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static void gridPadding(uiGrid *g, int *xpadding, int *ypadding)
|
static void gridPadding(uiGrid *g, int *xpadding, int *ypadding)
|
||||||
|
@ -136,9 +185,8 @@ static void gridRelayout(uiGrid *g)
|
||||||
ld = new gridLayoutData(g);
|
ld = new gridLayoutData(g);
|
||||||
|
|
||||||
// 0) discount padding from width/height
|
// 0) discount padding from width/height
|
||||||
// TODO this doesn't work if any rows or columns are completely blank
|
width -= (ld->nVisibleColumns - 1) * xpadding;
|
||||||
width -= (xcount(g) - 1) * xpadding;
|
height -= (ld->nVisibleRows - 1) * ypadding;
|
||||||
height -= (ycount(g) - 1) * ypadding;
|
|
||||||
|
|
||||||
// 1) compute colwidths and rowheights before handling expansion
|
// 1) compute colwidths and rowheights before handling expansion
|
||||||
// we only count non-spanning controls to avoid weirdness
|
// we only count non-spanning controls to avoid weirdness
|
||||||
|
@ -415,10 +463,8 @@ static void uiGridMinimumSize(uiWindowsControl *c, int *width, int *height)
|
||||||
rowheight += ld->rowheights[y];
|
rowheight += ld->rowheights[y];
|
||||||
|
|
||||||
// and that's it; just account for padding
|
// and that's it; just account for padding
|
||||||
// TODO this is wrong if any columns or rows are completely empty
|
*width = colwidth + (ld->nVisibleColumns - 1) * xpadding;
|
||||||
// TODO this seems to be wrong in general...
|
*height = rowheight + (ld->nVisibleRows - 1) * ypadding;
|
||||||
*width = colwidth + (g->xmax - 1) * xpadding;
|
|
||||||
*height = rowheight + (g->ymax - 1) * ypadding;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void uiGridMinimumSizeChanged(uiWindowsControl *c)
|
static void uiGridMinimumSizeChanged(uiWindowsControl *c)
|
||||||
|
|
Loading…
Reference in New Issue