Browse Source

oui: don't include margin in size computation if element has no size

pull/1/head
Leonard Ritter 10 years ago
parent
commit
26363d982e
1 changed files with 33 additions and 29 deletions
  1. +33
    -29
      oui.h

+ 33
- 29
oui.h View File

@@ -843,7 +843,9 @@ int uiGetRelToDown(int item) {
UI_INLINE int uiComputeChainSize(UIitem *pkid, int dim) {
UIitem *pitem = pkid;
int wdim = dim+2;
int size = pitem->rect.v[wdim] + pitem->margins[dim] + pitem->margins[wdim];
int size = 0;
if (pitem->rect.v[wdim])
size = pitem->rect.v[wdim] + pitem->margins[dim] + pitem->margins[wdim];
int it = 0;
pitem->visited |= 1<<dim;
// traverse along left neighbors
@@ -851,7 +853,8 @@ UI_INLINE int uiComputeChainSize(UIitem *pkid, int dim) {
if (pitem->relto[dim] < 0) break;
pitem = uiItemPtr(pitem->relto[dim]);
pitem->visited |= 1<<dim;
size += pitem->rect.v[wdim] + pitem->margins[dim] + pitem->margins[wdim];
if (pitem->rect.v[wdim])
size += pitem->rect.v[wdim] + pitem->margins[dim] + pitem->margins[wdim];
it++;
assert(it<1000000); // infinite loop
}
@@ -862,7 +865,8 @@ UI_INLINE int uiComputeChainSize(UIitem *pkid, int dim) {
if (pitem->relto[wdim] < 0) break;
pitem = uiItemPtr(pitem->relto[wdim]);
pitem->visited |= 1<<dim;
size += pitem->rect.v[wdim] + pitem->margins[dim] + pitem->margins[wdim];
if (pitem->rect.v[wdim])
size += pitem->rect.v[wdim] + pitem->margins[dim] + pitem->margins[wdim];
it++;
assert(it<1000000); // infinite loop
}
@@ -871,21 +875,21 @@ UI_INLINE int uiComputeChainSize(UIitem *pkid, int dim) {

UI_INLINE void uiComputeSizeDim(UIitem *pitem, int dim) {
int wdim = dim+2;
int size = 0;
int kid = pitem->firstkid;
while (kid >= 0) {
UIitem *pkid = uiItemPtr(kid);
if (!(pkid->visited & (1<<dim))) {
size = ui_max(size, uiComputeChainSize(pkid, dim));
}
kid = uiNextSibling(kid);
}
pitem->computed_size.v[dim] = size;
if (pitem->size.v[dim]) {
pitem->rect.v[wdim] = pitem->size.v[dim];
} else {
int size = 0;
int kid = pitem->firstkid;
while (kid >= 0) {
UIitem *pkid = uiItemPtr(kid);
if (!(pkid->visited & (1<<dim))) {
size = ui_max(size, uiComputeChainSize(pkid, dim));
}
kid = uiNextSibling(kid);
}
pitem->rect.v[wdim] = size;
pitem->computed_size.v[dim] = size;
}
}

@@ -913,8 +917,8 @@ static void uiLayoutChildItem(UIitem *pparent, UIitem *pitem, int *dyncount, int
int wdim = dim+2;
int wl = 0;
int wr = pparent->rect.v[wdim];
int x = 0;
int s = pparent->rect.v[wdim];
int flags = pitem->layout_flags>>dim;
int hasl = (flags & UI_LEFT) && (pitem->relto[dim] >= 0);
@@ -923,47 +927,47 @@ static void uiLayoutChildItem(UIitem *pparent, UIitem *pitem, int *dyncount, int
if (hasl) {
UIitem *pl = uiItemPtr(pitem->relto[dim]);
uiLayoutChildItem(pparent, pl, dyncount, dim);
wl = pl->rect.v[dim]+pl->rect.v[wdim]+pl->margins[wdim];
wr -= wl;
x = pl->rect.v[dim]+pl->rect.v[wdim]+pl->margins[wdim];
s -= x;
}
if (hasr) {
UIitem *pl = uiItemPtr(pitem->relto[wdim]);
uiLayoutChildItem(pparent, pl, dyncount, dim);
wr = pl->rect.v[dim]-pl->margins[dim]-wl;
s = pl->rect.v[dim]-pl->margins[dim]-x;
}

switch(flags & UI_HFILL) {
default:
case UI_HCENTER: {
pitem->rect.v[dim] = wl+(wr-pitem->rect.v[wdim])/2+pitem->margins[dim];
pitem->rect.v[dim] = x+(s-pitem->rect.v[wdim])/2+pitem->margins[dim];
} break;
case UI_LEFT: {
pitem->rect.v[dim] = wl+pitem->margins[dim];
pitem->rect.v[dim] = x+pitem->margins[dim];
} break;
case UI_RIGHT: {
pitem->rect.v[dim] = wl+wr-pitem->rect.v[wdim]-pitem->margins[wdim];
pitem->rect.v[dim] = x+s-pitem->rect.v[wdim]-pitem->margins[wdim];
} break;
case UI_HFILL: {
if (pitem->size.v[dim]) { // hard maximum size; can't stretch
if (hasl)
pitem->rect.v[dim] = wl+wr-pitem->rect.v[wdim]-pitem->margins[wdim];
pitem->rect.v[dim] = x+s-pitem->rect.v[wdim]-pitem->margins[wdim];
else
pitem->rect.v[dim] = wl+pitem->margins[dim];
pitem->rect.v[dim] = x+pitem->margins[dim];
} else {
if (1) { //!pitem->rect.v[wdim]) {
int width = (pparent->rect.v[wdim] - pparent->computed_size.v[dim]);
int space = width / (*dyncount);
//int rest = width - space*(*dyncount);
if (!hasl) {
pitem->rect.v[dim] = wl+pitem->margins[dim];
pitem->rect.v[wdim] = wr-pitem->margins[dim]-pitem->margins[wdim];
pitem->rect.v[dim] = x+pitem->margins[dim];
pitem->rect.v[wdim] = s-pitem->margins[dim]-pitem->margins[wdim];
} else {
pitem->rect.v[wdim] = space-pitem->margins[dim]-pitem->margins[wdim];
pitem->rect.v[dim] = wl+wr-pitem->rect.v[wdim]-pitem->margins[wdim];
pitem->rect.v[dim] = x+s-pitem->rect.v[wdim]-pitem->margins[wdim];
}
} else {
pitem->rect.v[dim] = wl+pitem->margins[dim];
pitem->rect.v[wdim] = wr-pitem->margins[dim]-pitem->margins[wdim];
pitem->rect.v[dim] = x+pitem->margins[dim];
pitem->rect.v[wdim] = s-pitem->margins[dim]-pitem->margins[wdim];
}
}
} break;


Loading…
Cancel
Save