274 #ifndef INCLUDE_STB_TEXTEDIT_H
275 #define INCLUDE_STB_TEXTEDIT_H
286 #ifndef STB_TEXTEDIT_UNDOSTATECOUNT
287 #define STB_TEXTEDIT_UNDOSTATECOUNT 99
289 #ifndef STB_TEXTEDIT_UNDOCHARCOUNT
290 #define STB_TEXTEDIT_UNDOCHARCOUNT 999
292 #ifndef STB_TEXTEDIT_CHARTYPE
293 #define STB_TEXTEDIT_CHARTYPE int
295 #ifndef STB_TEXTEDIT_POSITIONTYPE
296 #define STB_TEXTEDIT_POSITIONTYPE int
367 #endif //INCLUDE_STB_TEXTEDIT_H
380 #ifdef STB_TEXTEDIT_IMPLEMENTATION
382 #ifndef STB_TEXTEDIT_memmove
384 #define STB_TEXTEDIT_memmove memmove
398 float base_y = 0, prev_x;
411 if (i==0 && y < base_y + r.
ymin)
414 if (y < base_y + r.
ymax)
465 state->
cursor = stb_text_locate_coord(str, x, y);
488 p = stb_text_locate_coord(str, x, y);
514 static void stb_textedit_find_charpos(StbFindState *find,
STB_TEXTEDIT_STRING *str,
int n,
int single_line)
527 find->first_char = 0;
540 find->first_char = i;
542 find->prev_first = prev_start;
559 find->first_char = first = i;
562 find->prev_first = prev_start;
567 for (i=0; first+i < n; ++i)
571 #define STB_TEXT_HAS_SELECTION(s) ((s)->select_start != (s)->select_end)
577 if (STB_TEXT_HAS_SELECTION(state)) {
590 stb_text_makeundo_delete(str, state, where, len);
598 stb_textedit_clamp(str, state);
599 if (STB_TEXT_HAS_SELECTION(state)) {
624 if (STB_TEXT_HAS_SELECTION(state)) {
625 stb_textedit_sortselection(state);
635 if (STB_TEXT_HAS_SELECTION(state)) {
636 stb_textedit_sortselection(state);
637 stb_textedit_clamp(str, state);
644 #ifdef STB_TEXTEDIT_IS_SPACE
650 #ifndef STB_TEXTEDIT_MOVEWORDLEFT
654 while( c >= 0 && !is_word_boundary( str, c ) )
662 #define STB_TEXTEDIT_MOVEWORDLEFT stb_textedit_move_to_word_previous
665 #ifndef STB_TEXTEDIT_MOVEWORDRIGHT
670 while( c < len && !is_word_boundary( str, c ) )
678 #define STB_TEXTEDIT_MOVEWORDRIGHT stb_textedit_move_to_word_next
686 if (!STB_TEXT_HAS_SELECTION(state))
695 if (STB_TEXT_HAS_SELECTION(state)) {
696 stb_textedit_delete_selection(str,state);
707 stb_textedit_clamp(str, state);
708 stb_textedit_delete_selection(str,state);
711 stb_text_makeundo_insert(state, state->
cursor, len);
722 #ifndef STB_TEXTEDIT_KEYTYPE
723 #define STB_TEXTEDIT_KEYTYPE int
741 stb_text_makeundo_replace(str, state, state->
cursor, 1, 1);
748 stb_textedit_delete_selection(str,state);
750 stb_text_makeundo_insert(state, state->
cursor, 1);
759 #ifdef STB_TEXTEDIT_K_INSERT
760 case STB_TEXTEDIT_K_INSERT:
766 stb_text_undo(str, state);
771 stb_text_redo(str, state);
777 if (STB_TEXT_HAS_SELECTION(state))
778 stb_textedit_move_to_first(state);
787 if (STB_TEXT_HAS_SELECTION(state))
788 stb_textedit_move_to_last(str, state);
791 stb_textedit_clamp(str, state);
796 stb_textedit_clamp(str, state);
797 stb_textedit_prep_selection_at_cursor(state);
805 #ifdef STB_TEXTEDIT_MOVEWORDLEFT
807 if (STB_TEXT_HAS_SELECTION(state))
808 stb_textedit_move_to_first(state);
811 stb_textedit_clamp( str, state );
816 if( !STB_TEXT_HAS_SELECTION( state ) )
817 stb_textedit_prep_selection_at_cursor(state);
822 stb_textedit_clamp( str, state );
826 #ifdef STB_TEXTEDIT_MOVEWORDRIGHT
828 if (STB_TEXT_HAS_SELECTION(state))
829 stb_textedit_move_to_last(str, state);
832 stb_textedit_clamp( str, state );
837 if( !STB_TEXT_HAS_SELECTION( state ) )
838 stb_textedit_prep_selection_at_cursor(state);
843 stb_textedit_clamp( str, state );
848 stb_textedit_prep_selection_at_cursor(state);
851 stb_textedit_clamp(str, state);
869 stb_textedit_prep_selection_at_cursor(state);
870 else if (STB_TEXT_HAS_SELECTION(state))
871 stb_textedit_move_to_last(str,state);
874 stb_textedit_clamp(str, state);
881 int start = find.first_char + find.length;
887 #ifdef STB_TEXTEDIT_GETWIDTH_NEWLINE
896 stb_textedit_clamp(str, state);
920 stb_textedit_prep_selection_at_cursor(state);
921 else if (STB_TEXT_HAS_SELECTION(state))
922 stb_textedit_move_to_first(state);
925 stb_textedit_clamp(str, state);
929 if (find.prev_first != find.first_char) {
933 state->
cursor = find.prev_first;
938 #ifdef STB_TEXTEDIT_GETWIDTH_NEWLINE
947 stb_textedit_clamp(str, state);
960 if (STB_TEXT_HAS_SELECTION(state))
961 stb_textedit_delete_selection(str, state);
965 stb_textedit_delete(str, state, state->
cursor, 1);
972 if (STB_TEXT_HAS_SELECTION(state))
973 stb_textedit_delete_selection(str, state);
975 stb_textedit_clamp(str, state);
977 stb_textedit_delete(str, state, state->
cursor-1, 1);
984 #ifdef STB_TEXTEDIT_K_TEXTSTART2
985 case STB_TEXTEDIT_K_TEXTSTART2:
992 #ifdef STB_TEXTEDIT_K_TEXTEND2
993 case STB_TEXTEDIT_K_TEXTEND2:
1001 #ifdef STB_TEXTEDIT_K_TEXTSTART2
1005 stb_textedit_prep_selection_at_cursor(state);
1010 #ifdef STB_TEXTEDIT_K_TEXTEND2
1014 stb_textedit_prep_selection_at_cursor(state);
1020 #ifdef STB_TEXTEDIT_K_LINESTART2
1021 case STB_TEXTEDIT_K_LINESTART2:
1024 stb_textedit_clamp(str, state);
1025 stb_textedit_move_to_first(state);
1033 #ifdef STB_TEXTEDIT_K_LINEEND2
1034 case STB_TEXTEDIT_K_LINEEND2:
1038 stb_textedit_clamp(str, state);
1039 stb_textedit_move_to_first(state);
1048 #ifdef STB_TEXTEDIT_K_LINESTART2
1052 stb_textedit_clamp(str, state);
1053 stb_textedit_prep_selection_at_cursor(state);
1062 #ifdef STB_TEXTEDIT_K_LINEEND2
1067 stb_textedit_clamp(str, state);
1068 stb_textedit_prep_selection_at_cursor(state);
1090 static void stb_textedit_flush_redo(
StbUndoState *state)
1097 static void stb_textedit_discard_undo(
StbUndoState *state)
1119 static void stb_textedit_discard_redo(
StbUndoState *state)
1145 stb_textedit_flush_redo(state);
1150 stb_textedit_discard_undo(state);
1161 stb_textedit_discard_undo(state);
1168 StbUndoRecord *r = stb_text_create_undo_record(state, insert_len);
1176 if (insert_len == 0) {
1190 if (
s->undo_point == 0)
1194 u =
s->undo_rec[
s->undo_point-1];
1195 r = &
s->undo_rec[
s->redo_point-1];
1225 stb_textedit_discard_redo(s);
1227 r = &
s->undo_rec[
s->redo_point-1];
1262 u = &
s->undo_rec[
s->undo_point];
1263 r =
s->undo_rec[
s->redo_point];
1315 for (i=0; i <
length; ++i)
1325 for (i=0; i < old_length; ++i)
1331 static void stb_textedit_clear_state(
STB_TexteditState *state,
int is_single_line)
1343 state->
single_line = (
unsigned char) is_single_line;
1348 static void stb_textedit_initialize_state(
STB_TexteditState *state,
int is_single_line)
1350 stb_textedit_clear_state(state, is_single_line);
1353 #if defined(__GNUC__) || defined(__clang__)
1354 #pragma GCC diagnostic push
1355 #pragma GCC diagnostic ignored "-Wcast-qual"
1363 #if defined(__GNUC__) || defined(__clang__)
1364 #pragma GCC diagnostic pop
1367 #endif//STB_TEXTEDIT_IMPLEMENTATION