| 4239 | } |
| 4240 | |
| 4241 | void ImGuiInputTextCallbackData::InsertChars(int pos, const char* new_text, const char* new_text_end) |
| 4242 | { |
| 4243 | // Accept null ranges |
| 4244 | if (new_text == new_text_end) |
| 4245 | return; |
| 4246 | |
| 4247 | // Grow internal buffer if needed |
| 4248 | const bool is_resizable = (Flags & ImGuiInputTextFlags_CallbackResize) != 0; |
| 4249 | const int new_text_len = new_text_end ? (int)(new_text_end - new_text) : (int)ImStrlen(new_text); |
| 4250 | if (new_text_len + BufTextLen >= BufSize) |
| 4251 | { |
| 4252 | if (!is_resizable) |
| 4253 | return; |
| 4254 | |
| 4255 | ImGuiContext& g = *Ctx; |
| 4256 | ImGuiInputTextState* edit_state = &g.InputTextState; |
| 4257 | IM_ASSERT(edit_state->ID != 0 && g.ActiveId == edit_state->ID); |
| 4258 | IM_ASSERT(Buf == edit_state->TextA.Data); |
| 4259 | int new_buf_size = BufTextLen + ImClamp(new_text_len * 4, 32, ImMax(256, new_text_len)) + 1; |
| 4260 | edit_state->TextA.resize(new_buf_size + 1); |
| 4261 | edit_state->TextSrc = edit_state->TextA.Data; |
| 4262 | Buf = edit_state->TextA.Data; |
| 4263 | BufSize = edit_state->BufCapacity = new_buf_size; |
| 4264 | } |
| 4265 | |
| 4266 | if (BufTextLen != pos) |
| 4267 | memmove(Buf + pos + new_text_len, Buf + pos, (size_t)(BufTextLen - pos)); |
| 4268 | memcpy(Buf + pos, new_text, (size_t)new_text_len * sizeof(char)); |
| 4269 | Buf[BufTextLen + new_text_len] = '\0'; |
| 4270 | |
| 4271 | if (CursorPos >= pos) |
| 4272 | CursorPos += new_text_len; |
| 4273 | SelectionStart = SelectionEnd = CursorPos; |
| 4274 | BufDirty = true; |
| 4275 | BufTextLen += new_text_len; |
| 4276 | } |
| 4277 | |
| 4278 | void ImGui::PushPasswordFont() |
| 4279 | { |
no test coverage detected