started working on events
This commit is contained in:
parent
a374a37971
commit
2dcc1b582c
42
ugui.c
42
ugui.c
@ -316,6 +316,7 @@ int ug_frame_begin(UgCtx *ctx)
|
|||||||
.id = ROOT_ID,
|
.id = ROOT_ID,
|
||||||
.type = ETYPE_DIV,
|
.type = ETYPE_DIV,
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
|
.event = 0,
|
||||||
.rect = space,
|
.rect = space,
|
||||||
.div =
|
.div =
|
||||||
{
|
{
|
||||||
@ -697,6 +698,14 @@ static UgRect position_element(UgCtx *ctx, UgElem *parent, UgRect rect, int styl
|
|||||||
return elem_rect;
|
return elem_rect;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int is_hovered(UgCtx *ctx, UgElem *elem)
|
||||||
|
{
|
||||||
|
if (ctx == NULL || elem == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return is_point_in_rect(ctx->input.mouse_pos, elem->rect);
|
||||||
|
}
|
||||||
|
|
||||||
int ug_button(UgCtx *ctx, const char *label, UgRect size)
|
int ug_button(UgCtx *ctx, const char *label, UgRect size)
|
||||||
{
|
{
|
||||||
if (ctx == NULL || label == NULL) {
|
if (ctx == NULL || label == NULL) {
|
||||||
@ -730,13 +739,23 @@ int ug_button(UgCtx *ctx, const char *label, UgRect size)
|
|||||||
c_elem->rect = position_element(ctx, parent, size, 1);
|
c_elem->rect = position_element(ctx, parent, size, 1);
|
||||||
|
|
||||||
// TODO: 3. Fill the button specific fields
|
// TODO: 3. Fill the button specific fields
|
||||||
} else if (FTEST(parent, ELEM_HASFOCUS)) {
|
}
|
||||||
if (is_point_in_rect(ctx->input.mouse_pos, c_elem->rect)) {
|
|
||||||
|
// TODO: Check for interactions
|
||||||
|
if (FTEST(parent, ELEM_HASFOCUS)) {
|
||||||
|
if (is_hovered(ctx, c_elem)) {
|
||||||
c_elem->flags |= ELEM_HASFOCUS;
|
c_elem->flags |= ELEM_HASFOCUS;
|
||||||
|
c_elem->event |= EVENT_MOUSE_HOVER;
|
||||||
bg_color = RGBA(0x00ff00ff);
|
bg_color = RGBA(0x00ff00ff);
|
||||||
|
|
||||||
|
if (ctx->input.mouse_down & UG_BTN_LEFT) {
|
||||||
|
c_elem->event |= EVENT_MOUSE_HOLD;
|
||||||
|
} else {
|
||||||
|
c_elem->event &= ~EVENT_MOUSE_HOLD;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
c_elem->event &= ~EVENT_MOUSE_HOVER;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
// TODO: Check for interactions
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw the button
|
// Draw the button
|
||||||
@ -750,7 +769,7 @@ int ug_button(UgCtx *ctx, const char *label, UgRect size)
|
|||||||
};
|
};
|
||||||
ug_fifo_enqueue(&ctx->fifo, &cmd);
|
ug_fifo_enqueue(&ctx->fifo, &cmd);
|
||||||
|
|
||||||
return 0;
|
return c_elem->event;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ug_layout_set_row(UgCtx *ctx)
|
int ug_layout_set_row(UgCtx *ctx)
|
||||||
@ -933,11 +952,14 @@ int main(void)
|
|||||||
ug_div_begin(&ctx, "main", DIV_FILL);
|
ug_div_begin(&ctx, "main", DIV_FILL);
|
||||||
{
|
{
|
||||||
ug_layout_set_column(&ctx);
|
ug_layout_set_column(&ctx);
|
||||||
ug_button(
|
if (ug_button(
|
||||||
&ctx,
|
&ctx,
|
||||||
"button0",
|
"button0",
|
||||||
(UgRect) {.y = 100, .x = 100, .w = 30, .h = 30}
|
(UgRect) {.y = 100, .x = 100, .w = 30, .h = 30}
|
||||||
);
|
) &
|
||||||
|
EVENT_MOUSE_HOLD) {
|
||||||
|
printf("HOLDING button0\n");
|
||||||
|
}
|
||||||
ug_layout_next_column(&ctx);
|
ug_layout_next_column(&ctx);
|
||||||
ug_button(&ctx, "button1", (UgRect) {.w = 30, .h = 30});
|
ug_button(&ctx, "button1", (UgRect) {.w = 30, .h = 30});
|
||||||
ug_layout_next_column(&ctx);
|
ug_layout_next_column(&ctx);
|
||||||
|
11
ugui.h
11
ugui.h
@ -28,9 +28,20 @@ enum UgElemFlags {
|
|||||||
ELEM_HASFOCUS = 1 << 1,
|
ELEM_HASFOCUS = 1 << 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum UgElemEvent {
|
||||||
|
EVENT_KEY_PRESS = 1 << 0,
|
||||||
|
EVENT_KEY_RELEASE = 1 << 1,
|
||||||
|
EVENT_KEY_HOLD = 1 << 2,
|
||||||
|
EVENT_MOUSE_HOVER = 1 << 3,
|
||||||
|
EVENT_MOUSE_PRESS = 1 << 4,
|
||||||
|
EVENT_MOUSE_RELEASE = 1 << 5,
|
||||||
|
EVENT_MOUSE_HOLD = 1 << 6,
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UgId id;
|
UgId id;
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
|
uint32_t event;
|
||||||
UgRect rect;
|
UgRect rect;
|
||||||
UgElemType type;
|
UgElemType type;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user