| @@ -763,8 +763,9 @@ OUI_EXPORT int uiGetLastItemCount(); | |||
| #define UI_ANY_INPUT (UI_ANY_MOUSE_INPUT \ | |||
| |UI_ANY_KEY_INPUT) | |||
| // extra item flags | |||
| enum { | |||
| // extra item flags | |||
| // bit 0-2 | |||
| UI_ITEM_BOX_MODEL_MASK = 0x000007, | |||
| // bit 0-4 | |||
| @@ -812,6 +813,12 @@ typedef enum UIstate { | |||
| UI_STATE_CAPTURE, | |||
| } UIstate; | |||
| typedef enum UIstage { | |||
| UI_STAGE_DECLARE = 0, | |||
| UI_STAGE_DRAW, | |||
| UI_STAGE_PROCESS, | |||
| } UIstage; | |||
| typedef struct UIhandleEntry { | |||
| unsigned int key; | |||
| int item; | |||
| @@ -851,6 +858,7 @@ struct UIcontext { | |||
| int hot_item; | |||
| UIstate state; | |||
| UIstage stage; | |||
| unsigned int active_key; | |||
| unsigned int active_modifier; | |||
| int last_timestamp; | |||
| @@ -887,6 +895,7 @@ UIcontext *uiCreateContext( | |||
| memset(ctx, 0, sizeof(UIcontext)); | |||
| ctx->item_capacity = item_capacity; | |||
| ctx->buffer_capacity = buffer_capacity; | |||
| ctx->stage = UI_STAGE_PROCESS; | |||
| ctx->items = (UIitem *)malloc(sizeof(UIitem) * item_capacity); | |||
| ctx->last_items = (UIitem *)malloc(sizeof(UIitem) * item_capacity); | |||
| ctx->item_map = (int *)malloc(sizeof(int) * item_capacity); | |||
| @@ -897,6 +906,7 @@ UIcontext *uiCreateContext( | |||
| UIcontext *oldctx = ui_context; | |||
| uiMakeCurrent(ctx); | |||
| uiClear(); | |||
| ctx->stage = UI_STAGE_PROCESS; | |||
| uiClearState(); | |||
| uiMakeCurrent(oldctx); | |||
| return ctx; | |||
| @@ -1061,6 +1071,7 @@ int uiGetHotItem() { | |||
| void uiFocus(int item) { | |||
| assert(ui_context && (item >= -1) && (item < ui_context->count)); | |||
| assert(ui_context->stage == UI_STAGE_PROCESS); | |||
| ui_context->focus_item = item; | |||
| } | |||
| @@ -1079,6 +1090,7 @@ int uiGetFocusedItem() { | |||
| void uiClear() { | |||
| assert(ui_context); | |||
| assert(ui_context->stage == UI_STAGE_PROCESS); // must run uiLayout(), uiProcess() first | |||
| ui_context->last_count = ui_context->count; | |||
| ui_context->count = 0; | |||
| ui_context->datasize = 0; | |||
| @@ -1090,6 +1102,7 @@ void uiClear() { | |||
| for (int i = 0; i < ui_context->last_count; ++i) { | |||
| ui_context->item_map[i] = -1; | |||
| } | |||
| ui_context->stage = UI_STAGE_DECLARE; | |||
| } | |||
| void uiClearState() { | |||
| @@ -1102,6 +1115,7 @@ void uiClearState() { | |||
| int uiItem() { | |||
| assert(ui_context); | |||
| assert(ui_context->stage == UI_STAGE_DECLARE); // must run between uiClear() and uiLayout() | |||
| assert(ui_context->count < (int)ui_context->item_capacity); | |||
| int idx = ui_context->count++; | |||
| UIitem *item = uiItemPtr(idx); | |||
| @@ -1584,21 +1598,27 @@ void uiRemapItem(int olditem, int newitem) { | |||
| void uiLayout() { | |||
| assert(ui_context); | |||
| if (!ui_context->count) return; | |||
| assert(ui_context->stage == UI_STAGE_DECLARE); // must run uiClear() first | |||
| uiComputeSize(0,0); | |||
| uiArrange(0,0); | |||
| uiComputeSize(0,1); | |||
| uiArrange(0,1); | |||
| if (ui_context->count) { | |||
| uiComputeSize(0,0); | |||
| uiArrange(0,0); | |||
| uiComputeSize(0,1); | |||
| uiArrange(0,1); | |||
| if (ui_context->last_count && ui_context->count) { | |||
| // map old item id to new item id | |||
| uiMapItems(0,0); | |||
| if (ui_context->last_count) { | |||
| // map old item id to new item id | |||
| uiMapItems(0,0); | |||
| } | |||
| } | |||
| uiValidateStateItems(); | |||
| // drawing routines may require this to be set already | |||
| uiUpdateHotItem(); | |||
| if (ui_context->count) { | |||
| // drawing routines may require this to be set already | |||
| uiUpdateHotItem(); | |||
| } | |||
| ui_context->stage = UI_STAGE_DRAW; | |||
| } | |||
| UIrect uiGetRect(int item) { | |||
| @@ -1719,6 +1739,10 @@ int uiGetClicks() { | |||
| void uiProcess(int timestamp) { | |||
| assert(ui_context); | |||
| assert(ui_context->stage == UI_STAGE_DRAW); // must run uiClear(), uiLayout() first | |||
| ui_context->stage = UI_STAGE_PROCESS; | |||
| if (!ui_context->count) { | |||
| uiClearInputEvents(); | |||
| return; | |||