Browse Source

oui: some additions for finding the relative cursor position in a handler

pull/1/head
Leonard Ritter 11 years ago
parent
commit
edc6c734d0
1 changed files with 31 additions and 5 deletions
  1. +31
    -5
      oui.h

+ 31
- 5
oui.h View File

@@ -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);


Loading…
Cancel
Save