settings menu & texsheet
[vg.git] / vg_imgui.h
index c6553e61c0b24352636de4c3ba6619ee3f61a724..62ec1697b0cd34db8b7e633dcf2bfe823508a625 100644 (file)
@@ -1420,6 +1420,17 @@ static void _ui_textbox_to_clipboard(void){
        }
 }
 
+static void _ui_textbox_change_callback(void){
+   if( vg_ui.textbox.callbacks.change ){
+      vg_ui.textbox.callbacks.change( vg_ui.textbuf, vg_ui.textbox.len );
+
+      /* we gave permission to modify the buffer in this callback so.. */
+      int len = strlen( vg_ui.textbuf );
+      vg_ui.textbox.cursor_user = VG_MIN( vg_ui.textbox.cursor_user, len );
+      vg_ui.textbox.cursor_pos  = VG_MIN( vg_ui.textbox.cursor_pos,  len );
+   }
+}
+
 static void ui_start_modal( const char *message, u32 options );
 static void _ui_textbox_clipboard_paste(void){
    if( !SDL_HasClipboardText() )
@@ -1444,6 +1455,7 @@ static void _ui_textbox_clipboard_paste(void){
        _ui_textbox_move_cursor( &vg_ui.textbox.cursor_user, 
                             &vg_ui.textbox.cursor_pos, cpylength, 1 );
    SDL_free( text );
+   _ui_textbox_change_callback();
 }
 
 static void _ui_textbox_put_char( char c ){
@@ -1582,10 +1594,7 @@ static void _ui_textbox_backspace(void){
    if( vg_ui.focused_control_type == k_ui_control_textbox ){
       vg_ui.textbox.cursor_user = _ui_textbox_delete_char( -1 );
       vg_ui.textbox.cursor_pos = vg_ui.textbox.cursor_user;
-
-      if( vg_ui.textbox.callbacks.change ){
-         vg_ui.textbox.callbacks.change( vg_ui.textbuf, vg_ui.textbox.len );
-      }
+      _ui_textbox_change_callback();
    }
 }
 
@@ -1593,10 +1602,7 @@ static void _ui_textbox_delete(void){
    if( vg_ui.focused_control_type == k_ui_control_textbox ){
       vg_ui.textbox.cursor_user = _ui_textbox_delete_char( 1 );
       vg_ui.textbox.cursor_pos = vg_ui.textbox.cursor_user;
-
-      if( vg_ui.textbox.callbacks.change ){
-         vg_ui.textbox.callbacks.change( vg_ui.textbuf, vg_ui.textbox.len );
-      }
+      _ui_textbox_change_callback();
    }
 }
 
@@ -1653,6 +1659,7 @@ static void _ui_textbox_cut(void){
    _ui_textbox_to_clipboard();
    vg_ui.textbox.cursor_user = _ui_textbox_delete_char(0);
    vg_ui.textbox.cursor_pos = vg_ui.textbox.cursor_user;
+   _ui_textbox_change_callback();
 }
 
 static void _ui_textbox_enter(void){
@@ -1664,8 +1671,10 @@ static void _ui_textbox_enter(void){
 
       if( vg_ui.focused_control_type != k_ui_control_textbox ) return;
 
-      if( vg_ui.textbox.flags & UI_TEXTBOX_MULTILINE )
+      if( vg_ui.textbox.flags & UI_TEXTBOX_MULTILINE ){
          _ui_textbox_put_char( '\n' );
+         _ui_textbox_change_callback();
+      }
       else{
          if( !(vg_ui.textbox.flags & UI_TEXTBOX_AUTOFOCUS ) )
             ui_defocus_all();
@@ -2102,9 +2111,7 @@ static void ui_proc_utf8( const char *text ){
          ptr ++;
       }
 
-      if( vg_ui.textbox.callbacks.change ){
-         vg_ui.textbox.callbacks.change( vg_ui.textbuf, vg_ui.textbox.len );
-      }
+      _ui_textbox_change_callback();
    }
 }