| 3759 | } |
| 3760 | |
| 3761 | static bool STB_TEXTEDIT_INSERTCHARS(ImGuiInputTextState* obj, int pos, const ImWchar* new_text, int new_text_len) |
| 3762 | { |
| 3763 | const bool is_resizable = (obj->Flags & ImGuiInputTextFlags_CallbackResize) != 0; |
| 3764 | const int text_len = obj->CurLenW; |
| 3765 | IM_ASSERT(pos <= text_len); |
| 3766 | |
| 3767 | const int new_text_len_utf8 = ImTextCountUtf8BytesFromStr(new_text, new_text + new_text_len); |
| 3768 | if (!is_resizable && (new_text_len_utf8 + obj->CurLenA + 1 > obj->BufCapacityA)) |
| 3769 | return false; |
| 3770 | |
| 3771 | // Grow internal buffer if needed |
| 3772 | if (new_text_len + text_len + 1 > obj->TextW.Size) |
| 3773 | { |
| 3774 | if (!is_resizable) |
| 3775 | return false; |
| 3776 | IM_ASSERT(text_len < obj->TextW.Size); |
| 3777 | obj->TextW.resize(text_len + ImClamp(new_text_len * 4, 32, ImMax(256, new_text_len)) + 1); |
| 3778 | } |
| 3779 | |
| 3780 | ImWchar* text = obj->TextW.Data; |
| 3781 | if (pos != text_len) |
| 3782 | memmove(text + pos + new_text_len, text + pos, (size_t)(text_len - pos) * sizeof(ImWchar)); |
| 3783 | memcpy(text + pos, new_text, (size_t)new_text_len * sizeof(ImWchar)); |
| 3784 | |
| 3785 | obj->Edited = true; |
| 3786 | obj->CurLenW += new_text_len; |
| 3787 | obj->CurLenA += new_text_len_utf8; |
| 3788 | obj->TextW[obj->CurLenW] = '\0'; |
| 3789 | |
| 3790 | return true; |
| 3791 | } |
| 3792 | |
| 3793 | // We don't use an enum so we can build even with conflicting symbols (if another user of stb_textedit.h leak their STB_TEXTEDIT_K_* symbols) |
| 3794 | #define STB_TEXTEDIT_K_LEFT 0x200000 // keyboard input to move cursor left |
no test coverage detected