| @@ -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; | |||