imgui revision
authorhgn <hgodden00@gmail.com>
Tue, 5 Sep 2023 19:25:39 +0000 (20:25 +0100)
committerhgn <hgodden00@gmail.com>
Tue, 5 Sep 2023 19:25:39 +0000 (20:25 +0100)
submodules/SDL_GameControllerDB
submodules/anyascii
submodules/qoi
submodules/stb
vg_imgui.h

index c5b4df0e1061175cb11e3ebbf8045178339864a5..6ed8d054340ee8a93a684e11360b66cd8a5c168e 160000 (submodule)
@@ -1 +1 @@
-Subproject commit c5b4df0e1061175cb11e3ebbf8045178339864a5
+Subproject commit 6ed8d054340ee8a93a684e11360b66cd8a5c168e
index eb5332d0b5e48d58397e6f27475a18e058330d23..44e971c774d9ec67ca6c1f16c5a476724821ab63 160000 (submodule)
@@ -1 +1 @@
-Subproject commit eb5332d0b5e48d58397e6f27475a18e058330d23
+Subproject commit 44e971c774d9ec67ca6c1f16c5a476724821ab63
index dfc056e813c98d307238d35f7f041a725d699dfc..b8d77df1e80b652a57f0b7270449b179a6b91f40 160000 (submodule)
@@ -1 +1 @@
-Subproject commit dfc056e813c98d307238d35f7f041a725d699dfc
+Subproject commit b8d77df1e80b652a57f0b7270449b179a6b91f40
index 5736b15f7ea0ffb08dd38af21067c314d6a3aae9..8b5f1f37b5b75829fc72d38e7b5d4bcbf8a26d55 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 5736b15f7ea0ffb08dd38af21067c314d6a3aae9
+Subproject commit 8b5f1f37b5b75829fc72d38e7b5d4bcbf8a26d55
index c07868f5dfe19f0180e1734532a999229b891a44..d1070394ee1353c63d27bffcf085ae1d17d9a7cf 100644 (file)
@@ -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; i<len; i ++ ){
+      if( *value == options[i].value ){
+         display = options[i].alias;
+         break;
+      }
+   }
+
+   if( ui_button_text( box, display, 1 ) == 1 ){
+      vg_ui.focused_control_type = k_ui_control_enum;
+      vg_ui.ptr_enum = value;
+      vg_ui._enum.option_count = len;
+      vg_ui._enum.options = options;
+      rect_copy( box, vg_ui._enum.rect );
    }
 }
 
-static void ui_enum_post(void)
-{
+static void ui_enum_post(void){
    ui_rect drawer;
-   rect_copy( vg_ui.dropdown.rect, drawer );
-   drawer[3] *= vg_ui.dropdown.option_count;
+   rect_copy( vg_ui._enum.rect, drawer );
+   drawer[3] *= vg_ui._enum.option_count;
 
    int close = 0;
    int clickany= ui_click_up(UI_MOUSE_LEFT|UI_MOUSE_RIGHT|UI_MOUSE_MIDDLE),
@@ -1244,25 +1260,25 @@ static void ui_enum_post(void)
 
    /* HACK */
    vg_ui.focused_control_type = k_ui_control_none;
-   struct ui_dropdown_value *value = vg_ui.ptr_dropdown;
+   i32 *value = vg_ui.ptr_enum;
 
-   for( u32 i=0; i<vg_ui.dropdown.option_count; i++ ){
+   for( u32 i=0; i<vg_ui._enum.option_count; i++ ){
       ui_rect button;
-      ui_split( drawer, k_ui_axis_h, vg_ui.dropdown.rect[3], 0, button,drawer );
+      ui_split( drawer, k_ui_axis_h, vg_ui._enum.rect[3], 0, button,drawer );
       
       enum ui_scheme_colour colour = k_ui_bg+3;
-      if( i == value->index ) 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;
       }
    }