From 8110f8ef27afe101ef77b88ad2114d8c216f2629 Mon Sep 17 00:00:00 2001 From: hgn Date: Wed, 17 Apr 2024 02:01:19 +0100 Subject: [PATCH] Very slow work on new style slider --- menu.c | 180 ++++++++++++++++++++++++++++++++++++++++++------ menu.h | 6 +- player_replay.c | 2 +- 3 files changed, 165 insertions(+), 23 deletions(-) diff --git a/menu.c b/menu.c index fe4d909..b043dd6 100644 --- a/menu.c +++ b/menu.c @@ -44,6 +44,114 @@ bool menu_viewing_map(void) (menu.main_index == k_menu_main_map); } +static void menu_decor_select( ui_rect rect ) +{ + ui_px b = vg_ui.font->sx, hb = b/2; + ui_rect a0 = { rect[0] - 20 - hb, rect[1] + rect[3]/2 - hb, b,b }, + a1 = { rect[0] + rect[2] + 20 + hb, rect[1] + rect[3]/2 - hb, b,b }; + + ui_text( a0, "\x95", 1, k_ui_align_middle_center, 0 ); + ui_text( a1, "\x93", 1, k_ui_align_middle_center, 0 ); +} + +static void menu_standard_widget( ui_rect inout_panel, ui_rect rect, ui_px s ) +{ + ui_split( inout_panel, k_ui_axis_h, vg_ui.font->sy*s*2, + 2, rect, inout_panel ); +} + +static bool menu_slider( ui_rect inout_panel, bool select, const char *label, + const f32 min, const f32 max, f32 *value, + const char *format ) +{ + ui_rect rect, box; + menu_standard_widget( inout_panel, rect, 1 ); + ui_label( rect, label, 1, 8, box ); + + f32 t; + enum ui_button_state state = ui_slider_base( box, min, max, value, &t ), + mask_using = + k_ui_button_holding_inside | + k_ui_button_holding_outside | + k_ui_button_click, + mask_brighter = mask_using | k_ui_button_hover; + + if( menu.input_mode == k_menu_input_mode_keys ) + { + if( select ) + { + f32 m = axis_state( k_sraxis_mbrowse_h ); + if( fabsf(m) > 0.5f ) + { + *value += m * vg.time_frame_delta * ((max-min) / 2.0f); + *value = vg_clampf( *value, min, max ); + } + + menu_decor_select( rect ); + state |= k_ui_button_hover; + } + } + + ui_rect line = { box[0], box[1], t * (f32)box[2], box[3] }; + ui_fill( line, state&mask_brighter? GUI_COL_ACTIVE: GUI_COL_NORM ); + ui_fill( (ui_rect){ box[0]+line[2], box[1], box[2]-line[2], box[3] }, + GUI_COL_DARK ); + + ui_outline( box, 1, state? GUI_COL_HI: GUI_COL_ACTIVE, 0 ); + ui_slider_text( box, NULL, *value ); + + return (state & mask_using) && 1; +} + +static enum ui_button_state menu_button( ui_rect inout_panel, bool select, + const char *text ) +{ + ui_rect rect; + menu_standard_widget( inout_panel, rect, 1 ); + + enum ui_button_state state = k_ui_button_none; + + if( menu.input_mode == k_menu_input_mode_keys ) + { + if( select ) + { + menu_decor_select( rect ); + + if( button_down( k_srbind_maccept ) ) + state = k_ui_button_click; + } + } + else + { + state = ui_button_base( rect ); + select = 0; + } + + if( state == k_ui_button_click ) + { + ui_fill( rect, GUI_COL_DARK ); + } + else if( state == k_ui_button_holding_inside ) + { + ui_fill( rect, GUI_COL_DARK ); + } + else if( state == k_ui_button_holding_outside ) + { + ui_fill( rect, GUI_COL_DARK ); + ui_outline( rect, 1, GUI_COL_CLICK, 0 ); + } + else if( state == k_ui_button_hover ) + { + ui_fill( rect, GUI_COL_ACTIVE ); + ui_outline( rect, 1, GUI_COL_CLICK, 0 ); + } + else + ui_fill( rect, select? GUI_COL_ACTIVE: GUI_COL_NORM ); + + ui_text( rect, text, 1, k_ui_align_middle_center, 0 ); + return state; +} + void menu_gui(void) { if( button_down( k_srbind_mopen ) ) @@ -107,7 +215,8 @@ void menu_gui(void) const char *opts[] = { [k_menu_main_main] = "Menu", - [k_menu_main_map] = "Map" + [k_menu_main_map] = "Map", + [k_menu_main_settings ] = "Settings" }; /* TAB CONTROL */ @@ -141,17 +250,19 @@ void menu_gui(void) } } - ui_px x = 0, - spacer = 8; + ui_px x = 0, spacer = 8; for( u32 draw=0; draw<2; draw ++ ) { - if( draw ) + if( menu.input_mode == k_menu_input_mode_keys ) { - ui_rect inf_lb = { x, 0, 32, height }; - ui_fill( inf_lb, lb_down? GUI_COL_NORM: GUI_COL_NORM ); - ui_text( inf_lb, "\x91", 1, k_ui_align_middle_center, 0 ); + if( draw ) + { + ui_rect inf_lb = { x, 0, 32, height }; + ui_fill( inf_lb, lb_down? GUI_COL_NORM: GUI_COL_NORM ); + ui_text( inf_lb, "\x91", 1, k_ui_align_middle_center, 0 ); + } + x += 32 + spacer; } - x += 32 + spacer; for( i32 i=0; i 0) && (menu.main_row>0) ) menu.main_row --; + + /* MAIN / MAIN + * -------------------------------------------------------------------*/ + + if( menu.main_index == k_menu_main_main ) + { + if( menu_button( list, menu.main_row == 0, "Thing 1" ) == + k_ui_button_click ) + { + vg_info( "A\n" ); + } + + if( menu_button( list, menu.main_row == 1, "Thing 2" ) == + k_ui_button_click ) + { + vg_info( "B\n" ); + } + + if( menu_button( list, menu.main_row == 2, "Quit Game" ) == + k_ui_button_click ) + { + vg_info( "C\n" ); + } + } + else if( menu.main_index == k_menu_main_settings ) + { + ui_font_face( &vgf_default_large ); + static f32 tester; + menu_slider( list, menu.main_row==0, "Yo", 0, 20, &tester, NULL ); + } } vg_ui.frosting = 0.015f; diff --git a/menu.h b/menu.h index 46c4ec4..e9a27e1 100644 --- a/menu.h +++ b/menu.h @@ -16,7 +16,8 @@ enum menu_page enum menu_main_subpage { k_menu_main_main = 0, - k_menu_main_map = 1 + k_menu_main_map = 1, + k_menu_main_settings = 2 }; struct global_menu @@ -24,7 +25,8 @@ struct global_menu int disable_open; i32 skip_starter; enum menu_page page; - i32 main_index; + i32 main_index, + main_row; enum menu_input_mode { diff --git a/player_replay.c b/player_replay.c index 5a6323c..50ffc5c 100644 --- a/player_replay.c +++ b/player_replay.c @@ -1185,7 +1185,7 @@ void skaterift_replay_imgui(void) ui_info( panel, "World settings" ); f32 new_time = world_current_instance()->time; - if( ui_slider( panel, "Time of day", 0, 1, &new_time, NULL ) ) + if( ui_slider( panel, "Time of day", 0, 1, &new_time ) ) { world_current_instance()->time = new_time; } -- 2.25.1