Start testing adding an immediate-mode node element
This commit is contained in:
parent
353409a5bf
commit
fb1af03308
@ -37,6 +37,8 @@ struct ui_ctx {
|
|||||||
i64 active;
|
i64 active;
|
||||||
i64 mouse_x;
|
i64 mouse_x;
|
||||||
i64 mouse_y;
|
i64 mouse_y;
|
||||||
|
i64 rel_x;
|
||||||
|
i64 rel_y;
|
||||||
bool mouse_down;
|
bool mouse_down;
|
||||||
bool mouse_up;
|
bool mouse_up;
|
||||||
const window_t *wnd;
|
const window_t *wnd;
|
||||||
@ -47,5 +49,6 @@ void reset_ui_ctx(ui_ctx_t *ctx);
|
|||||||
void handle_ui_events(const window_t *wnd, ui_ctx_t *ctx,
|
void handle_ui_events(const window_t *wnd, ui_ctx_t *ctx,
|
||||||
const SDL_Event *event);
|
const SDL_Event *event);
|
||||||
bool button(const window_t *wnd, ui_ctx_t *ctx, rect_t rect);
|
bool button(const window_t *wnd, ui_ctx_t *ctx, rect_t rect);
|
||||||
|
rect_t node(const window_t *wnd, ui_ctx_t *ctx, rect_t rect);
|
||||||
|
|
||||||
#endif // !UI_H
|
#endif // !UI_H
|
||||||
|
@ -27,6 +27,7 @@ struct compositor {
|
|||||||
u64 last_clicked_mouse_y;
|
u64 last_clicked_mouse_y;
|
||||||
i64 node_hovered;
|
i64 node_hovered;
|
||||||
u64 count;
|
u64 count;
|
||||||
|
rect_t *rects;
|
||||||
node_t *nodes;
|
node_t *nodes;
|
||||||
bool move_node;
|
bool move_node;
|
||||||
ui_ctx_t ctx;
|
ui_ctx_t ctx;
|
||||||
@ -41,6 +42,7 @@ i32 run_main_loop(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
compositor_t comp = {0};
|
compositor_t comp = {0};
|
||||||
|
comp.rects = (rect_t *)malloc(sizeof(rect_t) * MAX_NODES);
|
||||||
comp.nodes = (node_t *)malloc(sizeof(node_t) * MAX_NODES);
|
comp.nodes = (node_t *)malloc(sizeof(node_t) * MAX_NODES);
|
||||||
|
|
||||||
window_t *main_window = &(comp.windows[0]);
|
window_t *main_window = &(comp.windows[0]);
|
||||||
@ -63,6 +65,13 @@ i32 run_main_loop(void) {
|
|||||||
|
|
||||||
colour_t bg_colour = {.abgr = 0xffffffff};
|
colour_t bg_colour = {.abgr = 0xffffffff};
|
||||||
|
|
||||||
|
comp.rects[0] = (rect_t){
|
||||||
|
.topleft.x = 150,
|
||||||
|
.topleft.y = 50,
|
||||||
|
.w = NODE_WIDTH,
|
||||||
|
.h = NODE_HEIGHT,
|
||||||
|
};
|
||||||
|
|
||||||
while (comp.running) {
|
while (comp.running) {
|
||||||
while (SDL_PollEvent(&(comp.event))) {
|
while (SDL_PollEvent(&(comp.event))) {
|
||||||
for (u64 i = 0; i < MAX_WINDOWS; ++i) {
|
for (u64 i = 0; i < MAX_WINDOWS; ++i) {
|
||||||
@ -125,6 +134,8 @@ i32 run_main_loop(void) {
|
|||||||
printf("Button 2 pressed\n");
|
printf("Button 2 pressed\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
comp.rects[0] = node(main_window, &(comp.ctx), comp.rects[0]);
|
||||||
|
|
||||||
for (u64 i = 0; i < MAX_WINDOWS; ++i) {
|
for (u64 i = 0; i < MAX_WINDOWS; ++i) {
|
||||||
swap_buffers(&(comp.windows[i]));
|
swap_buffers(&(comp.windows[i]));
|
||||||
}
|
}
|
||||||
|
50
src/ui.c
50
src/ui.c
@ -32,12 +32,17 @@ void reset_ui_ctx(ui_ctx_t *ctx) {
|
|||||||
ctx->count = 0;
|
ctx->count = 0;
|
||||||
ctx->mouse_down = false;
|
ctx->mouse_down = false;
|
||||||
ctx->mouse_up = false;
|
ctx->mouse_up = false;
|
||||||
|
ctx->rel_x = 0;
|
||||||
|
ctx->rel_y = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_ui_events(const window_t *wnd, ui_ctx_t *ctx,
|
void handle_ui_events(const window_t *wnd, ui_ctx_t *ctx,
|
||||||
const SDL_Event *event) {
|
const SDL_Event *event) {
|
||||||
switch (event->type) {
|
switch (event->type) {
|
||||||
case SDL_MOUSEMOTION:
|
case SDL_MOUSEMOTION:
|
||||||
|
ctx->rel_x = event->motion.xrel;
|
||||||
|
ctx->rel_y = event->motion.yrel;
|
||||||
|
|
||||||
if (wnd->id == event->motion.windowID) {
|
if (wnd->id == event->motion.windowID) {
|
||||||
ctx->mouse_x = event->motion.x;
|
ctx->mouse_x = event->motion.x;
|
||||||
ctx->mouse_y = event->motion.y;
|
ctx->mouse_y = event->motion.y;
|
||||||
@ -45,7 +50,6 @@ void handle_ui_events(const window_t *wnd, ui_ctx_t *ctx,
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case SDL_MOUSEBUTTONDOWN:
|
case SDL_MOUSEBUTTONDOWN:
|
||||||
if (wnd->id == event->button.windowID) {
|
if (wnd->id == event->button.windowID) {
|
||||||
ctx->mouse_x = event->button.x;
|
ctx->mouse_x = event->button.x;
|
||||||
@ -102,3 +106,47 @@ bool button(const window_t *wnd, ui_ctx_t *ctx, rect_t rect) {
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rect_t node(const window_t *wnd, ui_ctx_t *ctx, rect_t rect) {
|
||||||
|
if (ctx->count + 1 >= MAX_UI_ELEMENTS) {
|
||||||
|
return (rect_t){0};
|
||||||
|
}
|
||||||
|
|
||||||
|
ui_elem_t elem = (ui_elem_t){
|
||||||
|
.id = (ctx->count)++,
|
||||||
|
.rect = rect,
|
||||||
|
.type = UI_ELEM_BUTTON,
|
||||||
|
};
|
||||||
|
|
||||||
|
fill_rect(wnd, rect, colours[UI_ELEM_BUTTON].fill);
|
||||||
|
draw_rect(wnd, rect, colours[UI_ELEM_BUTTON].border);
|
||||||
|
|
||||||
|
if (wnd != ctx->wnd) {
|
||||||
|
return rect;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ctx->mouse_up) {
|
||||||
|
ctx->hovered = ctx->active = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ctx->hovered == elem.id && ctx->active == elem.id) {
|
||||||
|
return (rect_t){
|
||||||
|
.topleft.x = rect.topleft.x + ctx->rel_x,
|
||||||
|
.topleft.y = rect.topleft.y + ctx->rel_y,
|
||||||
|
.w = rect.w,
|
||||||
|
.h = rect.h,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!aabb(&elem, ctx->mouse_x, ctx->mouse_y)) {
|
||||||
|
return rect;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx->hovered = elem.id;
|
||||||
|
|
||||||
|
if (ctx->mouse_down) {
|
||||||
|
ctx->active = elem.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rect;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user