ui delta mouse, dragging scroller
This commit is contained in:
@@ -87,6 +87,17 @@ fn b32 app_update(app_frame_t *frame) {
|
||||
// scroller
|
||||
{
|
||||
ui_push_container(UI_CODE_LOC, ui_percent(3), ui_percent(100));
|
||||
static f32 scroller_percent;
|
||||
f32 scroller_first = scroller_percent;
|
||||
f32 scroller_second = 90 - scroller_percent;
|
||||
|
||||
ui_spacer(UI_CODE_LOC, ui_percent(100), ui_percent(scroller_first));
|
||||
ui_signal_t sig = ui_scroller_button(UI_CODE_LOC, ui_percent(100), ui_percent(10));
|
||||
if (sig.dragging) {
|
||||
scroller_percent += (ev->mouse_delta.y / frame->window_size.y) * 100;
|
||||
scroller_percent = CLAMP(scroller_percent, 0, 90);
|
||||
}
|
||||
ui_spacer(UI_CODE_LOC, ui_percent(100), ui_percent(scroller_second));
|
||||
ui_pop_parent();
|
||||
}
|
||||
}
|
||||
@@ -96,7 +107,7 @@ fn b32 app_update(app_frame_t *frame) {
|
||||
rn_begin();
|
||||
|
||||
ui_draw();
|
||||
rn_draw_stringf(&rn_state.main_font, v2f32(0,frame->window_size.y - 100), black_color_global, "ui_boxes: %d delta: %f update: %f event_count: %d", ui->allocated_boxes, frame->delta, frame->update, frame->event_count);
|
||||
rn_draw_stringf(&rn_state.main_font, v2f32(0,frame->window_size.y - 100), black_color_global, "ui_boxes: %d delta: %f update: %f event_count: %d, delta: %f %f", ui->allocated_boxes, frame->delta, frame->update, frame->event_count, frame->last_event->mouse_delta.x, frame->last_event->mouse_delta.y);
|
||||
rn_end(frame->window_size, white_color_global);
|
||||
|
||||
ui_end_frame();
|
||||
|
||||
@@ -113,13 +113,14 @@ fn ui_box_t *ui_build_box_from_string(ui_code_loc_t loc, s8_t string, ui_box_fla
|
||||
}
|
||||
|
||||
fn ui_signal_t ui_signal_from_box(ui_box_t *box) {
|
||||
ui_signal_t result = {0};
|
||||
ui_signal_t result = {box};
|
||||
app_event_t *ev = ui->event;
|
||||
|
||||
b32 move = ev->kind == app_event_kind_mouse_move;
|
||||
b32 inside = r2f32_contains(box->rect, ev->mouse_pos);
|
||||
|
||||
if (ui_is_active_box(box)) {
|
||||
result.dragging = true;
|
||||
if (ev_left_up(ev)) {
|
||||
if (ui_is_hot_box(box)) {
|
||||
result.clicked = true;
|
||||
@@ -197,6 +198,20 @@ fn ui_box_t *ui_pop_parent(void) {
|
||||
return top;
|
||||
}
|
||||
|
||||
fn ui_box_t *ui_spacer(ui_code_loc_t loc, ui_size_t x, ui_size_t y) {
|
||||
ui_box_t *box = ui_build_box_from_id(loc, ui_null_id, flag2(ui_box_flag_draw_rect, ui_box_flag_draw_border));
|
||||
ui_set_semantic_size(box, x, y);
|
||||
return box;
|
||||
}
|
||||
|
||||
fn ui_signal_t ui_scroller_button(ui_code_loc_t loc, ui_size_t x, ui_size_t y) {
|
||||
ui_id_t id = ui_gen_id(flag2(ui_id_strategy_use_code_loc, ui_id_strategy_use_string), loc, s8_lit("spacer"));
|
||||
ui_box_t *box = ui_build_box_from_id(loc, id, flag3(ui_box_flag_draw_scroller, ui_box_flag_draw_rect, ui_box_flag_draw_border));
|
||||
ui_set_semantic_size(box, x, y);
|
||||
ui_signal_t signal = ui_signal_from_box(box);
|
||||
return signal;
|
||||
}
|
||||
|
||||
fn ui_box_t *ui_push_container(ui_code_loc_t loc, ui_size_t x, ui_size_t y) {
|
||||
ui_box_t *box = ui_build_box_from_id(loc, ui_null_id, flag2(ui_box_flag_draw_rect, ui_box_flag_draw_border));
|
||||
ui_push_top(box);
|
||||
@@ -267,8 +282,10 @@ fn void ui_draw(void) {
|
||||
// compute standalone sizes: (pixels, text_content)
|
||||
for (ui_preorder_iter_t it = ui_iterate_preorder(ui->root); ui_preorder_iter_is_valid(it); ui_iter_advance_preorder(&it)) {
|
||||
ui_box_t *box = it.box;
|
||||
if (box == ui->root) continue; // @todo: remove somehow
|
||||
for (ui_axis2_t axis = 0; axis < ui_axis2_count; axis += 1) {
|
||||
ui_size_t sem = box->semantic_size[axis];
|
||||
assert(sem.kind != ui_size_kind_null);
|
||||
if (sem.kind == ui_size_kind_pixels) {
|
||||
box->computed_size[axis] = sem.value;
|
||||
} else if (sem.kind == ui_size_kind_text_content) {
|
||||
@@ -284,7 +301,7 @@ fn void ui_draw(void) {
|
||||
for (ui_axis2_t axis = 0; axis < ui_axis2_count; axis += 1) {
|
||||
ui_size_t sem = box->semantic_size[axis];
|
||||
if (sem.kind == ui_size_kind_percent_of_parent) {
|
||||
assert(sem.value >= 0 && sem.value <= 100.0);
|
||||
// assert(sem.value >= 0 && sem.value <= 100.0);
|
||||
assert(parent->semantic_size[axis].kind == ui_size_kind_pixels ||
|
||||
parent->semantic_size[axis].kind == ui_size_kind_text_content ||
|
||||
parent->semantic_size[axis].kind == ui_size_kind_percent_of_parent);
|
||||
@@ -356,5 +373,8 @@ fn void ui_draw(void) {
|
||||
if (is_flag_set(box->flags, ui_box_flag_draw_text)) {
|
||||
rn_draw_string(font, box->rect.min, black_color_global, box->string);
|
||||
}
|
||||
if (is_flag_set(box->flags, ui_box_flag_draw_scroller)) {
|
||||
rn_draw_string(font, box->rect.min, black_color_global, s8_lit("s"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,6 +57,7 @@ enum {
|
||||
ui_box_flag_draw_border,
|
||||
ui_box_flag_draw_text,
|
||||
ui_box_flag_draw_rect,
|
||||
ui_box_flag_draw_scroller,
|
||||
};
|
||||
|
||||
typedef struct ui_box_t ui_box_t;
|
||||
@@ -92,13 +93,16 @@ struct ui_box_t {
|
||||
|
||||
typedef struct ui_signal_t ui_signal_t;
|
||||
struct ui_signal_t {
|
||||
ui_box_t *box;
|
||||
b8 clicked;
|
||||
b8 double_clicked;
|
||||
b8 right_clicked;
|
||||
b8 pressed;
|
||||
b8 released;
|
||||
b8 dragging;
|
||||
b8 hovering;
|
||||
|
||||
// b8 double_clicked;
|
||||
// b8 right_clicked;
|
||||
// b8 pressed;
|
||||
// b8 released;
|
||||
// b8 dragging;
|
||||
// b8 hovering;
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
|
||||
Reference in New Issue
Block a user