From ba09ee4b8ed1d994f0e97c8c34f221dc13555195 Mon Sep 17 00:00:00 2001 From: hgn Date: Tue, 5 Sep 2023 20:25:39 +0100 Subject: [PATCH] imgui revision --- submodules/SDL_GameControllerDB | 2 +- submodules/anyascii | 2 +- submodules/qoi | 2 +- submodules/stb | 2 +- vg_imgui.h | 158 ++++++++++++++++++-------------- 5 files changed, 91 insertions(+), 75 deletions(-) diff --git a/submodules/SDL_GameControllerDB b/submodules/SDL_GameControllerDB index c5b4df0..6ed8d05 160000 --- a/submodules/SDL_GameControllerDB +++ b/submodules/SDL_GameControllerDB @@ -1 +1 @@ -Subproject commit c5b4df0e1061175cb11e3ebbf8045178339864a5 +Subproject commit 6ed8d054340ee8a93a684e11360b66cd8a5c168e diff --git a/submodules/anyascii b/submodules/anyascii index eb5332d..44e971c 160000 --- a/submodules/anyascii +++ b/submodules/anyascii @@ -1 +1 @@ -Subproject commit eb5332d0b5e48d58397e6f27475a18e058330d23 +Subproject commit 44e971c774d9ec67ca6c1f16c5a476724821ab63 diff --git a/submodules/qoi b/submodules/qoi index dfc056e..b8d77df 160000 --- a/submodules/qoi +++ b/submodules/qoi @@ -1 +1 @@ -Subproject commit dfc056e813c98d307238d35f7f041a725d699dfc +Subproject commit b8d77df1e80b652a57f0b7270449b179a6b91f40 diff --git a/submodules/stb b/submodules/stb index 5736b15..8b5f1f3 160000 --- a/submodules/stb +++ b/submodules/stb @@ -1 +1 @@ -Subproject commit 5736b15f7ea0ffb08dd38af21067c314d6a3aae9 +Subproject commit 8b5f1f37b5b75829fc72d38e7b5d4bcbf8a26d55 diff --git a/vg_imgui.h b/vg_imgui.h index c07868f..d107039 100644 --- a/vg_imgui.h +++ b/vg_imgui.h @@ -104,48 +104,46 @@ struct{ void *focused_control_id; /* uses the memory location of various locking controls as an id */ char *textbuf; - struct ui_dropdown_value{ - i32 index, value; - } - *ptr_dropdown; + i32 *ptr_enum; }; u32 focused_control_hit; enum ui_control_type{ k_ui_control_none, k_ui_control_textbox, - k_ui_control_dropdown, + k_ui_control_enum, k_ui_control_modal } focused_control_type; - union{ - struct ui_textbuf{ - int cursor_user, cursor_pos; - u32 len; - u32 flags; - - struct ui_textbox_callbacks{ - void (*enter)( char *, u32 ), - (*up)( char *, u32 ), - (*down)( char *, u32 ), - (*change)( char *, u32 ); + union{ /* controls that can be focused */ + struct ui_textbuf{ + int cursor_user, cursor_pos; + u32 len; + u32 flags; + + struct ui_textbox_callbacks{ + void (*enter)( char *, u32 ), + (*up)( char *, u32 ), + (*down)( char *, u32 ), + (*change)( char *, u32 ); + } + callbacks; } - callbacks; - } - textbox; + textbox; - struct ui_dropdown{ - struct ui_dropdown_opt{ - const char *alias; - i32 value; + struct ui_enum{ + struct ui_enum_opt{ + i32 value; + const char *alias; + } + *options; + u32 option_count; + ui_rect rect; } - *options; - u32 option_count; - ui_rect rect; - } - dropdown; + _enum; }; + struct ui_modal{ const char *message; u32 options; @@ -981,8 +979,16 @@ static void ui_defocus_all(void) vg_ui.focused_control_type = k_ui_control_none; } -static int ui_colourbutton( ui_rect rect, enum ui_scheme_colour colour ) -{ +enum ui_button_state { + k_ui_button_none = 0, + k_ui_button_click = 1, + k_ui_button_holding_inside = 2, + k_ui_button_holding_outside = 3, + k_ui_button_hover = 4 +}; + +static enum ui_button_state ui_colourbutton( ui_rect rect, + enum ui_scheme_colour colour ){ int clickup= ui_click_up(UI_MOUSE_LEFT), click = ui_clicking(UI_MOUSE_LEFT) | clickup, target = ui_inside_rect( rect, vg_ui.mouse_click ) && click, @@ -1017,48 +1023,53 @@ static int ui_colourbutton( ui_rect rect, enum ui_scheme_colour colour ) vg_ui.click_fade_opacity = 1.0f; ui_defocus_all(); - return 1; + return k_ui_button_click; } else{ ui_fill( rect, col_highlight ); - return 0; + return k_ui_button_holding_inside; } } else{ ui_fill( rect, col_base ); ui_outline( rect, 1, col_highlight ); - return 0; + return k_ui_button_holding_outside; } } else{ ui_fill( rect, col_base ); - return 0; + return k_ui_button_none; } } else{ if( hover ){ ui_fill( rect, col_hover ); - return 0; + return k_ui_button_hover; } else{ ui_fill( rect, col_base ); - return 0; + return k_ui_button_none; } } } -static int ui_colourbutton_text( ui_rect rect, const char *string, ui_px scale, - enum ui_scheme_colour colour ) -{ - int result = ui_colourbutton( rect, colour ); +static enum ui_button_state ui_colourbutton_text( + ui_rect rect, const char *string, ui_px scale, + enum ui_scheme_colour colour ){ + enum ui_button_state state = ui_colourbutton( rect, colour ); ui_rect t = { 0,0, ui_text_line_width( string )*scale, 14*scale }; ui_rect_center( rect, t ); - ui_text( t, string, scale, k_ui_align_left, ui_colourcont(colour) ); - return result; + + u32 text_colour = ui_colourcont(colour); + if( state == k_ui_button_holding_inside ) + text_colour = colour; + + ui_text( t, string, scale, k_ui_align_left, text_colour ); + return state; } -static int ui_button_text( ui_rect rect, const char *string, ui_px scale ) -{ +static enum ui_button_state ui_button_text( ui_rect rect, + const char *string, ui_px scale ){ return ui_colourbutton_text( rect, string, scale, k_ui_bg+4 ); } @@ -1088,7 +1099,7 @@ static void ui_postrender(void) ui_fill( rect, colour ); } - if( vg_ui.focused_control_type == k_ui_control_dropdown ){ + if( vg_ui.focused_control_type == k_ui_control_enum ){ ui_enum_post(); } else if( vg_ui.focused_control_type == k_ui_control_modal ){ @@ -1123,7 +1134,7 @@ static void ui_postrender(void) ui_rect_center( row1, btn ); vg_ui.focused_control_type = k_ui_control_none; /* HACK */ - if( !ui_button_text( btn, "OK", 1 ) ) + if( ui_button_text( btn, "OK", 1 ) != 1 ) vg_ui.focused_control_hit = 1; vg_ui.focused_control_type = k_ui_control_modal; /* HACK */ vg_ui.wants_mouse = 1; @@ -1183,13 +1194,12 @@ static void ui_dev_colourview(void) * ----------------------------------------------------------------------------- */ -static int ui_checkbox( ui_rect rect, const char *str_label, int *data ) -{ +static int ui_checkbox( ui_rect rect, const char *str_label, int *data ){ ui_rect label, box; ui_split( rect, k_ui_axis_v, -rect[3], 0, label, box ); ui_text( label, str_label, 1, k_ui_align_middle_left, 0 ); - int changed = ui_colourbutton( box, k_ui_bg ); + int changed = ui_colourbutton( box, k_ui_bg )==1; if( changed ) *data = (*data) ^ 0x1; @@ -1211,28 +1221,34 @@ static int ui_checkbox( ui_rect rect, const char *str_label, int *data ) * postrender step. */ static void ui_enum( ui_rect rect, const char *str_label, - struct ui_dropdown_opt *options, u32 len, - struct ui_dropdown_value *value ) + struct ui_enum_opt *options, u32 len, i32 *value ) { ui_rect label, box; ui_split( rect, k_ui_axis_v, ui_text_line_width( str_label ) + 8, 0, label, box ); ui_text( label, str_label, 1, k_ui_align_middle_left, 0 ); - if( ui_button_text( box, options[ value->index ].alias, 1 ) ){ - vg_ui.focused_control_type = k_ui_control_dropdown; - vg_ui.ptr_dropdown = value; - vg_ui.dropdown.option_count = len; - vg_ui.dropdown.options = options; - rect_copy( box, vg_ui.dropdown.rect ); + const char *display = "OUT OF RANGE"; + for( u32 i=0; iindex ) colour = k_ui_orange; + if( vg_ui._enum.options[i].value == *value ) + colour = k_ui_orange; - if( ui_colourbutton_text( button, vg_ui.dropdown.options[i].alias, 1, - colour ) ){ - value->index = i; - value->value = vg_ui.dropdown.options[i].value; + if( ui_colourbutton_text( button, vg_ui._enum.options[i].alias, 1, + colour ) == 1 ){ + *value = vg_ui._enum.options[i].value; close = 1; } } /* HACK */ - vg_ui.focused_control_type = k_ui_control_dropdown; + vg_ui.focused_control_type = k_ui_control_enum; if( !close ) vg_ui.focused_control_hit = 1; @@ -2003,7 +2019,7 @@ static int vgi_window( ui_rect in_window, const char *title, u32 flags, if( flags & k_vgi_window_closeable ){ ui_rect quit_button; ui_split( bar, k_ui_axis_v, bar[2]-bar[3], 2, bar, quit_button ); - if( ui_button_text( quit_button, "X", 1 ) ){ + if( ui_button_text( quit_button, "X", 1 ) == 1 ){ return 0; } } -- 2.25.1