X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=vg_console.h;fp=vg_console.h;h=66e7f5f26c65a440d08cbfa907088bcf6720333f;hb=ffd724233b7a3cb89d0d5d253ba4c475d87c76e2;hp=dd9cc77cea02e4d21318feaa51641ecf95f11628;hpb=2026f6fe648696888762c5b10210191748a6c9de;p=vg.git diff --git a/vg_console.h b/vg_console.h index dd9cc77..66e7f5f 100644 --- a/vg_console.h +++ b/vg_console.h @@ -7,7 +7,7 @@ #define VG_GAME #endif -#include "vg/vg_ui.h" +#include "vg/vg_imgui.h" #include "vg/vg_log.h" #define VG_VAR_F32( NAME, ... ) \ @@ -63,7 +63,6 @@ struct vg_console{ char input[96], input_copy[96]; - int cursor_user, cursor_pos, string_length; char history[32][96]; int history_last, history_pos, history_count; @@ -84,14 +83,6 @@ VG_STATIC void vg_execute_console_input( const char *cmd ); /* * Console interface */ -VG_STATIC void console_make_selection( int* start, int* end ); -VG_STATIC void console_move_cursor( int* cursor0, int* cursor1, - int dir, int snap_together ); -VG_STATIC int console_makeroom( int datastart, int length ); -VG_STATIC int console_delete_char( int direction ); -VG_STATIC void console_to_clipboard(void); -VG_STATIC void console_clipboard_paste(void); -VG_STATIC void console_put_char( char c ); VG_STATIC void console_history_get( char* buf, int entry_num ); VG_STATIC int _vg_console_enabled(void); VG_STATIC void console_proc_key( SDL_Keysym ev ); @@ -137,96 +128,6 @@ void vg_console_reg_cmd( const char *alias, vg_info( "Console function '%s' registered\n", alias ); } -VG_STATIC void _vg_console_draw(void) -{ -#if 0 - if( !vg_console.enabled ) - return; - - SDL_AtomicLock( &log_print_sl ); - - int ptr = vg_log.buffer_line_current; - int const fh = 14, - log_lines = 32; - int console_lines = VG_MIN( log_lines, vg_log.buffer_line_count ); - - vg_uictx.cursor[0] = 0; - vg_uictx.cursor[1] = 0; - vg_uictx.cursor[3] = log_lines*fh; - ui_fill_x(); - - /* - * log - */ - ui_new_node(); - { - ui_fill_rect( vg_uictx.cursor, 0x77181818 ); - - vg_uictx.cursor[3] = fh; - ui_align_bottom(); - - for( int i=0; iterminator to start */ - int remaining_length = strlen( vg_console.input )+1-end; - memmove( &vg_console.input[ start ], - &vg_console.input[ end ], - remaining_length ); - return start; + _ui_textbox_move_cursor( &vg_ui.textbox.cursor_user, + &vg_ui.textbox.cursor_pos, 10000, 1 ); + _ui_textbox_put_char( ' ' ); + } } -VG_STATIC void console_to_clipboard(void) +VG_STATIC void _console_suggest_store_normal(void) { - int start, end; - console_make_selection( &start, &end ); - char buffer[512]; - - if( end-start ){ - memcpy( buffer, &vg_console.input[ start ], end-start ); - buffer[ end-start ] = 0x00; - SDL_SetClipboardText( buffer ); - } + if( vg_console.suggestion_select == -1 ){ + char *target = &vg_console.input[ vg_console.suggestion_pastepos ]; + strcpy( vg_console.input_copy, target ); + } } -VG_STATIC void console_clipboard_paste(void) +VG_STATIC void _console_suggest_next(void) { - if( !SDL_HasClipboardText() ) - return; + if( vg_console.suggestion_count ){ + _console_suggest_store_normal(); - char *text = SDL_GetClipboardText(); + vg_console.suggestion_select ++; - if( !text ) - return; + if( vg_console.suggestion_select >= vg_console.suggestion_count ) + vg_console.suggestion_select = -1; + + _console_fetch_suggestion(); + } +} - int datastart = console_delete_char( 0 ); - int length = strlen( text ); - int cpylength = console_makeroom( datastart, length ); +VG_STATIC void _console_suggest_prev(void) +{ + if( vg_console.suggestion_count ){ + _console_suggest_store_normal(); + + vg_console.suggestion_select --; - memcpy( vg_console.input + datastart, text, cpylength); - console_move_cursor( &vg_console.cursor_user, - &vg_console.cursor_pos, cpylength, 1 ); - SDL_free( text ); + if( vg_console.suggestion_select < -1 ) + vg_console.suggestion_select = vg_console.suggestion_count-1; - console_update_suggestions(); + _console_fetch_suggestion(); + } } -VG_STATIC void console_put_char( char c ) +VG_STATIC void _vg_console_on_update( char *buf, u32 len ) { - if( !vg_console.enabled ) - return; - - vg_console.cursor_user = console_delete_char(0); - - if( console_makeroom( vg_console.cursor_user, 1 ) ) - vg_console.input[ vg_console.cursor_user ] = c; - - console_move_cursor( &vg_console.cursor_user, &vg_console.cursor_pos, 1, 1 ); + if( buf == vg_console.input ){ + console_update_suggestions(); + } } VG_STATIC void console_history_get( char* buf, int entry_num ) @@ -721,298 +576,147 @@ VG_STATIC void console_history_get( char* buf, int entry_num ) strcpy( buf, vg_console.history[ pick ] ); } -/* Receed secondary cursor */ -VG_STATIC void _console_left_select(void) -{ - console_move_cursor( &vg_console.cursor_user, NULL, -1, 0 ); -} - -/* Match and receed both cursors */ -VG_STATIC void _console_left(void) +VG_STATIC void _vg_console_on_up( char *buf, u32 len ) { - int cursor_diff = vg_console.cursor_pos - vg_console.cursor_user? 0: 1; - - console_move_cursor( &vg_console.cursor_user, - &vg_console.cursor_pos, -cursor_diff, 1 ); -} - -VG_STATIC void _console_right_select(void) -{ - console_move_cursor( &vg_console.cursor_user, NULL, 1, 0 ); -} - -VG_STATIC void _console_right(void) -{ - int cursor_diff = vg_console.cursor_pos - vg_console.cursor_user? 0: 1; - - console_move_cursor( &vg_console.cursor_user, - &vg_console.cursor_pos, +cursor_diff, 1 ); -} - -VG_STATIC void _console_down(void) -{ - vg_console.history_pos = VG_MAX( 0, vg_console.history_pos-1 ); - console_history_get( vg_console.input, vg_console.history_pos ); - - console_move_cursor( &vg_console.cursor_user, - &vg_console.cursor_pos, - vg_list_size(vg_console.input)-1, 1 ); -} - -VG_STATIC void _console_up(void) -{ - vg_console.history_pos = VG_MAX - ( - 0, - VG_MIN - ( - vg_console.history_pos+1, - VG_MIN - ( + if( buf == vg_console.input ){ + vg_console.history_pos = + VG_MAX + ( + 0, + VG_MIN + ( + vg_console.history_pos+1, + VG_MIN + ( vg_list_size( vg_console.history ), vg_console.history_count - 1 - ) - ) - ); - - console_history_get( vg_console.input, vg_console.history_pos ); - console_move_cursor( &vg_console.cursor_user, - &vg_console.cursor_pos, - vg_list_size(vg_console.input)-1, 1); -} - -VG_STATIC void _console_backspace(void) -{ - vg_console.cursor_user = console_delete_char( -1 ); - vg_console.cursor_pos = vg_console.cursor_user; - - console_update_suggestions(); -} - -VG_STATIC void _console_delete(void) -{ - vg_console.cursor_user = console_delete_char( 1 ); - vg_console.cursor_pos = vg_console.cursor_user; - - console_update_suggestions(); + ) + ) + ); + + console_history_get( vg_console.input, vg_console.history_pos ); + _ui_textbox_move_cursor( &vg_ui.textbox.cursor_user, + &vg_ui.textbox.cursor_pos, + vg_list_size(vg_console.input)-1, 1); + } } -VG_STATIC void _console_home_select(void) +VG_STATIC void _vg_console_on_down( char *buf, u32 len ) { - console_move_cursor( &vg_console.cursor_user, NULL, -10000, 0 ); -} + if( buf == vg_console.input ){ + vg_console.history_pos = VG_MAX( 0, vg_console.history_pos-1 ); + console_history_get( vg_console.input, vg_console.history_pos ); -VG_STATIC void _console_home(void) -{ - console_move_cursor( &vg_console.cursor_user, - &vg_console.cursor_pos, -10000, 1 ); + _ui_textbox_move_cursor( &vg_ui.textbox.cursor_user, + &vg_ui.textbox.cursor_pos, + vg_list_size(vg_console.input)-1, 1 ); + } } -VG_STATIC void _console_end_select(void) +VG_STATIC void _vg_console_on_enter( char *buf, u32 len ) { - console_move_cursor( &vg_console.cursor_user, NULL, 10000, 0 ); -} + if( buf == vg_console.input ){ + if( !strlen( vg_console.input ) ) + return; -VG_STATIC void _console_end(void) -{ - console_move_cursor( &vg_console.cursor_user, - &vg_console.cursor_pos, - vg_list_size(vg_console.input)-1, 1 ); -} + vg_info( "%s\n", vg_console.input ); -VG_STATIC void _console_select_all(void) -{ - console_move_cursor( &vg_console.cursor_user, NULL, 10000, 0); - console_move_cursor( &vg_console.cursor_pos, NULL, -10000, 0); -} - -VG_STATIC void _console_cut(void) -{ - console_to_clipboard(); - vg_console.cursor_user = console_delete_char(0); - vg_console.cursor_pos = vg_console.cursor_user; -} + if( strcmp( vg_console.input, + vg_console.history[ vg_console.history_last ]) ) + { + vg_console.history_last = ( vg_console.history_last + 1) % + vg_list_size(vg_console.history ); + vg_console.history_count = + VG_MIN( vg_list_size( vg_console.history ), + vg_console.history_count + 1 ); + strcpy( vg_console.history[ vg_console.history_last ], + vg_console.input ); + } -VG_STATIC void _console_enter(void) -{ - if( !strlen( vg_console.input ) ) - return; + vg_console.history_pos = -1; + vg_execute_console_input( vg_console.input ); + _ui_textbox_move_cursor( &vg_ui.textbox.cursor_user, + &vg_ui.textbox.cursor_pos, -10000, 1 ); - vg_info( "%s\n", vg_console.input ); - - if( strcmp( vg_console.input, - vg_console.history[ vg_console.history_last ]) ) - { - vg_console.history_last = ( vg_console.history_last + 1) % - vg_list_size(vg_console.history ); - vg_console.history_count = - VG_MIN( vg_list_size( vg_console.history ), - vg_console.history_count + 1 ); - strcpy( vg_console.history[ vg_console.history_last ], - vg_console.input ); + vg_console.input[0] = '\0'; + console_update_suggestions(); } - - vg_console.history_pos = -1; - vg_execute_console_input( vg_console.input ); - console_move_cursor( &vg_console.cursor_user, - &vg_console.cursor_pos, -10000, 1 ); - vg_console.input[0] = '\0'; - - console_update_suggestions(); } -/* - * Suggestion controls - */ -VG_STATIC void _console_fetch_suggestion(void) +VG_STATIC void _vg_console_draw(void) { - char *target = &vg_console.input[ vg_console.suggestion_pastepos ]; + if( !vg_console.enabled ) return; - if( vg_console.suggestion_select == -1 ){ - strcpy( target, vg_console.input_copy ); - console_move_cursor( &vg_console.cursor_user, - &vg_console.cursor_pos, 10000, 1 ); - } - else{ - strncpy( target, - vg_console.suggestions[ vg_console.suggestion_select ].str, - vg_list_size( vg_console.input )-1 ); + SDL_AtomicLock( &log_print_sl ); - console_move_cursor( &vg_console.cursor_user, - &vg_console.cursor_pos, 10000, 1 ); - console_put_char( ' ' ); - } -} + int ptr = vg_log.buffer_line_current; + int const fh = 14, log_lines = 32; + int console_lines = VG_MIN( log_lines, vg_log.buffer_line_count ); -VG_STATIC void _console_suggest_store_normal(void) -{ - if( vg_console.suggestion_select == -1 ){ - char *target = &vg_console.input[ vg_console.suggestion_pastepos ]; - strcpy( vg_console.input_copy, target ); - } -} + ui_rect rect_log = { 0, 0, vg.window_x, log_lines*fh }, + rect_input = { 0, log_lines*fh + 1, vg.window_x, fh*2 }, + rect_line = { 0, 0, vg.window_x, fh }; + + /* + * log + */ + u32 bg_colour = (ui_colour( k_ui_bg )&0x00ffffff)|0x9f000000; -VG_STATIC void _console_suggest_next(void) -{ - if( vg_console.suggestion_count ){ - _console_suggest_store_normal(); + ui_fill( rect_log, bg_colour ); + rect_line[1] = rect_log[1]+rect_log[3]-fh; - vg_console.suggestion_select ++; + for( int i=0; i= vg_console.suggestion_count ) - vg_console.suggestion_select = -1; + if( ptr < 0 ) ptr = vg_list_size( vg_log.buffer )-1; - _console_fetch_suggestion(); + ui_text( rect_line, vg_log.buffer[ptr], 1, k_ui_align_left, 0 ); + rect_line[1] -= fh; } -} + + /* + * Input area + */ + vg_ui.textbuf_on_up = _vg_console_on_up; + vg_ui.textbuf_on_down = _vg_console_on_down; + vg_ui.textbuf_on_change = _vg_console_on_update; + vg_ui.textbuf_on_enter = _vg_console_on_enter; + ui_textbox( rect_input, vg_console.input, vg_list_size(vg_console.input), + UI_TEXTBOX_AUTOFOCUS ); -VG_STATIC void _console_suggest_prev(void) -{ + /* + * suggestions + */ if( vg_console.suggestion_count ){ - _console_suggest_store_normal(); + ui_rect rect_suggest; + rect_copy( rect_input, rect_suggest ); - vg_console.suggestion_select --; - - if( vg_console.suggestion_select < -1 ) - vg_console.suggestion_select = vg_console.suggestion_count-1; - - _console_fetch_suggestion(); - } -} + rect_suggest[0] += 6 + UI_GLYPH_SPACING_X*vg_console.suggestion_pastepos; + rect_suggest[1] += rect_input[3]; + rect_suggest[2] = UI_GLYPH_SPACING_X * vg_console.suggestion_maxlen; + rect_suggest[3] = vg_console.suggestion_count * fh; -/* - * Handles binds - */ -VG_STATIC void console_proc_key( SDL_Keysym ev ) -{ - /* Open / close console */ - if( ev.sym == SDLK_BACKQUOTE ){ - vg_console.enabled = !vg_console.enabled; + ui_fill( rect_suggest, bg_colour ); - if( vg_console.enabled ){ - vg_info( "SDL_StartTextInput()\n" ); - SDL_StartTextInput(); - } - else{ - SDL_StopTextInput(); - } - } - - if( !vg_console.enabled ) return; + rect_suggest[3] = fh; - struct console_mapping - { - u16 mod; - SDL_Keycode key; - - void (*handler)(void); - } - mappings[] = - { - { 0, SDLK_LEFT, _console_left }, - { KMOD_SHIFT, SDLK_LEFT, _console_left_select }, - { 0, SDLK_RIGHT, _console_right }, - { KMOD_SHIFT, SDLK_RIGHT, _console_right_select }, - { 0, SDLK_DOWN, _console_down }, - { 0, SDLK_UP, _console_up }, - { 0, SDLK_BACKSPACE, _console_backspace }, - { 0, SDLK_DELETE, _console_delete }, - { 0, SDLK_HOME, _console_home }, - { KMOD_SHIFT, SDLK_HOME, _console_home_select }, - { 0, SDLK_END, _console_end }, - { KMOD_SHIFT, SDLK_END, _console_end_select }, - { KMOD_CTRL, SDLK_a, _console_select_all }, - { KMOD_CTRL, SDLK_c, console_to_clipboard }, - { KMOD_CTRL, SDLK_x, _console_cut }, - { KMOD_CTRL, SDLK_v, console_clipboard_paste }, - { 0, SDLK_RETURN, _console_enter }, - { KMOD_CTRL, SDLK_n, _console_suggest_next }, - { KMOD_CTRL, SDLK_p, _console_suggest_prev } - }; - - SDL_Keymod mod = 0; - - if( ev.mod & KMOD_SHIFT ) - mod |= KMOD_SHIFT; - - if( ev.mod & KMOD_CTRL ) - mod |= KMOD_CTRL; - - if( ev.mod & KMOD_ALT ) - mod |= KMOD_ALT; - - for( int i=0; ikey == ev.sym ){ - if( mapping->mod == 0 ){ - if( mod == 0 ){ - mapping->handler(); - return; - } + for( int i=0; imod) == mapping->mod ){ - mapping->handler(); - return; - } - } - } -} + else text_colour = ui_colourcont( k_ui_bg ); -/* - * Callback for text entry mode - */ -VG_STATIC void console_proc_utf8( const char *text ) -{ - const char *ptr = text; + ui_text( rect_suggest, vg_console.suggestions[i].str, 1, + k_ui_align_left, text_colour ); - while( *ptr ){ - if( *ptr != '`' ) - console_put_char( *ptr ); - ptr ++; + rect_suggest[1] += fh; + } } - console_update_suggestions(); + SDL_AtomicUnlock( &log_print_sl ); } + #endif /* VG_CONSOLE_H */