[ui] Edge detect all mouse buttons

And return mouse button info in the io struct.
This commit is contained in:
Bill Currie 2023-08-07 22:20:34 +09:00
parent 1745d3bccc
commit 9ede227da4
2 changed files with 19 additions and 13 deletions

View file

@ -95,6 +95,9 @@ typedef struct imui_window_s {
typedef struct imui_io_s { typedef struct imui_io_s {
view_pos_t mouse; view_pos_t mouse;
uint32_t buttons;
uint32_t pressed;
uint32_t released;
uint32_t hot; uint32_t hot;
uint32_t active; uint32_t active;
} imui_io_t; } imui_io_t;

View file

@ -125,11 +125,11 @@ struct imui_ctx_s {
uint32_t hot; uint32_t hot;
uint32_t active; uint32_t active;
view_pos_t mouse_active; view_pos_t mouse_active;
bool mouse_pressed; uint32_t mouse_pressed;
bool mouse_released; uint32_t mouse_released;
unsigned mouse_buttons; uint32_t mouse_buttons;
view_pos_t mouse_position; view_pos_t mouse_position;
unsigned shift; uint32_t shift;
int key_code; int key_code;
int unicode; int unicode;
@ -314,10 +314,10 @@ IMUI_ProcessEvent (imui_ctx_t *ctx, const IE_event_t *ie_event)
auto m = &ie_event->mouse; auto m = &ie_event->mouse;
ctx->mouse_position = (view_pos_t) { m->x, m->y }; ctx->mouse_position = (view_pos_t) { m->x, m->y };
unsigned old = ctx->mouse_buttons & 1; unsigned old = ctx->mouse_buttons;
unsigned new = m->buttons & 1; unsigned new = m->buttons;
ctx->mouse_pressed = (old ^ new) & new; ctx->mouse_pressed = (old ^ new) & new;
ctx->mouse_released = (old ^ new) & !new; ctx->mouse_released = (old ^ new) & ~new;
ctx->mouse_buttons = m->buttons; ctx->mouse_buttons = m->buttons;
} else { } else {
auto k = &ie_event->key; auto k = &ie_event->key;
@ -334,6 +334,9 @@ IMUI_GetIO (imui_ctx_t *ctx)
{ {
return (imui_io_t) { return (imui_io_t) {
.mouse = ctx->mouse_position, .mouse = ctx->mouse_position,
.buttons = ctx->mouse_buttons,
.pressed = ctx->mouse_pressed,
.released = ctx->mouse_released,
.hot = ctx->hot, .hot = ctx->hot,
.active = ctx->active, .active = ctx->active,
}; };
@ -721,8 +724,8 @@ void
IMUI_Draw (imui_ctx_t *ctx) IMUI_Draw (imui_ctx_t *ctx)
{ {
ctx->frame_draw = Sys_LongTime (); ctx->frame_draw = Sys_LongTime ();
ctx->mouse_pressed = false; ctx->mouse_pressed = 0;
ctx->mouse_released = false; ctx->mouse_released = 0;
sort_windows (ctx); sort_windows (ctx);
auto ref = View_GetRef (ctx->root_view); auto ref = View_GetRef (ctx->root_view);
Hierarchy_SetTreeMode (ref->hierarchy, false); Hierarchy_SetTreeMode (ref->hierarchy, false);
@ -839,12 +842,12 @@ check_button_state (imui_ctx_t *ctx, uint32_t entity)
bool result = false; bool result = false;
//printf ("check_button_state: h:%8x a:%8x e:%8x\n", ctx->hot, ctx->active, entity); //printf ("check_button_state: h:%8x a:%8x e:%8x\n", ctx->hot, ctx->active, entity);
if (ctx->active == entity) { if (ctx->active == entity) {
if (ctx->mouse_released) { if (ctx->mouse_released & 1) {
result = ctx->hot == entity; result = ctx->hot == entity;
ctx->active = nullent; ctx->active = nullent;
} }
} else if (ctx->hot == entity) { } else if (ctx->hot == entity) {
if (ctx->mouse_pressed) { if (ctx->mouse_pressed & 1) {
ctx->active = entity; ctx->active = entity;
} }
} }
@ -859,11 +862,11 @@ check_drag_delta (imui_ctx_t *ctx, uint32_t entity)
delta.x = ctx->mouse_position.x - ctx->mouse_active.x; delta.x = ctx->mouse_position.x - ctx->mouse_active.x;
delta.y = ctx->mouse_position.y - ctx->mouse_active.y; delta.y = ctx->mouse_position.y - ctx->mouse_active.y;
ctx->mouse_active = ctx->mouse_position; ctx->mouse_active = ctx->mouse_position;
if (ctx->mouse_released) { if (ctx->mouse_released & 1) {
ctx->active = nullent; ctx->active = nullent;
} }
} else if (ctx->hot == entity) { } else if (ctx->hot == entity) {
if (ctx->mouse_pressed) { if (ctx->mouse_pressed & 1) {
ctx->mouse_active = ctx->mouse_position; ctx->mouse_active = ctx->mouse_position;
ctx->active = entity; ctx->active = entity;
} }