wasm app, revive ui

This commit is contained in:
krzosa
2024-12-31 09:57:41 +01:00
parent 574c265073
commit 0950667bc8
10 changed files with 105 additions and 107 deletions

View File

@@ -3,13 +3,20 @@
#include "app/app.h"
#include "app/app.c"
// #include "debug.c"
// #include "ui2.c"
#include "ui2.c"
f64 delta_time;
void app_update(app_event_t *events, i32 event_count) {
if (event_count) delta_time = events[0].delta_time;
draw_textf(v2f64(0,0), "delta time: %f", delta_time);
for (i32 i = 0; i < event_count; i += 1) {
ui_demo(events + i);
}
#if 0
ma_scratch_scope(temp) {
f64 offset = get_font_height() + 8;
f64 pos = offset;
@@ -24,5 +31,6 @@ void app_update(app_event_t *events, i32 event_count) {
}
}
}
#endif
}

View File

@@ -18,20 +18,20 @@ struct ui_signal_t {
b8 overlapping;
};
ui_signal_t ui_interact(r2f64_t rect) {
ui_signal_t ui_interact(app_event_t *ev, r2f64_t rect) {
ui_signal_t sig = {0};
if (r2f64_contains(rect, mouse_pos_g)) {
if (r2f64_contains(rect, ev->mouse_pos)) {
sig.overlapping = true;
if (mouse_button_press_g[app_mouse_button_left]) {
if (ev->kind == app_event_kind_mouse_down && ev->mouse_button == app_mouse_button_left) {
sig.pressed = true;
}
}
return sig;
}
b32 ui_button(r2f64_t rect, char *title) {
b32 ui_button(app_event_t *ev, r2f64_t rect, char *title) {
v2f64_t text_pos = ui_calc_text_pos(rect, title);
ui_signal_t sig = ui_interact(rect);
ui_signal_t sig = ui_interact(ev, rect);
v4f32_t rect_color = secondary_color_global;
v4f32_t text_color = black_color_global;
@@ -39,17 +39,17 @@ b32 ui_button(r2f64_t rect, char *title) {
rect_color = primary_color_global;
}
clip(rect);
set_clip(rect);
draw_rect(rect, rect_color);
draw_text(text_pos, text_color, title, str_len(title));
clip(r2f64(-1000, -1000, 1000000, 1000000));
draw_text(text_pos, text_color, s8_from_char(title));
set_clip(r2f64(-1000, -1000, 1000000, 1000000));
return sig.pressed;
}
b32 ui_checkbox(r2f64_t rect, b32 *value, char *title) {
b32 ui_checkbox(app_event_t *ev, r2f64_t rect, b32 *value, char *title) {
v2f64_t text_pos = ui_calc_text_pos(rect, title);
ui_signal_t sig = ui_interact(rect);
ui_signal_t sig = ui_interact(ev, rect);
if (sig.pressed) *value = !*value;
v4f32_t rect_color = secondary_color_global;
@@ -61,10 +61,10 @@ b32 ui_checkbox(r2f64_t rect, b32 *value, char *title) {
rect_color = v4f32_lerp(rect_color, accent2_color_global, 0.5);
}
clip(rect);
set_clip(rect);
draw_rect(rect, rect_color);
draw_text(text_pos, text_color, title, str_len(title));
clip(r2f64(-1000, -1000, 1000000, 1000000));
draw_text(text_pos, text_color, s8_from_char(title));
set_clip(r2f64(-1000, -1000, 1000000, 1000000));
return *value;
}
@@ -84,21 +84,21 @@ ui_id_t ui_string_to_id(const char *string, i32 len) { // FNV HASH (1a?)
#define ui_location_id() ui_string_to_id(FILE_AND_LINE, sizeof(FILE_AND_LINE) - 1)
ui_id_t ui_active_element = {0};
void ui_slider(r2f64_t rect, ui_id_t id, f64 *value, char *title) {
void ui_slider(app_event_t *ev, r2f64_t rect, ui_id_t id, f64 *value, char *title) {
v2f64_t text_pos = ui_calc_text_pos(rect, title);
ui_signal_t sig = ui_interact(rect);
ui_signal_t sig = ui_interact(ev, rect);
b32 interacting = false;
{
if (sig.pressed) {
ui_active_element = id;
}
if (id.value == ui_active_element.value && mouse_button_down_g[app_mouse_button_left]) {
if (id.value == ui_active_element.value) {
interacting = true;
}
}
if (interacting) {
f64 mouse_pos = mouse_pos_g.x;
f64 mouse_pos = ev->mouse_pos.x;
v2f64_t rect_size = r2f64_get_size(rect);
*value = (mouse_pos - rect.min.x) / rect_size.x;
*value = CLAMP(*value, 0, 1.0);
@@ -113,62 +113,19 @@ void ui_slider(r2f64_t rect, ui_id_t id, f64 *value, char *title) {
if (sig.overlapping) slider_color = v4f32_lerp(slider_color, accent2_color_global, 0.2);
v4f32_t text_color = black_color_global;
clip(rect);
set_clip(rect);
draw_rect(rect, rect_color);
draw_rect(slider_rect, slider_color);
draw_text(text_pos, text_color, title, str_len(title));
clip(r2f64(-1000, -1000, 1000000, 1000000));
draw_text(text_pos, text_color, s8_from_char(title));
set_clip(r2f64(-1000, -1000, 1000000, 1000000));
}
typedef struct ui_input_state ui_input_state;
struct ui_input_state {
char *buff;
int len;
int cap;
int cursor;
};
void ui_input_text(r2f64_t rect, ui_input_state *in) {
v2f64_t tp = ui_calc_text_pos(rect, "a");
v2f64_t text_pos = {rect.min.x, tp.y};
ui_signal_t sig = ui_interact(rect);
v4f32_t rect_color = secondary_color_global;
if (r2f64_contains(rect, mouse_pos_g)) {
if (key_press_g == app_key_right) in->cursor += 1;
if (key_press_g == app_key_left) in->cursor -= 1;
if (key_press_g == app_key_backspace) {
debugf("a");
}
in->cursor = CLAMP(in->cursor, 0, in->len);
if (sig.overlapping) rect_color = v4f32_lerp(rect_color, accent2_color_global, 0.2);
}
clip(rect);
draw_rect(rect, rect_color);
draw_text(text_pos, black_color_global, in->buff, in->len);
clip(r2f64(-1000, -1000, 1000000, 1000000));
f64 cx = measure_text_ex(in->buff, in->cursor);
v2f64_t cursor_pos = {text_pos.x + cx, text_pos.y};
draw_rect(r2f64_center_halfdim(cursor_pos, v2f64(1, 6)), black_color_global);
}
void ui_demo(void) {
if (mouse_button_release_g[app_mouse_button_left]) {
void ui_demo(app_event_t *ev) {
if (ev->kind == app_event_kind_mouse_up) {
ui_active_element = (ui_id_t){0};
}
r2f64_t window_rect = (r2f64_t){(v2f64_t){0}, window_size_g};
r2f64_t window_rect = (r2f64_t){(v2f64_t){0}, ev->window_size};
r2f64_t top_bar_rect = r2f64_cut_top(&window_rect, get_font_height() + 20);
draw_rect(window_rect, primary_color_global);
@@ -183,7 +140,7 @@ void ui_demo(void) {
if (open_file_panel) title = "▼ file";
open_file_panel_xsize = measure_text(title) + padding*2;
r2f64_t rect = r2f64_cut_left(&top_bar_rect, open_file_panel_xsize);
if (ui_checkbox(rect, &open_file_panel, title)) {
if (ui_checkbox(ev, rect, &open_file_panel, title)) {
}
r2f64_t gap_rect = r2f64_cut_left(&top_bar_rect, 1);
draw_rect(gap_rect, black_color_global);
@@ -200,27 +157,27 @@ void ui_demo(void) {
char buff[64];
stbsp_snprintf(buff, sizeof(buff), "%f", slider_value);
r2f64_t rect = r2f64_cut_top(&panel_rect, item_size);
ui_slider(rect, ui_location_id(), &slider_value, buff);
ui_slider(ev, rect, ui_location_id(), &slider_value, buff);
}
{
static char buff[64];
static ui_input_state input;
if (input.buff == NULL) {
input.buff = buff;
input.cap = sizeof(buff);
}
// {
// static char buff[64];
// static ui_input_state input;
// if (input.buff == NULL) {
// input.buff = buff;
// input.cap = sizeof(buff);
// }
r2f64_t rect = r2f64_cut_top(&panel_rect, item_size);
ui_input_text(rect, &input);
}
// r2f64_t rect = r2f64_cut_top(&panel_rect, item_size);
// ui_input_text(rect, &input);
// }
}
{
char *title = "edit";
r2f64_t rect = r2f64_cut_left(&top_bar_rect, measure_text(title) + padding*2);
if (ui_button(rect, title)) {
if (ui_button(ev, rect, title)) {
}
r2f64_t gap_rect = r2f64_cut_left(&top_bar_rect, 1);
draw_rect(gap_rect, black_color_global);
@@ -229,13 +186,10 @@ void ui_demo(void) {
{
char *title = "view";
r2f64_t rect = r2f64_cut_left(&top_bar_rect, measure_text(title) + padding*2);
if (ui_button(rect, title)) {
if (ui_button(ev, rect, title)) {
}
r2f64_t gap_rect = r2f64_cut_left(&top_bar_rect, 1);
draw_rect(gap_rect, black_color_global);
}
if (input_text_len_g) {
debugf("%.*s", input_text_len_g, input_text_g);
}
}