|
|
|
@ -1,10 +1,9 @@ |
|
|
|
|
// [ImGui] this is a slightly modified version of stb_truetype.h 1.8
|
|
|
|
|
// [ImGui] this is a slightly modified version of stb_truetype.h 1.9. Those changes would need to be pushed into nothings/sb
|
|
|
|
|
// [ImGui] - fixed a state corruption/crash bug in stb_text_redo and stb_textedit_discard_redo (#715)
|
|
|
|
|
// [ImGui] - fixed a crash bug in stb_textedit_discard_redo (#681)
|
|
|
|
|
// [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
|
|
|
|
|
// stb_textedit.h - v1.9 - public domain - Sean Barrett
|
|
|
|
|
// Development of this library was sponsored by RAD Game Tools
|
|
|
|
|
//
|
|
|
|
|
// This C header file implements the guts of a multi-line text-editing
|
|
|
|
@ -37,6 +36,7 @@ |
|
|
|
|
//
|
|
|
|
|
// VERSION HISTORY
|
|
|
|
|
//
|
|
|
|
|
// 1.9 (2016-08-27) customizable move-by-word
|
|
|
|
|
// 1.8 (2016-04-02) better keyboard handling when mouse button is down
|
|
|
|
|
// 1.7 (2015-09-13) change y range handling in case baseline is non-0
|
|
|
|
|
// 1.6 (2015-04-15) allow STB_TEXTEDIT_memmove
|
|
|
|
@ -425,10 +425,9 @@ static int stb_text_locate_coord(STB_TEXTEDIT_STRING *str, float x, float y) |
|
|
|
|
// check if it's before the end of the line
|
|
|
|
|
if (x < r.x1) { |
|
|
|
|
// search characters in row for one that straddles 'x'
|
|
|
|
|
k = i; |
|
|
|
|
prev_x = r.x0; |
|
|
|
|
for (i=0; i < r.num_chars; ++i) { |
|
|
|
|
float w = STB_TEXTEDIT_GETWIDTH(str, k, i); |
|
|
|
|
for (k=0; k < r.num_chars; ++k) { |
|
|
|
|
float w = STB_TEXTEDIT_GETWIDTH(str, i, k); |
|
|
|
|
if (x < prev_x+w) { |
|
|
|
|
if (x < prev_x+w/2) |
|
|
|
|
return k+i; |
|
|
|
@ -618,15 +617,16 @@ static void stb_textedit_move_to_last(STB_TEXTEDIT_STRING *str, STB_TexteditStat |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifdef STB_TEXTEDIT_IS_SPACE |
|
|
|
|
static int is_word_boundary( STB_TEXTEDIT_STRING *_str, int _idx ) |
|
|
|
|
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; |
|
|
|
|
return idx > 0 ? (STB_TEXTEDIT_IS_SPACE( STB_TEXTEDIT_GETCHAR(str,idx-1) ) && !STB_TEXTEDIT_IS_SPACE( STB_TEXTEDIT_GETCHAR(str, idx) ) ) : 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifndef STB_TEXTEDIT_MOVEWORDLEFT |
|
|
|
|
static int stb_textedit_move_to_word_previous( STB_TEXTEDIT_STRING *_str, int c ) |
|
|
|
|
static int stb_textedit_move_to_word_previous( STB_TEXTEDIT_STRING *str, int c ) |
|
|
|
|
{ |
|
|
|
|
while( c >= 0 && !is_word_boundary( _str, c ) ) |
|
|
|
|
--c; // always move at least one character
|
|
|
|
|
while( c >= 0 && !is_word_boundary( str, c ) ) |
|
|
|
|
--c; |
|
|
|
|
|
|
|
|
|
if( c < 0 ) |
|
|
|
@ -638,10 +638,11 @@ static int stb_textedit_move_to_word_previous( STB_TEXTEDIT_STRING *_str, int c |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifndef STB_TEXTEDIT_MOVEWORDRIGHT |
|
|
|
|
static int stb_textedit_move_to_word_next( STB_TEXTEDIT_STRING *_str, int c ) |
|
|
|
|
static int stb_textedit_move_to_word_next( STB_TEXTEDIT_STRING *str, int c ) |
|
|
|
|
{ |
|
|
|
|
const int len = STB_TEXTEDIT_STRINGLEN(_str); |
|
|
|
|
while( c < len && !is_word_boundary( _str, c ) ) |
|
|
|
|
const int len = STB_TEXTEDIT_STRINGLEN(str); |
|
|
|
|
++c; // always move at least one character
|
|
|
|
|
while( c < len && !is_word_boundary( str, c ) ) |
|
|
|
|
++c; |
|
|
|
|
|
|
|
|
|
if( c > len ) |
|
|
|
@ -778,7 +779,7 @@ retry: |
|
|
|
|
if (STB_TEXT_HAS_SELECTION(state)) |
|
|
|
|
stb_textedit_move_to_first(state); |
|
|
|
|
else { |
|
|
|
|
state->cursor = STB_TEXTEDIT_MOVEWORDLEFT(str, state->cursor-1); |
|
|
|
|
state->cursor = STB_TEXTEDIT_MOVEWORDLEFT(str, state->cursor); |
|
|
|
|
stb_textedit_clamp( str, state ); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
@ -787,7 +788,7 @@ retry: |
|
|
|
|
if( !STB_TEXT_HAS_SELECTION( state ) ) |
|
|
|
|
stb_textedit_prep_selection_at_cursor(state); |
|
|
|
|
|
|
|
|
|
state->cursor = STB_TEXTEDIT_MOVEWORDLEFT(str, state->cursor-1); |
|
|
|
|
state->cursor = STB_TEXTEDIT_MOVEWORDLEFT(str, state->cursor); |
|
|
|
|
state->select_end = state->cursor; |
|
|
|
|
|
|
|
|
|
stb_textedit_clamp( str, state ); |
|
|
|
@ -799,7 +800,7 @@ retry: |
|
|
|
|
if (STB_TEXT_HAS_SELECTION(state))
|
|
|
|
|
stb_textedit_move_to_last(str, state); |
|
|
|
|
else { |
|
|
|
|
state->cursor = STB_TEXTEDIT_MOVEWORDRIGHT(str, state->cursor+1); |
|
|
|
|
state->cursor = STB_TEXTEDIT_MOVEWORDRIGHT(str, state->cursor); |
|
|
|
|
stb_textedit_clamp( str, state ); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
@ -808,7 +809,7 @@ retry: |
|
|
|
|
if( !STB_TEXT_HAS_SELECTION( state ) ) |
|
|
|
|
stb_textedit_prep_selection_at_cursor(state); |
|
|
|
|
|
|
|
|
|
state->cursor = STB_TEXTEDIT_MOVEWORDRIGHT(str, state->cursor+1); |
|
|
|
|
state->cursor = STB_TEXTEDIT_MOVEWORDRIGHT(str, state->cursor); |
|
|
|
|
state->select_end = state->cursor; |
|
|
|
|
|
|
|
|
|
stb_textedit_clamp( str, state ); |
|
|
|
|