|
@@ -5493,58 +5493,45 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|
|
draw_window->DrawList->AddRectFilled(rect.Min, rect.Max, bg_color);
|
|
|
}
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- // Render text
|
|
|
- // We test for 'buf_display_max_length' as a way to avoid some pathological cases (e.g. single-line 1 MB string) which would make ImDrawList crash.
|
|
|
- // FIXME-OPT: Multiline could submit a smaller amount of contents to AddText() since we already iterated through it.
|
|
|
- if ((is_multiline || (buf_display_end - buf_display) < buf_display_max_length) && (text_col & IM_COL32_A_MASK) && (line_visible_n0 < line_visible_n1))
|
|
|
- g.Font->RenderText(draw_window->DrawList, g.FontSize,
|
|
|
- draw_pos - draw_scroll + ImVec2(0.0f, line_visible_n0 * g.FontSize),
|
|
|
- text_col, clip_rect.AsVec4(),
|
|
|
- line_index->get_line_begin(buf_display, line_visible_n0),
|
|
|
- line_index->get_line_end(buf_display, line_visible_n1 - 1),
|
|
|
- wrap_width, ImDrawTextFlags_WrapKeepBlanks);
|
|
|
-
|
|
|
- // Draw blinking cursor
|
|
|
- if (render_cursor)
|
|
|
- {
|
|
|
- state->CursorAnim += io.DeltaTime;
|
|
|
- bool cursor_is_visible = (!g.IO.ConfigInputTextCursorBlink) || (state->CursorAnim <= 0.0f) || ImFmod(state->CursorAnim, 1.20f) <= 0.80f;
|
|
|
- ImVec2 cursor_screen_pos = ImTrunc(draw_pos + cursor_offset - draw_scroll);
|
|
|
- ImRect cursor_screen_rect(cursor_screen_pos.x, cursor_screen_pos.y - g.FontSize + 0.5f, cursor_screen_pos.x + 1.0f, cursor_screen_pos.y - 1.5f);
|
|
|
- if (cursor_is_visible && cursor_screen_rect.Overlaps(clip_rect))
|
|
|
- draw_window->DrawList->AddLine(cursor_screen_rect.Min, cursor_screen_rect.GetBL(), GetColorU32(ImGuiCol_InputTextCursor), 1.0f); // FIXME-DPI: Cursor thickness (#7031)
|
|
|
-
|
|
|
- // Notify OS of text input position for advanced IME (-1 x offset so that Windows IME can cover our cursor. Bit of an extra nicety.)
|
|
|
- // This is required for some backends (SDL3) to start emitting character/text inputs.
|
|
|
- // As per #6341, make sure we don't set that on the deactivating frame.
|
|
|
- if (!is_readonly && g.ActiveId == id)
|
|
|
- {
|
|
|
- ImGuiPlatformImeData* ime_data = &g.PlatformImeData; // (this is a public struct, passed to io.Platform_SetImeDataFn() handler)
|
|
|
- ime_data->WantVisible = true;
|
|
|
- ime_data->WantTextInput = true;
|
|
|
- ime_data->InputPos = ImVec2(cursor_screen_pos.x - 1.0f, cursor_screen_pos.y - g.FontSize);
|
|
|
- ime_data->InputLineHeight = g.FontSize;
|
|
|
- ime_data->ViewportId = window->Viewport->ID;
|
|
|
- }
|
|
|
+ // Find render position for right alignment (single-line only)
|
|
|
+ if (g.ActiveId != id && flags & ImGuiInputTextFlags_ElideLeft)
|
|
|
+ draw_pos.x = ImMin(draw_pos.x, frame_bb.Max.x - CalcTextSize(buf_display, NULL).x - style.FramePadding.x);
|
|
|
+ //draw_scroll.x = state->Scroll.x; // Preserve scroll when inactive?
|
|
|
+
|
|
|
+ // Render text
|
|
|
+ if ((is_multiline || (buf_display_end - buf_display) < buf_display_max_length) && (text_col & IM_COL32_A_MASK) && (line_visible_n0 < line_visible_n1))
|
|
|
+ g.Font->RenderText(draw_window->DrawList, g.FontSize,
|
|
|
+ draw_pos - draw_scroll + ImVec2(0.0f, line_visible_n0 * g.FontSize),
|
|
|
+ text_col, clip_rect.AsVec4(),
|
|
|
+ line_index->get_line_begin(buf_display, line_visible_n0),
|
|
|
+ line_index->get_line_end(buf_display, line_visible_n1 - 1),
|
|
|
+ wrap_width, ImDrawTextFlags_WrapKeepBlanks);
|
|
|
+
|
|
|
+ // Render blinking cursor
|
|
|
+ if (render_cursor)
|
|
|
+ {
|
|
|
+ state->CursorAnim += io.DeltaTime;
|
|
|
+ bool cursor_is_visible = (!g.IO.ConfigInputTextCursorBlink) || (state->CursorAnim <= 0.0f) || ImFmod(state->CursorAnim, 1.20f) <= 0.80f;
|
|
|
+ ImVec2 cursor_screen_pos = ImTrunc(draw_pos + cursor_offset - draw_scroll);
|
|
|
+ ImRect cursor_screen_rect(cursor_screen_pos.x, cursor_screen_pos.y - g.FontSize + 0.5f, cursor_screen_pos.x + 1.0f, cursor_screen_pos.y - 1.5f);
|
|
|
+ if (cursor_is_visible && cursor_screen_rect.Overlaps(clip_rect))
|
|
|
+ draw_window->DrawList->AddLine(cursor_screen_rect.Min, cursor_screen_rect.GetBL(), GetColorU32(ImGuiCol_InputTextCursor), 1.0f); // FIXME-DPI: Cursor thickness (#7031)
|
|
|
+
|
|
|
+ // Notify OS of text input position for advanced IME (-1 x offset so that Windows IME can cover our cursor. Bit of an extra nicety.)
|
|
|
+ // This is required for some backends (SDL3) to start emitting character/text inputs.
|
|
|
+ // As per #6341, make sure we don't set that on the deactivating frame.
|
|
|
+ if (!is_readonly && g.ActiveId == id)
|
|
|
+ {
|
|
|
+ ImGuiPlatformImeData* ime_data = &g.PlatformImeData; // (this is a public struct, passed to io.Platform_SetImeDataFn() handler)
|
|
|
+ ime_data->WantVisible = true;
|
|
|
+ ime_data->WantTextInput = true;
|
|
|
+ ime_data->InputPos = ImVec2(cursor_screen_pos.x - 1.0f, cursor_screen_pos.y - g.FontSize);
|
|
|
+ ime_data->InputLineHeight = g.FontSize;
|
|
|
+ ime_data->ViewportId = window->Viewport->ID;
|
|
|
}
|
|
|
}
|
|
|
- else
|
|
|
- {
|
|
|
- // Find render position for right alignment (single-line only)
|
|
|
- if (flags & ImGuiInputTextFlags_ElideLeft)
|
|
|
- draw_pos.x = ImMin(draw_pos.x, frame_bb.Max.x - CalcTextSize(buf_display, NULL).x - style.FramePadding.x);
|
|
|
-
|
|
|
- // Render text only (no selection, no cursor)
|
|
|
- //draw_scroll.x = state->Scroll.x; // Preserve scroll when inactive?
|
|
|
- if ((is_multiline || (buf_display_end - buf_display) < buf_display_max_length) && (text_col & IM_COL32_A_MASK) && (line_visible_n0 < line_visible_n1))
|
|
|
- g.Font->RenderText(draw_window->DrawList, g.FontSize,
|
|
|
- draw_pos - draw_scroll + ImVec2(0.0f, line_visible_n0 * g.FontSize),
|
|
|
- text_col, clip_rect.AsVec4(),
|
|
|
- line_index->get_line_begin(buf_display, line_visible_n0),
|
|
|
- line_index->get_line_end(buf_display, line_visible_n1 - 1),
|
|
|
- wrap_width, ImDrawTextFlags_WrapKeepBlanks);
|
|
|
- }
|
|
|
|
|
|
if (is_password && !is_displaying_hint)
|
|
|
PopPasswordFont();
|