|
@@ -4301,7 +4301,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|
}
|
|
}
|
|
|
|
|
|
// Process other shortcuts/key-presses
|
|
// Process other shortcuts/key-presses
|
|
- bool cancel_edit = false;
|
|
|
|
|
|
+ bool revert_edit = false;
|
|
if (g.ActiveId == id && !g.ActiveIdIsJustActivated && !clear_active_id)
|
|
if (g.ActiveId == id && !g.ActiveIdIsJustActivated && !clear_active_id)
|
|
{
|
|
{
|
|
IM_ASSERT(state != NULL);
|
|
IM_ASSERT(state != NULL);
|
|
@@ -4372,8 +4372,23 @@ 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;
|
|
|
|
- render_cursor = render_selection = false;
|
|
|
|
|
|
+ if (flags & ImGuiInputTextFlags_EscapeClearsAll)
|
|
|
|
+ {
|
|
|
|
+ if (state->CurLenA > 0)
|
|
|
|
+ {
|
|
|
|
+ revert_edit = true;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ render_cursor = render_selection = false;
|
|
|
|
+ clear_active_id = true;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ clear_active_id = revert_edit = true;
|
|
|
|
+ render_cursor = render_selection = false;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
else if (is_undo || is_redo)
|
|
else if (is_undo || is_redo)
|
|
{
|
|
{
|
|
@@ -4444,11 +4459,19 @@ 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 && !is_readonly)
|
|
|
|
|
|
+ if (revert_edit && !is_readonly)
|
|
{
|
|
{
|
|
- // Restore initial value. Only return true if restoring to the initial value changes the current buffer contents.
|
|
|
|
- if (strcmp(buf, state->InitialTextA.Data) != 0)
|
|
|
|
|
|
+ if (flags & ImGuiInputTextFlags_EscapeClearsAll)
|
|
|
|
+ {
|
|
|
|
+ // Clear input
|
|
|
|
+ apply_new_text = "";
|
|
|
|
+ apply_new_text_length = 0;
|
|
|
|
+ STB_TEXTEDIT_CHARTYPE empty_string;
|
|
|
|
+ stb_textedit_replace(state, &state->Stb, &empty_string, 0);
|
|
|
|
+ }
|
|
|
|
+ else if (strcmp(buf, state->InitialTextA.Data) != 0)
|
|
{
|
|
{
|
|
|
|
+ // Restore initial value. Only return true if restoring to the initial value changes the current buffer contents.
|
|
// 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;
|
|
apply_new_text_length = state->InitialTextA.Size - 1;
|
|
apply_new_text_length = state->InitialTextA.Size - 1;
|
|
@@ -4473,7 +4496,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|
// When using 'ImGuiInputTextFlags_EnterReturnsTrue' as a special case we reapply the live buffer back to the input buffer before clearing ActiveId, even though strictly speaking it wasn't modified on this frame.
|
|
// When using 'ImGuiInputTextFlags_EnterReturnsTrue' as a special case we reapply the live buffer back to the input buffer before clearing ActiveId, even though strictly speaking it wasn't modified on this frame.
|
|
// If we didn't do that, code like InputInt() with ImGuiInputTextFlags_EnterReturnsTrue would fail.
|
|
// If we didn't do that, code like InputInt() with ImGuiInputTextFlags_EnterReturnsTrue would fail.
|
|
// This also allows the user to use InputText() with ImGuiInputTextFlags_EnterReturnsTrue without maintaining any user-side storage (please note that if you use this property along ImGuiInputTextFlags_CallbackResize you can end up with your temporary string object unnecessarily allocating once a frame, either store your string data, either if you don't then don't use ImGuiInputTextFlags_CallbackResize).
|
|
// This also allows the user to use InputText() with ImGuiInputTextFlags_EnterReturnsTrue without maintaining any user-side storage (please note that if you use this property along ImGuiInputTextFlags_CallbackResize you can end up with your temporary string object unnecessarily allocating once a frame, either store your string data, either if you don't then don't use ImGuiInputTextFlags_CallbackResize).
|
|
- const bool apply_edit_back_to_user_buffer = !cancel_edit || (validated && (flags & ImGuiInputTextFlags_EnterReturnsTrue) != 0);
|
|
|
|
|
|
+ const bool apply_edit_back_to_user_buffer = !revert_edit || (validated && (flags & ImGuiInputTextFlags_EnterReturnsTrue) != 0);
|
|
if (apply_edit_back_to_user_buffer)
|
|
if (apply_edit_back_to_user_buffer)
|
|
{
|
|
{
|
|
// Apply new value immediately - copy modified buffer back
|
|
// Apply new value immediately - copy modified buffer back
|