mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-04 07:01:04 +01:00 
			
		
		
		
	stb_textedit.h: proposal for upstream PR to allow custom move-left/move-right handlers (following #473)
This commit is contained in:
		@@ -1,5 +1,6 @@
 | 
			
		||||
// [ImGui] this is a slightly modified version of stb_truetype.h 1.8
 | 
			
		||||
// [ImGui] - fixed some minor warnings
 | 
			
		||||
// [ImGui] - added STB_TEXTEDIT_MOVEWORDLEFT/STB_TEXTEDIT_MOVEWORDRIGHT custom handler (#473)
 | 
			
		||||
 | 
			
		||||
// stb_textedit.h - v1.8  - public domain - Sean Barrett
 | 
			
		||||
// Development of this library was sponsored by RAD Game Tools
 | 
			
		||||
@@ -151,15 +152,17 @@
 | 
			
		||||
//    STB_TEXTEDIT_K_REDO        keyboard input to perform redo
 | 
			
		||||
//
 | 
			
		||||
// Optional:
 | 
			
		||||
//    STB_TEXTEDIT_K_INSERT      keyboard input to toggle insert mode
 | 
			
		||||
//    STB_TEXTEDIT_IS_SPACE(ch)  true if character is whitespace (e.g. 'isspace'),
 | 
			
		||||
//                                 required for WORDLEFT/WORDRIGHT
 | 
			
		||||
//    STB_TEXTEDIT_K_WORDLEFT    keyboard input to move cursor left one word // e.g. ctrl-LEFT
 | 
			
		||||
//    STB_TEXTEDIT_K_WORDRIGHT   keyboard input to move cursor right one word // e.g. ctrl-RIGHT
 | 
			
		||||
//    STB_TEXTEDIT_K_LINESTART2  secondary keyboard input to move cursor to start of line
 | 
			
		||||
//    STB_TEXTEDIT_K_LINEEND2    secondary keyboard input to move cursor to end of line
 | 
			
		||||
//    STB_TEXTEDIT_K_TEXTSTART2  secondary keyboard input to move cursor to start of text
 | 
			
		||||
//    STB_TEXTEDIT_K_TEXTEND2    secondary keyboard input to move cursor to end of text
 | 
			
		||||
//    STB_TEXTEDIT_K_INSERT              keyboard input to toggle insert mode
 | 
			
		||||
//    STB_TEXTEDIT_IS_SPACE(ch)          true if character is whitespace (e.g. 'isspace'),
 | 
			
		||||
//                                          required for default WORDLEFT/WORDRIGHT handlers
 | 
			
		||||
//    STB_TEXTEDIT_MOVEWORDLEFT(obj,i)   custom handler for WORDLEFT, returns index to move cursor to
 | 
			
		||||
//    STB_TEXTEDIT_MOVEWORDRIGHT(obj,i)  custom handler for WORDRIGHT, returns index to move cursor to
 | 
			
		||||
//    STB_TEXTEDIT_K_WORDLEFT            keyboard input to move cursor left one word // e.g. ctrl-LEFT
 | 
			
		||||
//    STB_TEXTEDIT_K_WORDRIGHT           keyboard input to move cursor right one word // e.g. ctrl-RIGHT
 | 
			
		||||
//    STB_TEXTEDIT_K_LINESTART2          secondary keyboard input to move cursor to start of line
 | 
			
		||||
//    STB_TEXTEDIT_K_LINEEND2            secondary keyboard input to move cursor to end of line
 | 
			
		||||
//    STB_TEXTEDIT_K_TEXTSTART2          secondary keyboard input to move cursor to start of text
 | 
			
		||||
//    STB_TEXTEDIT_K_TEXTEND2            secondary keyboard input to move cursor to end of text
 | 
			
		||||
//
 | 
			
		||||
// Todo:
 | 
			
		||||
//    STB_TEXTEDIT_K_PGUP        keyboard input to move cursor up a page
 | 
			
		||||
@@ -618,9 +621,9 @@ static int is_word_boundary( STB_TEXTEDIT_STRING *_str, int _idx )
 | 
			
		||||
   return _idx > 0 ? (STB_TEXTEDIT_IS_SPACE( STB_TEXTEDIT_GETCHAR(_str,_idx-1) ) && !STB_TEXTEDIT_IS_SPACE( STB_TEXTEDIT_GETCHAR(_str, _idx) ) ) : 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int stb_textedit_move_to_word_previous( STB_TEXTEDIT_STRING *_str, STB_TexteditState *_state )
 | 
			
		||||
#ifndef STB_TEXTEDIT_MOVEWORDLEFT
 | 
			
		||||
static int stb_textedit_move_to_word_previous( STB_TEXTEDIT_STRING *_str, int c )
 | 
			
		||||
{
 | 
			
		||||
   int c = _state->cursor - 1;
 | 
			
		||||
   while( c >= 0 && !is_word_boundary( _str, c ) )
 | 
			
		||||
      --c;
 | 
			
		||||
 | 
			
		||||
@@ -629,11 +632,13 @@ static int stb_textedit_move_to_word_previous( STB_TEXTEDIT_STRING *_str, STB_Te
 | 
			
		||||
 | 
			
		||||
   return c;
 | 
			
		||||
}
 | 
			
		||||
#define STB_TEXTEDIT_MOVEWORDLEFT stb_textedit_move_to_word_previous
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static int stb_textedit_move_to_word_next( STB_TEXTEDIT_STRING *_str, STB_TexteditState *_state )
 | 
			
		||||
#ifndef STB_TEXTEDIT_MOVEWORDRIGHT
 | 
			
		||||
static int stb_textedit_move_to_word_next( STB_TEXTEDIT_STRING *_str, int c )
 | 
			
		||||
{
 | 
			
		||||
   const int len = STB_TEXTEDIT_STRINGLEN(_str);
 | 
			
		||||
   int c = _state->cursor+1;
 | 
			
		||||
   while( c < len && !is_word_boundary( _str, c ) )
 | 
			
		||||
      ++c;
 | 
			
		||||
 | 
			
		||||
@@ -642,6 +647,9 @@ static int stb_textedit_move_to_word_next( STB_TEXTEDIT_STRING *_str, STB_Texted
 | 
			
		||||
 | 
			
		||||
   return c;
 | 
			
		||||
}
 | 
			
		||||
#define STB_TEXTEDIT_MOVEWORDRIGHT stb_textedit_move_to_word_next
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// update selection and cursor to match each other
 | 
			
		||||
@@ -763,21 +771,12 @@ retry:
 | 
			
		||||
         state->has_preferred_x = 0;
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
#ifdef STB_TEXTEDIT_IS_SPACE
 | 
			
		||||
#ifdef STB_TEXTEDIT_MOVEWORDLEFT
 | 
			
		||||
      case STB_TEXTEDIT_K_WORDLEFT:
 | 
			
		||||
         if (STB_TEXT_HAS_SELECTION(state))
 | 
			
		||||
            stb_textedit_move_to_first(state);
 | 
			
		||||
         else {
 | 
			
		||||
            state->cursor = stb_textedit_move_to_word_previous(str, state);
 | 
			
		||||
            stb_textedit_clamp( str, state );
 | 
			
		||||
         }
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case STB_TEXTEDIT_K_WORDRIGHT:
 | 
			
		||||
         if (STB_TEXT_HAS_SELECTION(state)) 
 | 
			
		||||
            stb_textedit_move_to_last(str, state);
 | 
			
		||||
         else {
 | 
			
		||||
            state->cursor = stb_textedit_move_to_word_next(str, state);
 | 
			
		||||
            state->cursor = STB_TEXTEDIT_MOVEWORDLEFT(str, state->cursor-1);
 | 
			
		||||
            stb_textedit_clamp( str, state );
 | 
			
		||||
         }
 | 
			
		||||
         break;
 | 
			
		||||
@@ -786,17 +785,28 @@ retry:
 | 
			
		||||
         if( !STB_TEXT_HAS_SELECTION( state ) )
 | 
			
		||||
            stb_textedit_prep_selection_at_cursor(state);
 | 
			
		||||
 | 
			
		||||
         state->cursor = stb_textedit_move_to_word_previous(str, state);
 | 
			
		||||
         state->cursor = STB_TEXTEDIT_MOVEWORDLEFT(str, state->cursor-1);
 | 
			
		||||
         state->select_end = state->cursor;
 | 
			
		||||
 | 
			
		||||
         stb_textedit_clamp( str, state );
 | 
			
		||||
         break;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef STB_TEXTEDIT_MOVEWORDRIGHT
 | 
			
		||||
      case STB_TEXTEDIT_K_WORDRIGHT:
 | 
			
		||||
         if (STB_TEXT_HAS_SELECTION(state)) 
 | 
			
		||||
            stb_textedit_move_to_last(str, state);
 | 
			
		||||
         else {
 | 
			
		||||
            state->cursor = STB_TEXTEDIT_MOVEWORDRIGHT(str, state->cursor+1);
 | 
			
		||||
            stb_textedit_clamp( str, state );
 | 
			
		||||
         }
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      case STB_TEXTEDIT_K_WORDRIGHT | STB_TEXTEDIT_K_SHIFT:
 | 
			
		||||
         if( !STB_TEXT_HAS_SELECTION( state ) )
 | 
			
		||||
            stb_textedit_prep_selection_at_cursor(state);
 | 
			
		||||
 | 
			
		||||
         state->cursor = stb_textedit_move_to_word_next(str, state);
 | 
			
		||||
         state->cursor = STB_TEXTEDIT_MOVEWORDRIGHT(str, state->cursor+1);
 | 
			
		||||
         state->select_end = state->cursor;
 | 
			
		||||
 | 
			
		||||
         stb_textedit_clamp( str, state );
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user