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