bad char
[vg.git] / vg_imgui.c
index 600d11871d5c5391d8a40e28f7890e4d2bec40c5..bb4f46f54d7f7d152904985871c75d0f9f6c2140 100644 (file)
@@ -839,7 +839,7 @@ u32 ui_ntext( ui_rect rect, const char *str, u32 len, ui_px scale,
          text_cursor[0] -= vg_ui.font->sx*scale;
 
          ui_rect glyph;
-         ui_text_glyph( vg_ui.font, '\xb6' /*FIXME*/, glyph );
+         ui_text_glyph( vg_ui.font, '\xb1' /*FIXME*/, glyph );
          ui_fill_rect( text_cursor, 0x00ffffff, glyph );
          text_cursor[0] += vg_ui.font->sx*scale;
       }
@@ -1199,6 +1199,14 @@ void ui_postrender(void)
  * -----------------------------------------------------------------------------
  */
 
+enum ui_button_state ui_checkbox_base( ui_rect box, i32 *data )
+{
+   enum ui_button_state state = ui_button_base( box );
+   if( state == k_ui_button_click )
+      *data = (*data) ^ 0x1;
+   return state;
+}
+
 int ui_checkbox( ui_rect inout_panel, const char *str_label, i32 *data )
 {
    ui_rect rect, label, box;
@@ -1206,12 +1214,34 @@ int ui_checkbox( ui_rect inout_panel, const char *str_label, i32 *data )
 
    ui_split( rect, k_ui_axis_v, -rect[3], 0, label, box );
    ui_text( label, str_label, k_ui_scale, k_ui_align_middle_left, 0 );
+   
+   enum ui_button_state state = ui_checkbox_base( box, data );
 
-   int changed = ui_colourbutton( box, k_ui_bg, 0, 0 ) == k_ui_button_click;
-   if( changed )
-      *data = (*data) ^ 0x1;
+   if( state == k_ui_button_holding_inside )
+   {
+      ui_fill( box, ui_colour(k_ui_bg+2) );
+      ui_outline( box, 1, ui_colour(k_ui_fg), 0 );
+   }
+   else if( state == k_ui_button_holding_outside )
+   {
+      ui_fill( box, ui_colour(k_ui_bg) );
+      ui_outline( box, 1, ui_colour(k_ui_fg), 0 );
+   }
+   else if( state == k_ui_button_hover )
+   {
+      ui_fill( box, ui_colour(k_ui_bg) );
+      ui_outline( box, 1, ui_colour(k_ui_fg), 0 );
+   }
+   else 
+   {
+      ui_fill( box, ui_colour(k_ui_bg) );
+      ui_outline( box, 1, ui_colour(k_ui_bg+4), 0 );
+   }
+
+   bool changed = (state == k_ui_button_click);
 
-   if( *data ){
+   if( *data )
+   {
       ui_rect_pad( box, (ui_px[2]){4,4} );
       ui_fill( box, ui_colour( k_ui_orange ) );
    }
@@ -1301,57 +1331,67 @@ static void ui_enum_post(void){
  * -----------------------------------------------------------------------------
  */
 
-static enum ui_button_state _ui_slider
-      ui_rect box, f32 min, f32 max, f32 *value, const char *format )
+enum ui_button_state ui_slider_base
+      ui_rect box, f32 min, f32 max, f32 *value, f32 *out_t )
 {
-   f32 t;
-
-   enum ui_button_state 
-      mask_using = 
-         k_ui_button_holding_inside |
-         k_ui_button_holding_outside |
-         k_ui_button_click,
-      mask_brighter =
-         mask_using | k_ui_button_hover,
-      state = ui_colourbutton( box, k_ui_bg, k_ui_bg+2, k_ui_bg+3 );
+   enum ui_button_state mask_using = 
+                           k_ui_button_holding_inside |
+                           k_ui_button_holding_outside |
+                           k_ui_button_click,
+      state = ui_button_base( box );
 
-   if( state & mask_using ){
-      t = vg_clampf( (f32)(vg_ui.mouse[0] - box[0]) / (f32)( box[2] ),
-                     0.0f, 1.0f );
+   f32 t;
+   if( state & mask_using )
+   {
+      t = vg_clampf( (f32)(vg_ui.mouse[0] - box[0]) / (f32)( box[2] ), 0,1 );
       *value = vg_lerpf( min, max, t );
    }
    else
       t = vg_clampf( (*value - min) / (max-min), 0.0f, 1.0f );
-   
-   ui_rect line     = { box[0], box[1], t * (f32)box[2], box[3] };
-   ui_fill( line, ui_colour(state&mask_brighter? k_ui_bg+4: k_ui_bg+2) );
 
-   ui_outline( box, 1, ui_colour(state? k_ui_fg+3: k_ui_bg+3), 0 );
+   *out_t = t;
+   
+   return state;
+}
 
+void ui_slider_text( ui_rect box, const char *format, f32 value )
+{
    /* TODO: replace this one day with our own function */
    char buf[32];
-   snprintf( buf, sizeof(buf), format? format: "%.2f", *value );
+   snprintf( buf, sizeof(buf), format? format: "%.2f", value );
    ui_text( box, buf, 1, k_ui_align_middle_center, 0 );
-
-   return state;
 }
 
-bool ui_slider( ui_rect inout_panel, const char *str_label, 
-                f32 min, f32 max, f32 *value, const char *format )
+bool ui_slider_standard( ui_rect box, f32 min, f32 max, f32 *value,
+                         const char *format )
 {
-   ui_rect rect, label, box;
-   ui_standard_widget( inout_panel, rect, 1 );
-   ui_label( rect, str_label, k_ui_scale, 0, box );
+   f32 t;
 
    enum ui_button_state mask_using = 
          k_ui_button_holding_inside |
          k_ui_button_holding_outside |
-         k_ui_button_click;
+         k_ui_button_click,
+      mask_brighter = mask_using | k_ui_button_hover,
+      state = ui_slider_base( box, min, max, value, &t );
 
-   if( _ui_slider( box, min, max, value, format ) & mask_using )
-      return 1;
-   else
-      return 0;
+   ui_rect line = { box[0], box[1], t * (f32)box[2], box[3] };
+   ui_fill( line, ui_colour(state&mask_brighter? k_ui_bg+4: k_ui_bg+2) );
+
+   ui_fill( (ui_rect){ box[0]+line[2], box[1], box[2]-line[2], box[3] },
+               ui_colour( k_ui_bg ) );
+   ui_outline( box, 1, ui_colour(state? k_ui_fg+3: k_ui_bg+3), 0 );
+   ui_slider_text( box, NULL, *value );
+
+   return (state & mask_using) && 1;
+}
+
+bool ui_slider( ui_rect inout_panel, const char *str_label, 
+                f32 min, f32 max, f32 *value )
+{
+   ui_rect rect, label, box;
+   ui_standard_widget( inout_panel, rect, 1 );
+   ui_label( rect, str_label, k_ui_scale, 0, box );
+   return ui_slider_standard( box, min, max, value, NULL );
 }
 
 /*
@@ -1376,8 +1416,9 @@ void ui_colourpicker( ui_rect inout_panel, const char *str_label, v4f value )
 
    enum ui_button_state modified = 0x00;
 
-   for( u32 i=0; i<4; i ++ ){
-      modified |= _ui_slider( sliders[i], 0.0f, 1.0f, hsv+i, 
+   for( u32 i=0; i<4; i ++ )
+   {
+      modified |= ui_slider_standard( sliders[i], 0.0f, 1.0f, hsv+i,
                      (const char *[]){ "hue %.2f",
                                        "sat %.2f",
                                        "lum %.2f",