| @@ -356,8 +356,7 @@ typedef enum UIlayoutFlags { | |||
| // when wrapping, put this element on a new line | |||
| // wrapping layout code auto-inserts UI_BREAK flags, | |||
| // drawing routines can read them with uiGetLayout() | |||
| UI_BREAK = 0x200, | |||
| UI_BREAK = 0x200 | |||
| } UIlayoutFlags; | |||
| // event flags | |||
| @@ -792,6 +791,12 @@ enum { | |||
| UI_ITEM_DATA = 0x100000, | |||
| // item has been inserted (bit 21) | |||
| UI_ITEM_INSERTED = 0x200000, | |||
| // horizontal size has been explicitly set (bit 22) | |||
| UI_ITEM_HFIXED = 0x400000, | |||
| // vertical size has been explicitly set (bit 23) | |||
| UI_ITEM_VFIXED = 0x800000, | |||
| // bit 22-23 | |||
| UI_ITEM_FIXED_MASK = 0xC00000, | |||
| // which flag bits will be compared | |||
| UI_ITEM_COMPARE_MASK = UI_ITEM_BOX_MODEL_MASK | |||
| @@ -1226,6 +1231,14 @@ void uiSetSize(int item, int w, int h) { | |||
| UIitem *pitem = uiItemPtr(item); | |||
| pitem->size[0] = w; | |||
| pitem->size[1] = h; | |||
| if (!w) | |||
| pitem->flags &= ~UI_ITEM_HFIXED; | |||
| else | |||
| pitem->flags |= UI_ITEM_HFIXED; | |||
| if (!h) | |||
| pitem->flags &= ~UI_ITEM_VFIXED; | |||
| else | |||
| pitem->flags |= UI_ITEM_VFIXED; | |||
| } | |||
| int uiGetWidth(int item) { | |||
| @@ -1413,7 +1426,7 @@ UI_INLINE void uiArrangeStacked(UIitem *pitem, int dim, bool wrap) { | |||
| short used = 0; | |||
| int count = 0; // count of fillers | |||
| int fixed_count = 0; // count of wrapping elements | |||
| int squeezed_count = 0; // count of squeezable elements | |||
| int total = 0; | |||
| bool hardbreak = false; | |||
| // first pass: count items that need to be expanded, | |||
| @@ -1423,12 +1436,14 @@ UI_INLINE void uiArrangeStacked(UIitem *pitem, int dim, bool wrap) { | |||
| while (kid >= 0) { | |||
| UIitem *pkid = uiItemPtr(kid); | |||
| int flags = (pkid->flags & UI_ITEM_LAYOUT_MASK) >> dim; | |||
| int fflags = (pkid->flags & UI_ITEM_FIXED_MASK) >> dim; | |||
| short extend = used; | |||
| if ((flags & UI_HFILL) == UI_HFILL) { // grow | |||
| count++; | |||
| extend += pkid->margins[dim] + pkid->margins[wdim]; | |||
| } else { | |||
| fixed_count++; | |||
| if ((fflags & UI_ITEM_HFIXED) != UI_ITEM_HFIXED) | |||
| squeezed_count++; | |||
| extend += pkid->margins[dim] + pkid->size[dim] + pkid->margins[wdim]; | |||
| } | |||
| // wrap on end of line or manual flag | |||
| @@ -1473,7 +1488,7 @@ UI_INLINE void uiArrangeStacked(UIitem *pitem, int dim, bool wrap) { | |||
| } | |||
| } | |||
| } else if (!wrap && (extra_space < 0)) { | |||
| //eater = (float)extra_space / (float)fixed_count; | |||
| eater = (float)extra_space / (float)squeezed_count; | |||
| } | |||
| // distribute width among items | |||
| @@ -1485,18 +1500,22 @@ UI_INLINE void uiArrangeStacked(UIitem *pitem, int dim, bool wrap) { | |||
| short ix0,ix1; | |||
| UIitem *pkid = uiItemPtr(kid); | |||
| int flags = (pkid->flags & UI_ITEM_LAYOUT_MASK) >> dim; | |||
| int fflags = (pkid->flags & UI_ITEM_FIXED_MASK) >> dim; | |||
| x += (float)pkid->margins[dim] + extra_margin; | |||
| if ((flags & UI_HFILL) == UI_HFILL) { // grow | |||
| x1 = x+filler; | |||
| } else if ((fflags & UI_ITEM_HFIXED) == UI_ITEM_HFIXED) { | |||
| x1 = x+(float)pkid->size[dim]; | |||
| } else { | |||
| // squeeze | |||
| x1 = x+ui_maxf(0.0f,(float)pkid->size[dim]+eater); | |||
| } | |||
| ix0 = (short)x; | |||
| //if (wrap) | |||
| if (wrap) | |||
| ix1 = (short)ui_minf(max_x2-(float)pkid->margins[wdim], x1); | |||
| //else | |||
| // ix1 = (short)x1; | |||
| else | |||
| ix1 = (short)x1; | |||
| pkid->margins[dim] = ix0; | |||
| pkid->size[dim] = ix1-ix0; | |||
| x = x1 + (float)pkid->margins[wdim]; | |||