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)
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
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
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
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. Coordinates are in local database coordinates. The coordinate system is used to convert between the local database coordinates and geocentric. All distance is in 2D – the Z value is ignored.
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