Browse Source

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

pull/1/head
Leonard Ritter 10 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()
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
// operation.
UIvec2 uiGetCursorStartDelta();
@@ -468,6 +471,11 @@ int uiGetChildId(int item);
// undefined.
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()
int uiGetWidth(int item);
// return the height of the item as set by uiSetSize()
@@ -593,6 +601,8 @@ struct UIcontext {
UIhandle active_handle;
int hot_item;
int active_item;
UIrect hot_rect;
UIrect active_rect;
UIstate state;
int count;
@@ -669,6 +679,11 @@ UIvec2 uiGetCursor() {
return ui_context->cursor;
}

UIvec2 uiGetCursorStart() {
assert(ui_context);
return ui_context->start_cursor;
}

UIvec2 uiGetCursorDelta() {
assert(ui_context);
UIvec2 result = {{{
@@ -984,6 +999,11 @@ UIrect uiGetRect(int item) {
return uiItemPtr(item)->rect;
}

UIrect uiGetActiveRect() {
assert(ui_context);
return ui_context->active_rect;
}

int uiFirstChild(int item) {
return uiItemPtr(item)->firstkid;
}
@@ -1056,22 +1076,27 @@ int uiGetChildCount(int item) {
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);
if (pitem->frozen) return -1;
UIrect rect = pitem->rect;
x -= rect.x;
y -= rect.y;
ox += rect.x;
oy += rect.y;
if ((x>=0)
&& (y>=0)
&& (x<rect.w)
&& (y<rect.h)) {
int kid = uiFirstChild(item);
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;
kid = uiNextSibling(kid);
}
rect.x += ox;
rect.y += oy;
ui_context->hot_rect = rect;
return item;
}
return -1;
@@ -1084,15 +1109,16 @@ void uiProcess() {
uiItemPtr(0)->rect.x = uiItemPtr(0)->margins[0];
uiItemPtr(0)->rect.y = uiItemPtr(0)->margins[1];
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) {
default:
case UI_STATE_IDLE: {
ui_context->start_cursor = ui_context->cursor;
if (uiGetButton(0)) {
ui_context->start_cursor = ui_context->cursor;
ui_context->last_cursor = ui_context->cursor;
ui_context->hot_item = -1;
ui_context->active_rect = ui_context->hot_rect;
ui_context->active_item = hot;
if (ui_context->active_item >= 0) {
uiNotifyItem(ui_context->active_item, UI_BUTTON0_DOWN);


Loading…
Cancel
Save