diff --git a/oui.h b/oui.h index ea0c3b8..4c1bdb3 100644 --- a/oui.h +++ b/oui.h @@ -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<relto[dim] < 0) break; pitem = uiItemPtr(pitem->relto[dim]); pitem->visited |= 1<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<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<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<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;