right mouse events
This commit is contained in:
parent
05b6f9eae8
commit
288bd38b42
84
ugui.c
84
ugui.c
@ -13,11 +13,28 @@
|
|||||||
#define DEF_PPI 96.0
|
#define DEF_PPI 96.0
|
||||||
#define STACK_STEP 64
|
#define STACK_STEP 64
|
||||||
|
|
||||||
#define RESIZEALL UG_CNT_RESIZE_RIGHT | \
|
#define RESIZEALL ( \
|
||||||
UG_CNT_RESIZE_BOTTOM | \
|
UG_CNT_RESIZE_RIGHT | \
|
||||||
UG_CNT_RESIZE_LEFT | \
|
UG_CNT_RESIZE_BOTTOM | \
|
||||||
UG_CNT_RESIZE_TOP
|
UG_CNT_RESIZE_LEFT | \
|
||||||
#define BTN_ANY UG_BTN_LEFT | UG_BTN_RIGHT | UG_BTN_MIDDLE | UG_BTN_4 | UG_BTN_5
|
UG_CNT_RESIZE_TOP \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define BTN_ANY ( \
|
||||||
|
UG_BTN_LEFT | \
|
||||||
|
UG_BTN_RIGHT | \
|
||||||
|
UG_BTN_MIDDLE | \
|
||||||
|
UG_BTN_4 | \
|
||||||
|
UG_BTN_5 \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define CNT_STATE_ALL ( \
|
||||||
|
CNT_STATE_MOVING | \
|
||||||
|
CNT_STATE_RESIZE_T | \
|
||||||
|
CNT_STATE_RESIZE_B | \
|
||||||
|
CNT_STATE_RESIZE_L | \
|
||||||
|
CNT_STATE_RESIZE_R \
|
||||||
|
)
|
||||||
|
|
||||||
#define PPI_PPM(ppi, scale) (ppi * scale * 0.03937008)
|
#define PPI_PPM(ppi, scale) (ppi * scale * 0.03937008)
|
||||||
#define PPI_PPD(ppi, scale) (PPI_PPM(ppi, scale) * 0.3528)
|
#define PPI_PPD(ppi, scale) (PPI_PPM(ppi, scale) * 0.3528)
|
||||||
@ -86,8 +103,9 @@ static ug_style_t style_cache = {0};
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#define MOUSEDOWN(ctx, btn) (ctx->mouse.press_mask & ctx->mouse.down_mask & btn)
|
#define MOUSEDOWN(ctx, btn) (~(ctx->mouse.hold & btn) & (ctx->mouse.update & btn))
|
||||||
#define MOUSEUP(ctx, btn) (ctx->mouse.press_mask & ~ctx->mouse.down_mask & btn)
|
#define MOUSEUP(ctx, btn) ((ctx->mouse.hold & btn) & (ctx->mouse.update & btn))
|
||||||
|
#define HELD(ctx, btn) (ctx->mouse.hold & btn)
|
||||||
|
|
||||||
|
|
||||||
// https://en.wikipedia.org/wiki/Jenkins_hash_function
|
// https://en.wikipedia.org/wiki/Jenkins_hash_function
|
||||||
@ -346,14 +364,17 @@ static void position_container(ug_ctx_t *ctx, ug_container_t *cnt)
|
|||||||
|
|
||||||
void handle_container(ug_ctx_t *ctx, ug_container_t *cnt)
|
void handle_container(ug_ctx_t *ctx, ug_container_t *cnt)
|
||||||
{
|
{
|
||||||
// if we had focus the frame before, then do shit
|
if (ctx->active.cnt != cnt->id) {
|
||||||
if (ctx->active.cnt != cnt->id)
|
// if we are not the active container than definately we are not
|
||||||
|
// being moved or resized
|
||||||
|
cnt->flags &= ~CNT_STATE_ALL;
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// mouse pressed handle resize, for simplicity containers can only
|
// mouse pressed handle resize, for simplicity containers can only
|
||||||
// be resized from the bottom and right border
|
// be resized from the bottom and right border
|
||||||
// TODO: bring selected container to the top of the stack
|
// TODO: bring selected container to the top of the stack
|
||||||
if (!TEST(ctx->mouse.down_mask, UG_BTN_LEFT) ||
|
if (!HELD(ctx, UG_BTN_LEFT) ||
|
||||||
!TEST(cnt->flags, (RESIZEALL | UG_CNT_MOVABLE)))
|
!TEST(cnt->flags, (RESIZEALL | UG_CNT_MOVABLE)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -371,13 +392,19 @@ void handle_container(ug_ctx_t *ctx, ug_container_t *cnt)
|
|||||||
ug_vec2_t mpos = ctx->mouse.pos;
|
ug_vec2_t mpos = ctx->mouse.pos;
|
||||||
int minx, maxx, miny, maxy;
|
int minx, maxx, miny, maxy;
|
||||||
|
|
||||||
|
printf("state: %x\n", (cnt->flags & CNT_STATE_ALL)>>16);
|
||||||
|
|
||||||
// handle movable windows
|
// handle movable windows
|
||||||
if (TEST(cnt->flags, UG_CNT_MOVABLE)) {
|
if (TEST(cnt->flags, UG_CNT_MOVABLE)) {
|
||||||
minx = rca->x + bl;
|
minx = rca->x + bl;
|
||||||
maxx = rca->x + rca->w - br;
|
maxx = rca->x + rca->w - br;
|
||||||
miny = rca->y + bt;
|
miny = rca->y + bt;
|
||||||
maxy = rca->y + bt + hh;
|
maxy = rca->y + bt + hh;
|
||||||
if (BETWEEN(mpos.x, minx, maxx) && BETWEEN(mpos.y, miny, maxy)) {
|
if ((cnt->flags & CNT_STATE_ALL) == CNT_STATE_MOVING ||
|
||||||
|
((cnt->flags & CNT_STATE_ALL) == 0 &&
|
||||||
|
BETWEEN(mpos.x, minx, maxx) &&
|
||||||
|
BETWEEN(mpos.y, miny, maxy))) {
|
||||||
|
cnt->flags |= CNT_STATE_MOVING;
|
||||||
rect->x += ctx->mouse.delta.x;
|
rect->x += ctx->mouse.delta.x;
|
||||||
rect->y += ctx->mouse.delta.y;
|
rect->y += ctx->mouse.delta.y;
|
||||||
rca->x += ctx->mouse.delta.x;
|
rca->x += ctx->mouse.delta.x;
|
||||||
@ -391,7 +418,11 @@ void handle_container(ug_ctx_t *ctx, ug_container_t *cnt)
|
|||||||
maxx = rca->x + rca->w;
|
maxx = rca->x + rca->w;
|
||||||
miny = rca->y;
|
miny = rca->y;
|
||||||
maxy = rca->y + rca->h;
|
maxy = rca->y + rca->h;
|
||||||
if (BETWEEN(mpos.x, minx, maxx) && BETWEEN(mpos.y, miny, maxy)) {
|
if ((cnt->flags & CNT_STATE_ALL) == CNT_STATE_RESIZE_R ||
|
||||||
|
((cnt->flags & CNT_STATE_ALL) == 0 &&
|
||||||
|
BETWEEN(mpos.x, minx, maxx) &&
|
||||||
|
BETWEEN(mpos.y, miny, maxy))) {
|
||||||
|
cnt->flags |= CNT_STATE_RESIZE_R;
|
||||||
rect->w = MAX(10, rect->w + ctx->mouse.delta.x);
|
rect->w = MAX(10, rect->w + ctx->mouse.delta.x);
|
||||||
rca->w = MAX(10, rca->w + ctx->mouse.delta.x);
|
rca->w = MAX(10, rca->w + ctx->mouse.delta.x);
|
||||||
}
|
}
|
||||||
@ -403,7 +434,12 @@ void handle_container(ug_ctx_t *ctx, ug_container_t *cnt)
|
|||||||
maxx = rca->x + bl;
|
maxx = rca->x + bl;
|
||||||
miny = rca->y;
|
miny = rca->y;
|
||||||
maxy = rca->y + rca->h;
|
maxy = rca->y + rca->h;
|
||||||
if (BETWEEN(mpos.x, minx, maxx) && BETWEEN(mpos.y, miny, maxy)) {
|
if ((cnt->flags & CNT_STATE_ALL) == CNT_STATE_RESIZE_L ||
|
||||||
|
((cnt->flags & CNT_STATE_ALL) == 0 &&
|
||||||
|
BETWEEN(mpos.x, minx, maxx) &&
|
||||||
|
BETWEEN(mpos.y, miny, maxy))) {
|
||||||
|
cnt->flags |= CNT_STATE_RESIZE_L;
|
||||||
|
|
||||||
if (rect->w - ctx->mouse.delta.x >= 10) {
|
if (rect->w - ctx->mouse.delta.x >= 10) {
|
||||||
rect->w -= ctx->mouse.delta.x;
|
rect->w -= ctx->mouse.delta.x;
|
||||||
if (TEST(cnt->flags, UG_CNT_MOVABLE))
|
if (TEST(cnt->flags, UG_CNT_MOVABLE))
|
||||||
@ -422,7 +458,11 @@ void handle_container(ug_ctx_t *ctx, ug_container_t *cnt)
|
|||||||
maxx = rca->x + rca->w;
|
maxx = rca->x + rca->w;
|
||||||
miny = rca->y + rca->h - bb;
|
miny = rca->y + rca->h - bb;
|
||||||
maxy = rca->y + rca->h;
|
maxy = rca->y + rca->h;
|
||||||
if (BETWEEN(mpos.x, minx, maxx) && BETWEEN(mpos.y, miny, maxy)) {
|
if ((cnt->flags & CNT_STATE_ALL) == CNT_STATE_RESIZE_B ||
|
||||||
|
((cnt->flags & CNT_STATE_ALL) == 0 &&
|
||||||
|
BETWEEN(mpos.x, minx, maxx) &&
|
||||||
|
BETWEEN(mpos.y, miny, maxy))) {
|
||||||
|
cnt->flags |= CNT_STATE_RESIZE_B;
|
||||||
rect->h += ctx->mouse.delta.y;
|
rect->h += ctx->mouse.delta.y;
|
||||||
rca->h += ctx->mouse.delta.y;
|
rca->h += ctx->mouse.delta.y;
|
||||||
}
|
}
|
||||||
@ -434,7 +474,10 @@ void handle_container(ug_ctx_t *ctx, ug_container_t *cnt)
|
|||||||
maxx = rca->x + rca->w;
|
maxx = rca->x + rca->w;
|
||||||
miny = rca->y;
|
miny = rca->y;
|
||||||
maxy = rca->y + bt;
|
maxy = rca->y + bt;
|
||||||
if (BETWEEN(mpos.x, minx, maxx) && BETWEEN(mpos.y, miny, maxy)) {
|
if ((cnt->flags & CNT_STATE_ALL) == CNT_STATE_RESIZE_T ||
|
||||||
|
(BETWEEN(mpos.x, minx, maxx) && BETWEEN(mpos.y, miny, maxy))) {
|
||||||
|
cnt->flags |= CNT_STATE_RESIZE_T;
|
||||||
|
|
||||||
if (rect->h - ctx->mouse.delta.y >= 10) {
|
if (rect->h - ctx->mouse.delta.y >= 10) {
|
||||||
rect->h -= ctx->mouse.delta.y;
|
rect->h -= ctx->mouse.delta.y;
|
||||||
if (TEST(cnt->flags, UG_CNT_MOVABLE))
|
if (TEST(cnt->flags, UG_CNT_MOVABLE))
|
||||||
@ -602,8 +645,7 @@ int ug_input_mousedown(ug_ctx_t *ctx, unsigned int mask)
|
|||||||
{
|
{
|
||||||
TEST_CTX(ctx);
|
TEST_CTX(ctx);
|
||||||
|
|
||||||
ctx->mouse.press_mask |= mask;
|
ctx->mouse.update |= mask;
|
||||||
ctx->mouse.down_mask |= mask;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -613,7 +655,7 @@ int ug_input_mouseup(ug_ctx_t *ctx, unsigned int mask)
|
|||||||
{
|
{
|
||||||
TEST_CTX(ctx);
|
TEST_CTX(ctx);
|
||||||
|
|
||||||
ctx->mouse.down_mask &= ~mask;
|
ctx->mouse.update |= mask;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -656,6 +698,7 @@ int ug_frame_begin(ug_ctx_t *ctx)
|
|||||||
} else if (MOUSEUP(ctx, UG_BTN_LEFT)) {
|
} else if (MOUSEUP(ctx, UG_BTN_LEFT)) {
|
||||||
ctx->active.cnt = 0;
|
ctx->active.cnt = 0;
|
||||||
}
|
}
|
||||||
|
printf("active: %x\n", ctx->active.cnt);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -667,8 +710,9 @@ int ug_frame_end(ug_ctx_t *ctx)
|
|||||||
TEST_CTX(ctx);
|
TEST_CTX(ctx);
|
||||||
|
|
||||||
ctx->input_text[0] = '\0';
|
ctx->input_text[0] = '\0';
|
||||||
ctx->key.press_mask = 0;
|
ctx->key.update = 0;
|
||||||
ctx->mouse.press_mask = 0;
|
ctx->mouse.hold ^= ctx->mouse.update;
|
||||||
|
ctx->mouse.update = 0;
|
||||||
ctx->mouse.scroll_delta = (ug_vec2_t){0};
|
ctx->mouse.scroll_delta = (ug_vec2_t){0};
|
||||||
ctx->mouse.last_pos = ctx->mouse.pos;
|
ctx->mouse.last_pos = ctx->mouse.pos;
|
||||||
|
|
||||||
|
20
ugui.h
20
ugui.h
@ -46,6 +46,12 @@ enum {
|
|||||||
UG_CNT_RESIZE_TOP = BIT(4), // can be resized
|
UG_CNT_RESIZE_TOP = BIT(4), // can be resized
|
||||||
UG_CNT_SCROLL_X = BIT(5), // can have horizontal scrolling
|
UG_CNT_SCROLL_X = BIT(5), // can have horizontal scrolling
|
||||||
UG_CNT_SCROLL_Y = BIT(6), // can have vertical scrolling
|
UG_CNT_SCROLL_Y = BIT(6), // can have vertical scrolling
|
||||||
|
// container state
|
||||||
|
CNT_STATE_MOVING = BIT(30),
|
||||||
|
CNT_STATE_RESIZE_T = BIT(29),
|
||||||
|
CNT_STATE_RESIZE_B = BIT(28),
|
||||||
|
CNT_STATE_RESIZE_L = BIT(27),
|
||||||
|
CNT_STATE_RESIZE_R = BIT(26),
|
||||||
};
|
};
|
||||||
|
|
||||||
// style, defines default height, width, color, margins, borders, etc
|
// style, defines default height, width, color, margins, borders, etc
|
||||||
@ -165,17 +171,15 @@ typedef struct {
|
|||||||
ug_vec2_t last_pos;
|
ug_vec2_t last_pos;
|
||||||
ug_vec2_t delta;
|
ug_vec2_t delta;
|
||||||
ug_vec2_t scroll_delta;
|
ug_vec2_t scroll_delta;
|
||||||
// down/pressed masks get updated on mousedown, whereas down_mask
|
// mouse.update: a mask of the mouse buttons that are being updated
|
||||||
// only on mouseup, so the masks differ by the buttons that were
|
unsigned char update;
|
||||||
// released
|
// mouse.hold: a mask of the buttons that are being held
|
||||||
// FIXME: is this the best way to approach this?
|
unsigned char hold;
|
||||||
unsigned char down_mask;
|
|
||||||
unsigned char press_mask;
|
|
||||||
} mouse;
|
} mouse;
|
||||||
// keyboard key pressed
|
// keyboard key pressed
|
||||||
struct {
|
struct {
|
||||||
unsigned char down_mask;
|
unsigned char update;
|
||||||
unsigned char press_mask;
|
unsigned char hold;
|
||||||
} key;
|
} key;
|
||||||
// input text buffer
|
// input text buffer
|
||||||
char input_text[32];
|
char input_text[32];
|
||||||
|
Loading…
Reference in New Issue
Block a user