InputText: fixed minor one-frame selection glitch when reverting with Escape + disable cursor rendering on revert frame. (#3008)

Amend bdbb2b21, 83efdcec
This commit is contained in:
ocornut 2022-09-20 15:34:05 +02:00
parent 4b522e145c
commit 60ab8a94a7
2 changed files with 7 additions and 4 deletions

View File

@ -93,6 +93,7 @@ Other Changes:
by converting them to half-width (U+0021..U+007E). by converting them to half-width (U+0021..U+007E).
- InputText: added support for shift+click style selection. (#5619) [@procedural] - InputText: added support for shift+click style selection. (#5619) [@procedural]
- InputText: clarified that callbacks cannot modify buffer when using the ReadOnly flag. - InputText: clarified that callbacks cannot modify buffer when using the ReadOnly flag.
- InputText: fixed minor one-frame selection glitch when reverting with Escape.
- IsItemHovered: Added ImGuiHoveredFlags_DelayNormal and ImGuiHoveredFlags_DelayShort flags, - IsItemHovered: Added ImGuiHoveredFlags_DelayNormal and ImGuiHoveredFlags_DelayShort flags,
allowing to introduce a shared delay for tooltip idioms. The delays are respectively allowing to introduce a shared delay for tooltip idioms. The delays are respectively
io.HoverDelayNormal (default to 0.30f) and io.HoverDelayFast (default to 0.10f). (#1485) io.HoverDelayNormal (default to 0.30f) and io.HoverDelayFast (default to 0.10f). (#1485)

View File

@ -3745,11 +3745,12 @@ static void stb_textedit_replace(ImGuiInputTextState* str, STB_TexteditState* st
{ {
stb_text_makeundo_replace(str, state, 0, str->CurLenW, text_len); stb_text_makeundo_replace(str, state, 0, str->CurLenW, text_len);
ImStb::STB_TEXTEDIT_DELETECHARS(str, 0, str->CurLenW); ImStb::STB_TEXTEDIT_DELETECHARS(str, 0, str->CurLenW);
state->cursor = state->select_start = state->select_end = 0;
if (text_len <= 0) if (text_len <= 0)
return; return;
if (ImStb::STB_TEXTEDIT_INSERTCHARS(str, 0, text, text_len)) if (ImStb::STB_TEXTEDIT_INSERTCHARS(str, 0, text, text_len))
{ {
state->cursor = text_len; state->cursor = state->select_start = state->select_end = text_len;
state->has_preferred_x = 0; state->has_preferred_x = 0;
return; return;
} }
@ -4152,7 +4153,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
clear_active_id = true; clear_active_id = true;
// Lock the decision of whether we are going to take the path displaying the cursor or selection // Lock the decision of whether we are going to take the path displaying the cursor or selection
const bool render_cursor = (g.ActiveId == id) || (state && user_scroll_active); bool render_cursor = (g.ActiveId == id) || (state && user_scroll_active);
bool render_selection = state && (state->HasSelection() || select_all) && (RENDER_SELECTION_WHEN_INACTIVE || render_cursor); bool render_selection = state && (state->HasSelection() || select_all) && (RENDER_SELECTION_WHEN_INACTIVE || render_cursor);
bool value_changed = false; bool value_changed = false;
bool validated = false; bool validated = false;
@ -4372,6 +4373,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
else if (is_cancel) else if (is_cancel)
{ {
clear_active_id = cancel_edit = true; clear_active_id = cancel_edit = true;
render_cursor = render_selection = false;
} }
else if (is_undo || is_redo) else if (is_undo || is_redo)
{ {
@ -4442,10 +4444,10 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
if (g.ActiveId == id) if (g.ActiveId == id)
{ {
IM_ASSERT(state != NULL); IM_ASSERT(state != NULL);
if (cancel_edit) if (cancel_edit && !is_readonly)
{ {
// Restore initial value. Only return true if restoring to the initial value changes the current buffer contents. // Restore initial value. Only return true if restoring to the initial value changes the current buffer contents.
if (!is_readonly && strcmp(buf, state->InitialTextA.Data) != 0) if (strcmp(buf, state->InitialTextA.Data) != 0)
{ {
// Push records into the undo stack so we can CTRL+Z the revert operation itself // Push records into the undo stack so we can CTRL+Z the revert operation itself
apply_new_text = state->InitialTextA.Data; apply_new_text = state->InitialTextA.Data;