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
371 #endif //INCLUDE_STB_TEXTEDIT_H
384 #ifdef STB_TEXTEDIT_IMPLEMENTATION
386 #ifndef STB_TEXTEDIT_memmove
388 #define STB_TEXTEDIT_memmove memmove
401 int n = STB_TEXTEDIT_STRINGLEN(str);
402 float base_y = 0, prev_x;
411 STB_TEXTEDIT_LAYOUTROW(&r, str, i);
415 if (i==0 && y < base_y + r.
ymin)
418 if (y < base_y + r.
ymax)
438 float w = STB_TEXTEDIT_GETWIDTH(str, i, k);
451 if (STB_TEXTEDIT_GETCHAR(str, i+r.
num_chars-1) == STB_TEXTEDIT_NEWLINE)
465 STB_TEXTEDIT_LAYOUTROW(&r, str, 0);
469 state->
cursor = stb_text_locate_coord(str, x, y);
485 STB_TEXTEDIT_LAYOUTROW(&r, str, 0);
492 p = stb_text_locate_coord(str, x, y);
518 static void stb_textedit_find_charpos(StbFindState *find,
STB_TEXTEDIT_STRING *str,
int n,
int single_line)
522 int z = STB_TEXTEDIT_STRINGLEN(str);
529 STB_TEXTEDIT_LAYOUTROW(&r, str, 0);
531 find->first_char = 0;
540 STB_TEXTEDIT_LAYOUTROW(&r, str, i);
544 find->first_char = i;
546 find->prev_first = prev_start;
555 STB_TEXTEDIT_LAYOUTROW(&r, str, i);
563 find->first_char = first = i;
566 find->prev_first = prev_start;
570 for (i=0; first+i < n; ++i)
571 find->x += STB_TEXTEDIT_GETWIDTH(str, first, i);
574 #define STB_TEXT_HAS_SELECTION(s) ((s)->select_start != (s)->select_end)
579 int n = STB_TEXTEDIT_STRINGLEN(str);
580 if (STB_TEXT_HAS_SELECTION(state)) {
593 stb_text_makeundo_delete(str, state, where, len);
594 STB_TEXTEDIT_DELETECHARS(str, where, len);
601 stb_textedit_clamp(str, state);
602 if (STB_TEXT_HAS_SELECTION(state)) {
627 if (STB_TEXT_HAS_SELECTION(state)) {
628 stb_textedit_sortselection(state);
638 if (STB_TEXT_HAS_SELECTION(state)) {
639 stb_textedit_sortselection(state);
640 stb_textedit_clamp(str, state);
647 #ifdef STB_TEXTEDIT_IS_SPACE
650 return idx > 0 ? (STB_TEXTEDIT_IS_SPACE( STB_TEXTEDIT_GETCHAR(str,idx-1) ) && !STB_TEXTEDIT_IS_SPACE( STB_TEXTEDIT_GETCHAR(str, idx) ) ) : 1;
653 #ifndef STB_TEXTEDIT_MOVEWORDLEFT
657 while( c >= 0 && !is_word_boundary( str, c ) )
665 #define STB_TEXTEDIT_MOVEWORDLEFT stb_textedit_move_to_word_previous
668 #ifndef STB_TEXTEDIT_MOVEWORDRIGHT
671 const int len = STB_TEXTEDIT_STRINGLEN(str);
673 while( c < len && !is_word_boundary( str, c ) )
681 #define STB_TEXTEDIT_MOVEWORDRIGHT stb_textedit_move_to_word_next
689 if (!STB_TEXT_HAS_SELECTION(state))
698 if (STB_TEXT_HAS_SELECTION(state)) {
699 stb_textedit_delete_selection(str,state);
710 stb_textedit_clamp(str, state);
711 stb_textedit_delete_selection(str,state);
713 if (STB_TEXTEDIT_INSERTCHARS(str, state->
cursor, text, len)) {
714 stb_text_makeundo_insert(state, state->
cursor, len);
727 #ifndef STB_TEXTEDIT_KEYTYPE
728 #define STB_TEXTEDIT_KEYTYPE int
737 int c = STB_TEXTEDIT_KEYTOTEXT(key);
745 if (state->
insert_mode && !STB_TEXT_HAS_SELECTION(state) && state->
cursor < STB_TEXTEDIT_STRINGLEN(str)) {
746 stb_text_makeundo_replace(str, state, state->
cursor, 1, 1);
747 STB_TEXTEDIT_DELETECHARS(str, state->
cursor, 1);
748 if (STB_TEXTEDIT_INSERTCHARS(str, state->
cursor, &ch, 1)) {
753 stb_textedit_delete_selection(str,state);
754 if (STB_TEXTEDIT_INSERTCHARS(str, state->
cursor, &ch, 1)) {
755 stb_text_makeundo_insert(state, state->
cursor, 1);
764 #ifdef STB_TEXTEDIT_K_INSERT
765 case STB_TEXTEDIT_K_INSERT:
770 case STB_TEXTEDIT_K_UNDO:
771 stb_text_undo(str, state);
775 case STB_TEXTEDIT_K_REDO:
776 stb_text_redo(str, state);
780 case STB_TEXTEDIT_K_LEFT:
782 if (STB_TEXT_HAS_SELECTION(state))
783 stb_textedit_move_to_first(state);
790 case STB_TEXTEDIT_K_RIGHT:
792 if (STB_TEXT_HAS_SELECTION(state))
793 stb_textedit_move_to_last(str, state);
796 stb_textedit_clamp(str, state);
800 case STB_TEXTEDIT_K_LEFT | STB_TEXTEDIT_K_SHIFT:
801 stb_textedit_clamp(str, state);
802 stb_textedit_prep_selection_at_cursor(state);
810 #ifdef STB_TEXTEDIT_MOVEWORDLEFT
811 case STB_TEXTEDIT_K_WORDLEFT:
812 if (STB_TEXT_HAS_SELECTION(state))
813 stb_textedit_move_to_first(state);
815 state->
cursor = STB_TEXTEDIT_MOVEWORDLEFT(str, state->
cursor);
816 stb_textedit_clamp( str, state );
820 case STB_TEXTEDIT_K_WORDLEFT | STB_TEXTEDIT_K_SHIFT:
821 if( !STB_TEXT_HAS_SELECTION( state ) )
822 stb_textedit_prep_selection_at_cursor(state);
824 state->
cursor = STB_TEXTEDIT_MOVEWORDLEFT(str, state->
cursor);
827 stb_textedit_clamp( str, state );
831 #ifdef STB_TEXTEDIT_MOVEWORDRIGHT
832 case STB_TEXTEDIT_K_WORDRIGHT:
833 if (STB_TEXT_HAS_SELECTION(state))
834 stb_textedit_move_to_last(str, state);
836 state->
cursor = STB_TEXTEDIT_MOVEWORDRIGHT(str, state->
cursor);
837 stb_textedit_clamp( str, state );
841 case STB_TEXTEDIT_K_WORDRIGHT | STB_TEXTEDIT_K_SHIFT:
842 if( !STB_TEXT_HAS_SELECTION( state ) )
843 stb_textedit_prep_selection_at_cursor(state);
845 state->
cursor = STB_TEXTEDIT_MOVEWORDRIGHT(str, state->
cursor);
848 stb_textedit_clamp( str, state );
852 case STB_TEXTEDIT_K_RIGHT | STB_TEXTEDIT_K_SHIFT:
853 stb_textedit_prep_selection_at_cursor(state);
856 stb_textedit_clamp(str, state);
861 case STB_TEXTEDIT_K_DOWN:
862 case STB_TEXTEDIT_K_DOWN | STB_TEXTEDIT_K_SHIFT:
863 case STB_TEXTEDIT_K_PGDOWN:
864 case STB_TEXTEDIT_K_PGDOWN | STB_TEXTEDIT_K_SHIFT: {
867 int i, j, sel = (key & STB_TEXTEDIT_K_SHIFT) != 0;
868 int is_page = (key & ~STB_TEXTEDIT_K_SHIFT) == STB_TEXTEDIT_K_PGDOWN;
873 key = STB_TEXTEDIT_K_RIGHT | (key & STB_TEXTEDIT_K_SHIFT);
878 stb_textedit_prep_selection_at_cursor(state);
879 else if (STB_TEXT_HAS_SELECTION(state))
880 stb_textedit_move_to_last(str, state);
883 stb_textedit_clamp(str, state);
886 for (j = 0; j < row_count; ++j) {
888 int start = find.first_char + find.length;
890 if (find.length == 0)
895 if (STB_TEXTEDIT_GETCHAR(str, find.first_char + find.length - 1) != STB_TEXTEDIT_NEWLINE)
900 STB_TEXTEDIT_LAYOUTROW(&row, str, state->
cursor);
903 float dx = STB_TEXTEDIT_GETWIDTH(str, start, i);
904 #ifdef STB_TEXTEDIT_GETWIDTH_NEWLINE
913 stb_textedit_clamp(str, state);
922 find.first_char = find.first_char + find.length;
928 case STB_TEXTEDIT_K_UP:
929 case STB_TEXTEDIT_K_UP | STB_TEXTEDIT_K_SHIFT:
930 case STB_TEXTEDIT_K_PGUP:
931 case STB_TEXTEDIT_K_PGUP | STB_TEXTEDIT_K_SHIFT: {
934 int i, j, prev_scan, sel = (key & STB_TEXTEDIT_K_SHIFT) != 0;
935 int is_page = (key & ~STB_TEXTEDIT_K_SHIFT) == STB_TEXTEDIT_K_PGUP;
940 key = STB_TEXTEDIT_K_LEFT | (key & STB_TEXTEDIT_K_SHIFT);
945 stb_textedit_prep_selection_at_cursor(state);
946 else if (STB_TEXT_HAS_SELECTION(state))
947 stb_textedit_move_to_first(state);
950 stb_textedit_clamp(str, state);
953 for (j = 0; j < row_count; ++j) {
957 if (find.prev_first == find.first_char)
961 state->
cursor = find.prev_first;
962 STB_TEXTEDIT_LAYOUTROW(&row, str, state->
cursor);
965 float dx = STB_TEXTEDIT_GETWIDTH(str, find.prev_first, i);
966 #ifdef STB_TEXTEDIT_GETWIDTH_NEWLINE
975 stb_textedit_clamp(str, state);
985 prev_scan = find.prev_first > 0 ? find.prev_first - 1 : 0;
986 while (prev_scan > 0 && STB_TEXTEDIT_GETCHAR(str, prev_scan - 1) != STB_TEXTEDIT_NEWLINE)
988 find.first_char = find.prev_first;
989 find.prev_first = prev_scan;
994 case STB_TEXTEDIT_K_DELETE:
995 case STB_TEXTEDIT_K_DELETE | STB_TEXTEDIT_K_SHIFT:
996 if (STB_TEXT_HAS_SELECTION(state))
997 stb_textedit_delete_selection(str, state);
999 int n = STB_TEXTEDIT_STRINGLEN(str);
1001 stb_textedit_delete(str, state, state->
cursor, 1);
1006 case STB_TEXTEDIT_K_BACKSPACE:
1007 case STB_TEXTEDIT_K_BACKSPACE | STB_TEXTEDIT_K_SHIFT:
1008 if (STB_TEXT_HAS_SELECTION(state))
1009 stb_textedit_delete_selection(str, state);
1011 stb_textedit_clamp(str, state);
1013 stb_textedit_delete(str, state, state->
cursor-1, 1);
1020 #ifdef STB_TEXTEDIT_K_TEXTSTART2
1021 case STB_TEXTEDIT_K_TEXTSTART2:
1023 case STB_TEXTEDIT_K_TEXTSTART:
1028 #ifdef STB_TEXTEDIT_K_TEXTEND2
1029 case STB_TEXTEDIT_K_TEXTEND2:
1031 case STB_TEXTEDIT_K_TEXTEND:
1032 state->
cursor = STB_TEXTEDIT_STRINGLEN(str);
1037 #ifdef STB_TEXTEDIT_K_TEXTSTART2
1038 case STB_TEXTEDIT_K_TEXTSTART2 | STB_TEXTEDIT_K_SHIFT:
1040 case STB_TEXTEDIT_K_TEXTSTART | STB_TEXTEDIT_K_SHIFT:
1041 stb_textedit_prep_selection_at_cursor(state);
1046 #ifdef STB_TEXTEDIT_K_TEXTEND2
1047 case STB_TEXTEDIT_K_TEXTEND2 | STB_TEXTEDIT_K_SHIFT:
1049 case STB_TEXTEDIT_K_TEXTEND | STB_TEXTEDIT_K_SHIFT:
1050 stb_textedit_prep_selection_at_cursor(state);
1056 #ifdef STB_TEXTEDIT_K_LINESTART2
1057 case STB_TEXTEDIT_K_LINESTART2:
1059 case STB_TEXTEDIT_K_LINESTART:
1060 stb_textedit_clamp(str, state);
1061 stb_textedit_move_to_first(state);
1064 else while (state->
cursor > 0 && STB_TEXTEDIT_GETCHAR(str, state->
cursor-1) != STB_TEXTEDIT_NEWLINE)
1069 #ifdef STB_TEXTEDIT_K_LINEEND2
1070 case STB_TEXTEDIT_K_LINEEND2:
1072 case STB_TEXTEDIT_K_LINEEND: {
1073 int n = STB_TEXTEDIT_STRINGLEN(str);
1074 stb_textedit_clamp(str, state);
1075 stb_textedit_move_to_first(state);
1078 else while (state->
cursor < n && STB_TEXTEDIT_GETCHAR(str, state->
cursor) != STB_TEXTEDIT_NEWLINE)
1084 #ifdef STB_TEXTEDIT_K_LINESTART2
1085 case STB_TEXTEDIT_K_LINESTART2 | STB_TEXTEDIT_K_SHIFT:
1087 case STB_TEXTEDIT_K_LINESTART | STB_TEXTEDIT_K_SHIFT:
1088 stb_textedit_clamp(str, state);
1089 stb_textedit_prep_selection_at_cursor(state);
1092 else while (state->
cursor > 0 && STB_TEXTEDIT_GETCHAR(str, state->
cursor-1) != STB_TEXTEDIT_NEWLINE)
1098 #ifdef STB_TEXTEDIT_K_LINEEND2
1099 case STB_TEXTEDIT_K_LINEEND2 | STB_TEXTEDIT_K_SHIFT:
1101 case STB_TEXTEDIT_K_LINEEND | STB_TEXTEDIT_K_SHIFT: {
1102 int n = STB_TEXTEDIT_STRINGLEN(str);
1103 stb_textedit_clamp(str, state);
1104 stb_textedit_prep_selection_at_cursor(state);
1107 else while (state->
cursor < n && STB_TEXTEDIT_GETCHAR(str, state->
cursor) != STB_TEXTEDIT_NEWLINE)
1122 static void stb_textedit_flush_redo(
StbUndoState *state)
1129 static void stb_textedit_discard_undo(
StbUndoState *state)
1151 static void stb_textedit_discard_redo(
StbUndoState *state)
1170 const char* buf_begin = (
char*)state->
undo_rec; (
void)buf_begin;
1171 const char* buf_end = (
char*)state->
undo_rec +
sizeof(state->
undo_rec); (void)buf_end;
1184 stb_textedit_flush_redo(state);
1189 stb_textedit_discard_undo(state);
1200 stb_textedit_discard_undo(state);
1207 StbUndoRecord *r = stb_text_create_undo_record(state, insert_len);
1215 if (insert_len == 0) {
1264 stb_textedit_discard_redo(s);
1346 stb_text_createundo(&state->
undostate, where, 0, length);
1354 for (i=0; i <
length; ++i)
1355 p[i] = STB_TEXTEDIT_GETCHAR(str, where+i);
1364 for (i=0; i < old_length; ++i)
1365 p[i] = STB_TEXTEDIT_GETCHAR(str, where+i);
1370 static void stb_textedit_clear_state(
STB_TexteditState *state,
int is_single_line)
1382 state->
single_line = (
unsigned char) is_single_line;
1388 static void stb_textedit_initialize_state(
STB_TexteditState *state,
int is_single_line)
1390 stb_textedit_clear_state(state, is_single_line);
1393 #if defined(__GNUC__) || defined(__clang__)
1394 #pragma GCC diagnostic push
1395 #pragma GCC diagnostic ignored "-Wcast-qual"
1403 #if defined(__GNUC__) || defined(__clang__)
1404 #pragma GCC diagnostic pop
1407 #endif//STB_TEXTEDIT_IMPLEMENTATION
unsigned char padding3
Definition: imstb_textedit.h:350
float x0
Definition: imstb_textedit.h:366
STB_TEXTEDIT_POSITIONTYPE insert_length
Definition: imstb_textedit.h:303
int char_storage
Definition: imstb_textedit.h:305
float x1
Definition: imstb_textedit.h:366
int num_chars
Definition: imstb_textedit.h:369
Definition: imstb_textedit.h:308
unsigned char initialized
Definition: imstb_textedit.h:347
int row_count_per_page
Definition: imstb_textedit.h:338
int select_start
Definition: imstb_textedit.h:327
float preferred_x
Definition: imstb_textedit.h:351
unsigned char single_line
Definition: imstb_textedit.h:349
#define STB_TEXTEDIT_UNDOSTATECOUNT
Definition: imstb_textedit.h:287
unsigned char cursor_at_end_of_line
Definition: imstb_textedit.h:346
int select_end
Definition: imstb_textedit.h:328
#define STB_TEXTEDIT_GETWIDTH_NEWLINE
Definition: imgui_internal.h:182
#define IM_ASSERT(_EXPR)
Definition: imgui.h:87
STB_TEXTEDIT_POSITIONTYPE delete_length
Definition: imstb_textedit.h:304
x y t t *t x y t t t x y t t t x *y t *t t x *y t *t t x y t t t x y t t t x *y t *t t x *y t *t *t x y *z t t *t t x *y *z t *t *t t x y z t t t t x *y z t *t t t x * y(z *w))
STB_TEXTEDIT_POSITIONTYPE where
Definition: imstb_textedit.h:302
unsigned char insert_mode
Definition: imstb_textedit.h:334
#define STB_TEXTEDIT_POSITIONTYPE
Definition: imstb_textedit.h:296
x y t t *t x y t t t x y t t t x *y t *t t x *y t *t t x y t t t x y t t t x *y t *t t x *y t *t *t x y *z w
Definition: exprtk.hpp:9210
int cursor
Definition: imstb_textedit.h:324
short undo_point
Definition: imstb_textedit.h:313
StbUndoRecord undo_rec[STB_TEXTEDIT_UNDOSTATECOUNT]
Definition: imstb_textedit.h:311
Definition: imstb_textedit.h:364
Definition: imstb_textedit.h:299
STB_TEXTEDIT_CHARTYPE undo_char[STB_TEXTEDIT_UNDOCHARCOUNT]
Definition: imstb_textedit.h:312
#define STB_TEXTEDIT_CHARTYPE
Definition: imstb_textedit.h:293
x y * z
Definition: exprtk.hpp:9133
float baseline_y_delta
Definition: imstb_textedit.h:367
float ymax
Definition: imstb_textedit.h:368
#define STB_TEXTEDIT_UNDOCHARCOUNT
Definition: imstb_textedit.h:290
unsigned char has_preferred_x
Definition: imstb_textedit.h:348
Definition: imstb_textedit.h:317
#define STB_TEXTEDIT_STRING
Definition: imgui_internal.h:180
DT_DLL_VRVCORE double length(const makVrv::DtCoordinateSystem &, const std::vector< DtVector > &vertices)
Returns the total distance of a segmented line defined by the provided vector of vertices.
x y t t *t x y t t t x y t t t x *y t *t t x *y t *t t x y t t t x y t t t x(y+z)
StbUndoState undostate
Definition: imstb_textedit.h:352
short redo_point
Definition: imstb_textedit.h:313
float ymin
Definition: imstb_textedit.h:368
int redo_char_point
Definition: imstb_textedit.h:314
int undo_char_point
Definition: imstb_textedit.h:314