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) { UI_INLINE int uiComputeChainSize(UIitem *pkid, int dim) {
UIitem *pitem = pkid; UIitem *pitem = pkid;
int wdim = dim+2; 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; int it = 0;
pitem->visited |= 1<<dim; pitem->visited |= 1<<dim;
// traverse along left neighbors // traverse along left neighbors
@@ -851,7 +853,8 @@ UI_INLINE int uiComputeChainSize(UIitem *pkid, int dim) {
if (pitem->relto[dim] < 0) break; if (pitem->relto[dim] < 0) break;
pitem = uiItemPtr(pitem->relto[dim]); pitem = uiItemPtr(pitem->relto[dim]);
pitem->visited |= 1<<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++; it++;
assert(it<1000000); // infinite loop assert(it<1000000); // infinite loop
} }
@@ -862,7 +865,8 @@ UI_INLINE int uiComputeChainSize(UIitem *pkid, int dim) {
if (pitem->relto[wdim] < 0) break; if (pitem->relto[wdim] < 0) break;
pitem = uiItemPtr(pitem->relto[wdim]); pitem = uiItemPtr(pitem->relto[wdim]);
pitem->visited |= 1<<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++; it++;
assert(it<1000000); // infinite loop 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) { UI_INLINE void uiComputeSizeDim(UIitem *pitem, int dim) {
int wdim = dim+2; 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]) { if (pitem->size.v[dim]) {
pitem->rect.v[wdim] = pitem->size.v[dim]; pitem->rect.v[wdim] = pitem->size.v[dim];
} else { } 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->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 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 flags = pitem->layout_flags>>dim;
int hasl = (flags & UI_LEFT) && (pitem->relto[dim] >= 0); 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) { if (hasl) {
UIitem *pl = uiItemPtr(pitem->relto[dim]); UIitem *pl = uiItemPtr(pitem->relto[dim]);
uiLayoutChildItem(pparent, pl, dyncount, 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) { if (hasr) {
UIitem *pl = uiItemPtr(pitem->relto[wdim]); UIitem *pl = uiItemPtr(pitem->relto[wdim]);
uiLayoutChildItem(pparent, pl, dyncount, dim); 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) { switch(flags & UI_HFILL) {
default: default:
case UI_HCENTER: { 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; } break;
case UI_LEFT: { case UI_LEFT: {
pitem->rect.v[dim] = wl+pitem->margins[dim];
pitem->rect.v[dim] = x+pitem->margins[dim];
} break; } break;
case UI_RIGHT: { 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; } break;
case UI_HFILL: { case UI_HFILL: {
if (pitem->size.v[dim]) { // hard maximum size; can't stretch if (pitem->size.v[dim]) { // hard maximum size; can't stretch
if (hasl) 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 else
pitem->rect.v[dim] = wl+pitem->margins[dim];
pitem->rect.v[dim] = x+pitem->margins[dim];
} else { } else {
if (1) { //!pitem->rect.v[wdim]) { if (1) { //!pitem->rect.v[wdim]) {
int width = (pparent->rect.v[wdim] - pparent->computed_size.v[dim]); int width = (pparent->rect.v[wdim] - pparent->computed_size.v[dim]);
int space = width / (*dyncount); int space = width / (*dyncount);
//int rest = width - space*(*dyncount); //int rest = width - space*(*dyncount);
if (!hasl) { 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 { } else {
pitem->rect.v[wdim] = space-pitem->margins[dim]-pitem->margins[wdim]; 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 { } 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; } break;


Loading…
Cancel
Save