mirror of
https://github.com/Drezil/imgui.git
synced 2025-04-15 23:54:01 +00:00
Fix clipboard pasting into an InputText box not filtering the characters according to input box semantic (number, etc.)
This commit is contained in:
parent
a5f4108781
commit
97d34271f8
40
imgui.cpp
40
imgui.cpp
@ -231,7 +231,6 @@
|
|||||||
- text edit: centered text for slider or input text to it matches typical positioning.
|
- text edit: centered text for slider or input text to it matches typical positioning.
|
||||||
- text edit: flag to disable live update of the user buffer.
|
- text edit: flag to disable live update of the user buffer.
|
||||||
- text edit: field resize behavior - field could stretch when being edited? hover tooltip shows more text?
|
- text edit: field resize behavior - field could stretch when being edited? hover tooltip shows more text?
|
||||||
- text edit: pasting text into a number box should filter the characters the same way direct input does
|
|
||||||
- text edit: add multi-line text edit
|
- text edit: add multi-line text edit
|
||||||
- settings: write more decent code to allow saving/loading new fields
|
- settings: write more decent code to allow saving/loading new fields
|
||||||
- settings: api for per-tool simple persistent data (bool,int,float) in .ini file
|
- settings: api for per-tool simple persistent data (bool,int,float) in .ini file
|
||||||
@ -4730,6 +4729,22 @@ void ImGuiTextEditCallbackData::InsertChars(int pos, const char* new_text, const
|
|||||||
SelectionStart = SelectionEnd = CursorPos;
|
SelectionStart = SelectionEnd = CursorPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool InputTextFilterCharacter(ImWchar c, ImGuiInputTextFlags flags)
|
||||||
|
{
|
||||||
|
if (c < 128 && c != ' ' && !isprint((int)(c & 0xFF)))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (flags & ImGuiInputTextFlags_CharsDecimal)
|
||||||
|
if (!(c >= '0' && c <= '9') && (c != '.') && (c != '-') && (c != '+') && (c != '*') && (c != '/'))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (flags & ImGuiInputTextFlags_CharsHexadecimal)
|
||||||
|
if (!(c >= '0' && c <= '9') && !(c >= 'a' && c <= 'f') && !(c >= 'A' && c <= 'F'))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Edit a string of text
|
// Edit a string of text
|
||||||
bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputTextFlags flags, void (*callback)(ImGuiTextEditCallbackData*), void* user_data)
|
bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputTextFlags flags, void (*callback)(ImGuiTextEditCallbackData*), void* user_data)
|
||||||
{
|
{
|
||||||
@ -4876,14 +4891,15 @@ bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputT
|
|||||||
if (bytes_count <= 0)
|
if (bytes_count <= 0)
|
||||||
break;
|
break;
|
||||||
s += bytes_count;
|
s += bytes_count;
|
||||||
if (c == '\n' || c == '\r')
|
|
||||||
continue;
|
|
||||||
if (c >= 0x10000)
|
if (c >= 0x10000)
|
||||||
continue;
|
continue;
|
||||||
clipboard_filtered[clipboard_filtered_len++] = (ImWchar)c;
|
if (InputTextFilterCharacter((ImWchar)c, flags))
|
||||||
|
continue;
|
||||||
|
clipboard_filtered[clipboard_filtered_len++] = (ImWchar)c;
|
||||||
}
|
}
|
||||||
clipboard_filtered[clipboard_filtered_len] = 0;
|
clipboard_filtered[clipboard_filtered_len] = 0;
|
||||||
stb_textedit_paste(&edit_state, &edit_state.StbState, clipboard_filtered, clipboard_filtered_len);
|
if (clipboard_filtered_len > 0) // If everything was filtered, ignore the pasting operation
|
||||||
|
stb_textedit_paste(&edit_state, &edit_state.StbState, clipboard_filtered, clipboard_filtered_len);
|
||||||
ImGui::MemFree(clipboard_filtered);
|
ImGui::MemFree(clipboard_filtered);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4896,17 +4912,9 @@ bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputT
|
|||||||
const ImWchar c = g.IO.InputCharacters[n];
|
const ImWchar c = g.IO.InputCharacters[n];
|
||||||
if (c)
|
if (c)
|
||||||
{
|
{
|
||||||
// Filter
|
// Insert character if they pass filtering
|
||||||
if (c < 128 && c != ' ' && !isprint((int)(c & 0xFF)))
|
if (InputTextFilterCharacter(c, flags))
|
||||||
continue;
|
continue;
|
||||||
if (flags & ImGuiInputTextFlags_CharsDecimal)
|
|
||||||
if (!(c >= '0' && c <= '9') && (c != '.') && (c != '-') && (c != '+') && (c != '*') && (c != '/'))
|
|
||||||
continue;
|
|
||||||
if (flags & ImGuiInputTextFlags_CharsHexadecimal)
|
|
||||||
if (!(c >= '0' && c <= '9') && !(c >= 'a' && c <= 'f') && !(c >= 'A' && c <= 'F'))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// Insert character!
|
|
||||||
edit_state.OnKeyPressed(c);
|
edit_state.OnKeyPressed(c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user