Various things but also major error
[vg.git] / vg_imgui.h
index bb98812f3d90a76148ea0bcedac79f1e6b91188b..75f441e8ffb3929a0fd384cda23567166a718bef 100644 (file)
@@ -6,6 +6,10 @@
  *    1. layout is defined by subdividing
  *    2. a parent node should never be resized by the content after creation
  *    3. when the ui is in an interactive state, no controls should ever move
+ *    4. controls directly reference a memory location and use that as their
+ *       unique id
+ *    5. a maximum of ONE control per memory location can be drawn at any given
+ *       point.
  */
 
 #ifndef VG_IMGUI_H
@@ -105,13 +109,16 @@ struct{
       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;
    }
    textbox;
-
-   void (*textbuf_on_enter) ( char *buf, u32 len );
-   void (*textbuf_on_up)    ( char *buf, u32 len );
-   void (*textbuf_on_down)  ( char *buf, u32 len );
-   void (*textbuf_on_change)( char *buf, u32 len );
        
        GLuint tex_glyphs, vao, vbo, ebo;
 
@@ -1265,8 +1272,8 @@ static void _ui_textbox_up(void)
       }
    }
    else{
-      if( vg_ui.textbuf_on_up ){
-         vg_ui.textbuf_on_up( vg_ui.textbuf, vg_ui.textbox.len );
+      if( vg_ui.textbox.callbacks.up ){
+         vg_ui.textbox.callbacks.up( vg_ui.textbuf, vg_ui.textbox.len );
       }
    }
 }
@@ -1320,8 +1327,8 @@ static void _ui_textbox_down(void)
       vg_ui.textbox.cursor_pos = line_below_begin+offset;
    }
    else{
-      if( vg_ui.textbuf_on_down ){
-         vg_ui.textbuf_on_down( vg_ui.textbuf, vg_ui.textbox.len );
+      if( vg_ui.textbox.callbacks.down ){
+         vg_ui.textbox.callbacks.down( vg_ui.textbuf, vg_ui.textbox.len );
       }
    }
 }
@@ -1345,8 +1352,9 @@ static void _ui_textbox_backspace(void)
       vg_ui.textbox.cursor_user = _ui_textbox_delete_char( -1 );
       vg_ui.textbox.cursor_pos = vg_ui.textbox.cursor_user;
 
-      if( vg_ui.textbuf_on_change )
-         vg_ui.textbuf_on_change( vg_ui.textbuf, vg_ui.textbox.len );
+      if( vg_ui.textbox.callbacks.change ){
+         vg_ui.textbox.callbacks.change( vg_ui.textbuf, vg_ui.textbox.len );
+      }
    }
 }
 
@@ -1356,8 +1364,9 @@ static void _ui_textbox_delete(void)
       vg_ui.textbox.cursor_user = _ui_textbox_delete_char( 1 );
       vg_ui.textbox.cursor_pos = vg_ui.textbox.cursor_user;
 
-      if( vg_ui.textbuf_on_change )
-         vg_ui.textbuf_on_change( vg_ui.textbuf, vg_ui.textbox.len );
+      if( vg_ui.textbox.callbacks.change ){
+         vg_ui.textbox.callbacks.change( vg_ui.textbuf, vg_ui.textbox.len );
+      }
    }
 }
 
@@ -1408,8 +1417,8 @@ static void _ui_textbox_enter(void)
             ui_defocus_all();
       }
 
-      if( vg_ui.textbuf_on_enter ){
-         vg_ui.textbuf_on_enter( vg_ui.textbuf, vg_ui.textbox.len );
+      if( vg_ui.textbox.callbacks.enter ){
+         vg_ui.textbox.callbacks.enter( vg_ui.textbuf, vg_ui.textbox.len );
       }
    }
 }
@@ -1499,7 +1508,8 @@ static int _ui_textbox_run_remaining( int index[3], int wrap_length )
    return printed_chars+1;
 }
 
-static int ui_textbox( ui_rect rect, char *buf, u32 len, u32 flags )
+static int ui_textbox( ui_rect rect, char *buf, u32 len, u32 flags,
+                       struct ui_textbox_callbacks *callbacks )
 {
    int clickup= ui_click_up(UI_MOUSE_LEFT),
        click  = ui_clicking(UI_MOUSE_LEFT) | clickup,
@@ -1656,6 +1666,16 @@ static int ui_textbox( ui_rect rect, char *buf, u32 len, u32 flags )
          vg_ui.textbox.cursor_pos = 0;
          vg_ui.textbox.cursor_user = 0;
 
+         if( callbacks ){
+            vg_ui.textbox.callbacks = *callbacks;
+         }
+         else{
+            vg_ui.textbox.callbacks.change = NULL;
+            vg_ui.textbox.callbacks.down = NULL;
+            vg_ui.textbox.callbacks.up = NULL;
+            vg_ui.textbox.callbacks.enter = NULL;
+         }
+
          SDL_StartTextInput();
       }
    }
@@ -1757,8 +1777,8 @@ VG_STATIC void ui_proc_utf8( const char *text )
          ptr ++;
       }
 
-      if( vg_ui.textbuf_on_change ){
-         vg_ui.textbuf_on_change( vg_ui.textbuf, vg_ui.textbox.len );
+      if( vg_ui.textbox.callbacks.change ){
+         vg_ui.textbox.callbacks.change( vg_ui.textbuf, vg_ui.textbox.len );
       }
    }
 }