| @@ -310,6 +310,9 @@ UIvec2 uiGetCursor(); | |||||
| // returns the offset of the cursor relative to the last call to uiProcess() | // returns the offset of the cursor relative to the last call to uiProcess() | ||||
| UIvec2 uiGetCursorDelta(); | UIvec2 uiGetCursorDelta(); | ||||
| // returns the beginning point of a drag operation. | |||||
| UIvec2 uiGetCursorStart(); | |||||
| // returns the offset of the cursor relative to the beginning point of a drag | // returns the offset of the cursor relative to the beginning point of a drag | ||||
| // operation. | // operation. | ||||
| UIvec2 uiGetCursorStartDelta(); | UIvec2 uiGetCursorStartDelta(); | ||||
| @@ -468,6 +471,11 @@ int uiGetChildId(int item); | |||||
| // undefined. | // undefined. | ||||
| UIrect uiGetRect(int item); | UIrect uiGetRect(int item); | ||||
| // when called from an input event handler, returns the active items absolute | |||||
| // layout rectangle. If uiGetActiveRect() is called outside of a handler, | |||||
| // the values of the returned rectangle are undefined. | |||||
| UIrect uiGetActiveRect(); | |||||
| // return the width of the item as set by uiSetSize() | // return the width of the item as set by uiSetSize() | ||||
| int uiGetWidth(int item); | int uiGetWidth(int item); | ||||
| // return the height of the item as set by uiSetSize() | // return the height of the item as set by uiSetSize() | ||||
| @@ -593,6 +601,8 @@ struct UIcontext { | |||||
| UIhandle active_handle; | UIhandle active_handle; | ||||
| int hot_item; | int hot_item; | ||||
| int active_item; | int active_item; | ||||
| UIrect hot_rect; | |||||
| UIrect active_rect; | |||||
| UIstate state; | UIstate state; | ||||
| int count; | int count; | ||||
| @@ -669,6 +679,11 @@ UIvec2 uiGetCursor() { | |||||
| return ui_context->cursor; | return ui_context->cursor; | ||||
| } | } | ||||
| UIvec2 uiGetCursorStart() { | |||||
| assert(ui_context); | |||||
| return ui_context->start_cursor; | |||||
| } | |||||
| UIvec2 uiGetCursorDelta() { | UIvec2 uiGetCursorDelta() { | ||||
| assert(ui_context); | assert(ui_context); | ||||
| UIvec2 result = {{{ | UIvec2 result = {{{ | ||||
| @@ -984,6 +999,11 @@ UIrect uiGetRect(int item) { | |||||
| return uiItemPtr(item)->rect; | return uiItemPtr(item)->rect; | ||||
| } | } | ||||
| UIrect uiGetActiveRect() { | |||||
| assert(ui_context); | |||||
| return ui_context->active_rect; | |||||
| } | |||||
| int uiFirstChild(int item) { | int uiFirstChild(int item) { | ||||
| return uiItemPtr(item)->firstkid; | return uiItemPtr(item)->firstkid; | ||||
| } | } | ||||
| @@ -1056,22 +1076,27 @@ int uiGetChildCount(int item) { | |||||
| return uiItemPtr(item)->numkids; | return uiItemPtr(item)->numkids; | ||||
| } | } | ||||
| int uiFindItem(int item, int x, int y) { | |||||
| int uiFindItem(int item, int x, int y, int ox, int oy) { | |||||
| UIitem *pitem = uiItemPtr(item); | UIitem *pitem = uiItemPtr(item); | ||||
| if (pitem->frozen) return -1; | if (pitem->frozen) return -1; | ||||
| UIrect rect = pitem->rect; | UIrect rect = pitem->rect; | ||||
| x -= rect.x; | x -= rect.x; | ||||
| y -= rect.y; | y -= rect.y; | ||||
| ox += rect.x; | |||||
| oy += rect.y; | |||||
| if ((x>=0) | if ((x>=0) | ||||
| && (y>=0) | && (y>=0) | ||||
| && (x<rect.w) | && (x<rect.w) | ||||
| && (y<rect.h)) { | && (y<rect.h)) { | ||||
| int kid = uiFirstChild(item); | int kid = uiFirstChild(item); | ||||
| while (kid >= 0) { | while (kid >= 0) { | ||||
| int best_hit = uiFindItem(kid,x,y); | |||||
| int best_hit = uiFindItem(kid,x,y,ox,oy); | |||||
| if (best_hit >= 0) return best_hit; | if (best_hit >= 0) return best_hit; | ||||
| kid = uiNextSibling(kid); | kid = uiNextSibling(kid); | ||||
| } | } | ||||
| rect.x += ox; | |||||
| rect.y += oy; | |||||
| ui_context->hot_rect = rect; | |||||
| return item; | return item; | ||||
| } | } | ||||
| return -1; | return -1; | ||||
| @@ -1084,15 +1109,16 @@ void uiProcess() { | |||||
| uiItemPtr(0)->rect.x = uiItemPtr(0)->margins[0]; | uiItemPtr(0)->rect.x = uiItemPtr(0)->margins[0]; | ||||
| uiItemPtr(0)->rect.y = uiItemPtr(0)->margins[1]; | uiItemPtr(0)->rect.y = uiItemPtr(0)->margins[1]; | ||||
| uiLayoutItem(0); | uiLayoutItem(0); | ||||
| int hot = uiFindItem(0, ui_context->cursor.x, ui_context->cursor.y); | |||||
| int hot = uiFindItem(0, | |||||
| ui_context->cursor.x, ui_context->cursor.y, 0, 0); | |||||
| switch(ui_context->state) { | switch(ui_context->state) { | ||||
| default: | default: | ||||
| case UI_STATE_IDLE: { | case UI_STATE_IDLE: { | ||||
| ui_context->start_cursor = ui_context->cursor; | |||||
| if (uiGetButton(0)) { | if (uiGetButton(0)) { | ||||
| ui_context->start_cursor = ui_context->cursor; | |||||
| ui_context->last_cursor = ui_context->cursor; | |||||
| ui_context->hot_item = -1; | ui_context->hot_item = -1; | ||||
| ui_context->active_rect = ui_context->hot_rect; | |||||
| ui_context->active_item = hot; | ui_context->active_item = hot; | ||||
| if (ui_context->active_item >= 0) { | if (ui_context->active_item >= 0) { | ||||
| uiNotifyItem(ui_context->active_item, UI_BUTTON0_DOWN); | uiNotifyItem(ui_context->active_item, UI_BUTTON0_DOWN); | ||||