Browse Source

removed lastkid/previtem entries, reducing UIitem size to 32 bytes

pull/1/head
Leonard Ritter 10 years ago
parent
commit
4b09ffeb4d
1 changed files with 51 additions and 40 deletions
  1. +51
    -40
      oui.h

+ 51
- 40
oui.h View File

@@ -497,10 +497,18 @@ OUI_EXPORT void uiSetEvents(int item, int flags);

// assign an item to a container.
// an item ID of 0 refers to the root item.
// if child is already assigned to a parent, an assertion will be thrown.
// the function returns the child item ID
// if the container has already added items, the function searches
// for the last item and calls uiInsert() on it, which is an
// O(N) operation for N siblings.
// it is usually more efficient to call uiAppend() for the first child,
// then chain additional siblings using uiInsert().
OUI_EXPORT int uiAppend(int item, int child);

// assign an item to the same container as another item
// sibling is inserted after item.
OUI_EXPORT int uiInsert(int item, int sibling);

// set the size of the item; a size of 0 indicates the dimension to be
// dynamic; if the size is set, the item can not expand beyond that size.
OUI_EXPORT void uiSetSize(int item, int w, int h);
@@ -525,18 +533,9 @@ OUI_EXPORT void uiFocus(int item);
// if item is 0, the first child item of the root item will be returned.
OUI_EXPORT int uiFirstChild(int item);

// returns the last child item of a container item. If the item is not
// a container or does not contain any items, -1 is returned.
// if item is 0, the last child item of the root item will be returned.
OUI_EXPORT int uiLastChild(int item);

// returns an items next sibling in the list of the parent containers children.
// if item is 0 or the item is the last child item, -1 will be returned.
OUI_EXPORT int uiNextSibling(int item);
// returns an items previous sibling in the list of the parent containers
// children.
// if item is 0 or the item is the first child item, -1 will be returned.
OUI_EXPORT int uiPrevSibling(int item);

// Querying
// --------
@@ -645,27 +644,21 @@ enum {
UI_ITEM_FROZEN = 0x080000,
// item handle is pointer to data (bit 20)
UI_ITEM_DATA = 0x100000,
// item has been inserted
UI_ITEM_INSERTED = 0x200000,
};

typedef struct UIitem {
// declaration independent unique handle (for persistence)
// data handle
void *handle;

// about 27 bits worth of flags
unsigned int flags;

// container structure
// index of first kid
int firstkid;
// index of last kid
int lastkid;
// child structure
// index of next sibling with same parent
int nextitem;
// index of previous sibling with same parent
int previtem;
// margin offsets, interpretation depends on flags
// after layouting, the first two components are absolute coordinates
@@ -931,9 +924,7 @@ int uiItem() {
UIitem *item = uiItemPtr(idx);
memset(item, 0, sizeof(UIitem));
item->firstkid = -1;
item->lastkid = -1;
item->nextitem = -1;
item->previtem = -1;
return idx;
}

@@ -949,17 +940,39 @@ void uiNotifyItem(int item, UIevent event) {
}
}

UI_INLINE int uiLastChild(int item) {
item = uiFirstChild(item);
if (item < 0)
return -1;
while (true) {
int nextitem = uiNextSibling(item);
if (nextitem < 0)
return item;
item = nextitem;
}
}

int uiInsert(int item, int sibling) {
assert(sibling > 0);
UIitem *pitem = uiItemPtr(item);
UIitem *psibling = uiItemPtr(sibling);
assert(!(psibling->flags & UI_ITEM_INSERTED));
psibling->nextitem = pitem->nextitem;
psibling->flags |= UI_ITEM_INSERTED;
pitem->nextitem = sibling;
return sibling;
}

int uiAppend(int item, int child) {
assert(child > 0);
UIitem *pitem = uiItemPtr(child);
UIitem *pparent = uiItemPtr(item);
if (pparent->lastkid < 0) {
UIitem *pchild = uiItemPtr(child);
assert(!(pchild->flags & UI_ITEM_INSERTED));
if (pparent->firstkid < 0) {
pparent->firstkid = child;
pparent->lastkid = child;
pchild->flags |= UI_ITEM_INSERTED;
} else {
pitem->previtem = pparent->lastkid;
uiItemPtr(pparent->lastkid)->nextitem = child;
pparent->lastkid = child;
uiInsert(uiLastChild(item), child);
}
return child;
}
@@ -1203,18 +1216,10 @@ int uiFirstChild(int item) {
return uiItemPtr(item)->firstkid;
}

int uiLastChild(int item) {
return uiItemPtr(item)->lastkid;
}

int uiNextSibling(int item) {
return uiItemPtr(item)->nextitem;
}

int uiPrevSibling(int item) {
return uiItemPtr(item)->previtem;
}

void *uiAllocHandle(int item, int size) {
assert((size > 0) && (size < UI_MAX_DATASIZE));
UIitem *pitem = uiItemPtr(item);
@@ -1271,11 +1276,17 @@ int uiFindItemForEvent(int item, UIevent event, int x, int y) {
UIitem *pitem = uiItemPtr(item);
if (pitem->flags & UI_ITEM_FROZEN) return -1;
if (uiContains(item, x, y)) {
int kid = uiLastChild(item);
int best_hit = -1;
int kid = uiFirstChild(item);
while (kid >= 0) {
int best_hit = uiFindItemForEvent(kid, event, x, y);
if (best_hit >= 0) return best_hit;
kid = uiPrevSibling(kid);
int hit = uiFindItemForEvent(kid, event, x, y);
if (hit >= 0) {
best_hit = hit;
}
kid = uiNextSibling(kid);
}
if (best_hit >= 0) {
return best_hit;
}
// click-through if the item has no handler for this event
if (pitem->flags & event) {


Loading…
Cancel
Save