mirror of
				https://github.com/ocornut/imgui.git
				synced 2025-11-04 01:34:32 +00:00 
			
		
		
		
	This commit is contained in:
		@@ -76,7 +76,8 @@ Other Changes:
 | 
				
			|||||||
  those improvements in 1.73 makes them unnecessary. (#2722, #2770). [@rokups]
 | 
					  those improvements in 1.73 makes them unnecessary. (#2722, #2770). [@rokups]
 | 
				
			||||||
- ColorEdit: "Copy As" context-menu tool shows hex values with a '#' prefix instead of '0x'.
 | 
					- ColorEdit: "Copy As" context-menu tool shows hex values with a '#' prefix instead of '0x'.
 | 
				
			||||||
- ColorEdit: "Copy As" content-menu tool shows hex values both with/without alpha when available.
 | 
					- ColorEdit: "Copy As" content-menu tool shows hex values both with/without alpha when available.
 | 
				
			||||||
- InputText: Fix crash when executing undo action after clearing input with ESC (#3008). [@rokups]
 | 
					- InputText: Fix corruption or crash when executing undo after clearing input with ESC, as a
 | 
				
			||||||
 | 
					  byproduct we are allowing to later undo the revert with a CTRL+Z. (#3008).
 | 
				
			||||||
- MenuBar: Fix minor clipping issue where occasionally a menu text can overlap the right-most border.
 | 
					- MenuBar: Fix minor clipping issue where occasionally a menu text can overlap the right-most border.
 | 
				
			||||||
- Window: Fix SetNextWindowBgAlpha(1.0f) failing to override alpha component. (#3007) [@Albog]
 | 
					- Window: Fix SetNextWindowBgAlpha(1.0f) failing to override alpha component. (#3007) [@Albog]
 | 
				
			||||||
- Window: When testing for the presence of the ImGuiWindowFlags_NoBringToFrontOnFocus flag we
 | 
					- Window: When testing for the presence of the ImGuiWindowFlags_NoBringToFrontOnFocus flag we
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3271,8 +3271,25 @@ static bool STB_TEXTEDIT_INSERTCHARS(STB_TEXTEDIT_STRING* obj, int pos, const Im
 | 
				
			|||||||
#define STB_TEXTEDIT_IMPLEMENTATION
 | 
					#define STB_TEXTEDIT_IMPLEMENTATION
 | 
				
			||||||
#include "imstb_textedit.h"
 | 
					#include "imstb_textedit.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// stb_textedit internally allows for a single undo record to do addition and deletion, but somehow, calling 
 | 
				
			||||||
 | 
					// the stb_textedit_paste() function creates two separate records, so we perform it manually. (FIXME: Report to nothings/stb?) 
 | 
				
			||||||
 | 
					static void stb_textedit_replace(STB_TEXTEDIT_STRING* str, STB_TexteditState* state, const STB_TEXTEDIT_CHARTYPE* text, int text_len)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    stb_text_makeundo_replace(str, state, 0, str->CurLenW, text_len);
 | 
				
			||||||
 | 
					    ImStb::STB_TEXTEDIT_DELETECHARS(str, 0, str->CurLenW);
 | 
				
			||||||
 | 
					    if (text_len <= 0)
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    if (ImStb::STB_TEXTEDIT_INSERTCHARS(str, 0, text, text_len))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        state->cursor = text_len;
 | 
				
			||||||
 | 
					        state->has_preferred_x = 0;
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    IM_ASSERT(0); // Failed to insert character, normally shouldn't happen because of how we currently use stb_textedit_replace()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} // namespace ImStb
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ImGuiInputTextState::OnKeyPressed(int key)
 | 
					void ImGuiInputTextState::OnKeyPressed(int key)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    stb_textedit_key(this, &Stb, key);
 | 
					    stb_textedit_key(this, &Stb, key);
 | 
				
			||||||
@@ -3826,27 +3843,16 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
 | 
				
			|||||||
            // 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 (!is_readonly && strcmp(buf, state->InitialTextA.Data) != 0)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 | 
					                // 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;
 | 
				
			||||||
 | 
					                ImVector<ImWchar> w_text;
 | 
				
			||||||
                // Select all text
 | 
					                if (apply_new_text_length > 0)
 | 
				
			||||||
                state->OnKeyPressed(STB_TEXTEDIT_K_TEXTSTART);
 | 
					 | 
				
			||||||
                state->OnKeyPressed(STB_TEXTEDIT_K_TEXTEND | STB_TEXTEDIT_K_SHIFT);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                // Paste converted text or empty buffer
 | 
					 | 
				
			||||||
                if (state->InitialTextA.size() > 1)
 | 
					 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    ImVector<ImWchar> w_text;
 | 
					                    w_text.resize(ImTextCountCharsFromUtf8(apply_new_text, apply_new_text + apply_new_text_length) + 1);
 | 
				
			||||||
                    const char* apply_new_text_end = apply_new_text + apply_new_text_length + 1;
 | 
					                    ImTextStrFromUtf8(w_text.Data, w_text.Size, apply_new_text, apply_new_text + apply_new_text_length);
 | 
				
			||||||
                    w_text.resize(ImTextCountCharsFromUtf8(apply_new_text, apply_new_text_end));
 | 
					 | 
				
			||||||
                    ImTextStrFromUtf8(w_text.Data, w_text.Size, apply_new_text, apply_new_text_end);
 | 
					 | 
				
			||||||
                    ImStb::stb_textedit_paste(state, &state->Stb, w_text.Data, w_text.Size);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                else
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    ImWchar empty = 0;
 | 
					 | 
				
			||||||
                    ImStb::stb_textedit_paste(state, &state->Stb, &empty, 0);
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					                stb_textedit_replace(state, &state->Stb, w_text.Data, (apply_new_text_length > 0) ? (w_text.Size - 1) : 0);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user