Browse Source

oui: improved layouting of static/dynamic items

pull/1/head
Leonard Ritter 10 years ago
parent
commit
d4fbee3bc7
1 changed files with 19 additions and 10 deletions
  1. +19
    -10
      oui.h

+ 19
- 10
oui.h View File

@@ -920,14 +920,11 @@ static void uiComputeBestSize(int item, int dim) {
uiComputeSizeDim(pitem, dim); uiComputeSizeDim(pitem, dim);
} }


static void uiLayoutChildItem(UIitem *pparent, UIitem *pitem, int *dyncount, int dim) {
static void uiLayoutChildItem(UIitem *pparent, UIitem *pitem,
int *dyncount, int *consumed_space, int dim) {
if (pitem->visited & (4<<dim)) return; if (pitem->visited & (4<<dim)) return;
pitem->visited |= (4<<dim); pitem->visited |= (4<<dim);
if (!pitem->size.v[dim]) {
*dyncount = (*dyncount)+1;
}
int wdim = dim+2; int wdim = dim+2;
int x = 0; int x = 0;
@@ -937,15 +934,24 @@ static void uiLayoutChildItem(UIitem *pparent, UIitem *pitem, int *dyncount, int
int hasl = (flags & UI_LEFT) && (pitem->relto[dim] >= 0); int hasl = (flags & UI_LEFT) && (pitem->relto[dim] >= 0);
int hasr = (flags & UI_RIGHT) && (pitem->relto[wdim] >= 0); int hasr = (flags & UI_RIGHT) && (pitem->relto[wdim] >= 0);
if ((flags & UI_HFILL) != UI_HFILL) {
*consumed_space = (*consumed_space)
+ pitem->rect.v[wdim]
+ pitem->margins[wdim]
+ pitem->margins[dim];
} else if (!pitem->size.v[dim]) {
*dyncount = (*dyncount)+1;
}
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, consumed_space, dim);
x = pl->rect.v[dim]+pl->rect.v[wdim]+pl->margins[wdim]; x = pl->rect.v[dim]+pl->rect.v[wdim]+pl->margins[wdim];
s -= x; 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, consumed_space, dim);
s = pl->rect.v[dim]-pl->margins[dim]-x; s = pl->rect.v[dim]-pl->margins[dim]-x;
} }


@@ -968,7 +974,8 @@ static void uiLayoutChildItem(UIitem *pparent, UIitem *pitem, int *dyncount, int
pitem->rect.v[dim] = x+s-pitem->rect.v[wdim]-pitem->margins[wdim]; pitem->rect.v[dim] = x+s-pitem->rect.v[wdim]-pitem->margins[wdim];
} 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 width = (pparent->rect.v[wdim] - (*consumed_space));
int space = width / (*dyncount); int space = width / (*dyncount);
//int rest = width - space*(*dyncount); //int rest = width - space*(*dyncount);
if (!hasl) { if (!hasl) {
@@ -988,11 +995,13 @@ static void uiLayoutChildItem(UIitem *pparent, UIitem *pitem, int *dyncount, int
} }


UI_INLINE void uiLayoutItemDim(UIitem *pitem, int dim) { UI_INLINE void uiLayoutItemDim(UIitem *pitem, int dim) {
int wdim = dim+2;
int kid = pitem->firstkid; int kid = pitem->firstkid;
int consumed_space = 0;
int dyncount = 0;
while (kid >= 0) { while (kid >= 0) {
UIitem *pkid = uiItemPtr(kid); UIitem *pkid = uiItemPtr(kid);
int dyncount = 0;
uiLayoutChildItem(pitem, pkid, &dyncount, dim);
uiLayoutChildItem(pitem, pkid, &dyncount, &consumed_space, dim);
kid = uiNextSibling(kid); kid = uiNextSibling(kid);
} }
} }


Loading…
Cancel
Save