mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 05:01:05 +01:00 
			
		
		
		
	Added optional misc/stl/imgui_stl.h wrapper to use with STL types (e.g. InputText with std::string). (#2035, #2006, #1443, #1008)
This commit is contained in:
		| @@ -70,6 +70,7 @@ Other Changes: | ||||
|  - Drag and Drop: Added ImGuiDragDropFlags_SourceAutoExpirePayload flag to force payload to expire if the source stops being submitted. (#1725, #143). | ||||
|  - IsItemHovered(): Added ImGuiHoveredFlags_AllowWhenDisabled flag to query hovered status on disabled items. (#1940, #211) | ||||
|  - Selectable: Added ImGuiSelectableFlags_Disabled flag in the public API. (#211) | ||||
|  - Misc; Added optional misc/stl/imgui_stl.h wrapper to use with STL types (e.g. InputText with std::string). (#2006, #1443, #1008) | ||||
|  - Misc: Added IMGUI_VERSION_NUM for easy compile-time testing. (#2025) | ||||
|  - Misc: Added ImGuiMouseCursor_Hand cursor enum + corresponding software cursor. (#1913, 1914) [@aiekick, @ocornut]  | ||||
|  - Misc: Tweaked software mouse cursor offset to match the offset of the corresponding Windows 10 cursors. | ||||
|   | ||||
| @@ -10715,7 +10715,8 @@ static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags f | ||||
| //   This is so we can easily call InputText() on static arrays using ARRAYSIZE() and to match  | ||||
| //   Note that in std::string world, capacity() would omit 1 byte used by the zero-terminator. | ||||
| // - When active, hold on a privately held copy of the text (and apply back to 'buf'). So changing 'buf' while the InputText is active has no effect. | ||||
| // FIXME: Rather messy function partly because we are doing UTF8 > u16 > UTF8 conversions on the go to more easily handle stb_textedit calls. Ideally we should stay in UTF-8 all the time. See https://github.com/nothings/stb/issues/188 | ||||
| // - If you want to use ImGui::InputText() with std::string, see misc/stl/imgui_stl.h | ||||
| // (FIXME: Rather messy function partly because we are doing UTF8 > u16 > UTF8 conversions on the go to more easily handle stb_textedit calls. Ideally we should stay in UTF-8 all the time. See https://github.com/nothings/stb/issues/188) | ||||
| bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* callback_user_data) | ||||
| { | ||||
|     ImGuiWindow* window = GetCurrentWindow(); | ||||
|   | ||||
							
								
								
									
										3
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -373,6 +373,7 @@ namespace ImGui | ||||
|     IMGUI_API bool          DragScalarN(const char* label, ImGuiDataType data_type, void* v, int components, float v_speed, const void* v_min = NULL, const void* v_max = NULL, const char* format = NULL, float power = 1.0f); | ||||
|  | ||||
|     // Widgets: Input with Keyboard | ||||
|     // If you want to use InputText() with a dynamic string type such as std::string or your own, see misc/stl/imgui_stl.h | ||||
|     IMGUI_API bool          InputText(const char* label, char* buf, size_t buf_size, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); | ||||
|     IMGUI_API bool          InputTextMultiline(const char* label, char* buf, size_t buf_size, const ImVec2& size = ImVec2(0,0), ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); | ||||
|     IMGUI_API bool          InputFloat(const char* label, float* v, float step = 0.0f, float step_fast = 0.0f, const char* format = "%.3f", ImGuiInputTextFlags extra_flags = 0); | ||||
| @@ -652,7 +653,7 @@ enum ImGuiInputTextFlags_ | ||||
|     ImGuiInputTextFlags_Password            = 1 << 15,  // Password mode, display all characters as '*' | ||||
|     ImGuiInputTextFlags_NoUndoRedo          = 1 << 16,  // Disable undo/redo. Note that input text owns the text data while active, if you want to provide your own undo/redo stack you need e.g. to call ClearActiveID(). | ||||
|     ImGuiInputTextFlags_CharsScientific     = 1 << 17,  // Allow 0123456789.+-*/eE (Scientific notation input) | ||||
|     ImGuiInputTextFlags_CallbackResize      = 1 << 18,  // Allow buffer capacity resize + notify when the string wants to be resized (for string types which hold a cache of their Size) | ||||
|     ImGuiInputTextFlags_CallbackResize      = 1 << 18,  // Allow buffer capacity resize + notify when the string wants to be resized (for string types which hold a cache of their Size) (see misc/stl/imgui_stl.h for an example of using this) | ||||
|     // [Internal] | ||||
|     ImGuiInputTextFlags_Multiline           = 1 << 20   // For internal use by InputTextMultiline() | ||||
| }; | ||||
|   | ||||
| @@ -353,7 +353,7 @@ void ImGui::ShowDemoWindow(bool* p_open) | ||||
|                 static char str0[128] = "Hello, world!"; | ||||
|                 static int i0 = 123; | ||||
|                 ImGui::InputText("input text", str0, IM_ARRAYSIZE(str0)); | ||||
|                 ImGui::SameLine(); ShowHelpMarker("Hold SHIFT or use mouse to select text.\n" "CTRL+Left/Right to word jump.\n" "CTRL+A or double-click to select all.\n" "CTRL+X,CTRL+C,CTRL+V clipboard.\n" "CTRL+Z,CTRL+Y undo/redo.\n" "ESCAPE to revert.\n"); | ||||
|                 ImGui::SameLine(); ShowHelpMarker("USER:\nHold SHIFT or use mouse to select text.\n" "CTRL+Left/Right to word jump.\n" "CTRL+A or double-click to select all.\n" "CTRL+X,CTRL+C,CTRL+V clipboard.\n" "CTRL+Z,CTRL+Y undo/redo.\n" "ESCAPE to revert.\n\nPROGRAMMER:\nYou can use the ImGuiInputTextFlags_CallbackResize facility if you need to wire InputText() to a dynamic string type. See misc/stl/imgui_stl.h for an example (this is not demonstrated in imgui_demo.cpp)."); | ||||
|  | ||||
|                 ImGui::InputInt("input int", &i0); | ||||
|                 ImGui::SameLine(); ShowHelpMarker("You can apply arithmetic operators +,*,/ on numerical values.\n  e.g. [ 100 ], input \'*2\', result becomes [ 200 ]\nUse +- to subtract.\n"); | ||||
| @@ -800,10 +800,10 @@ void ImGui::ShowDemoWindow(bool* p_open) | ||||
|                 "label:\n" | ||||
|                 "\tlock cmpxchg8b eax\n"; | ||||
|  | ||||
|             ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0,0)); | ||||
|             ShowHelpMarker("You can use the ImGuiInputTextFlags_CallbackResize facility if you need to wire InputTextMultiline() to a dynamic string type. See misc/stl/imgui_stl.h for an example. (This is not demonstrated in imgui_demo.cpp)"); | ||||
|             ImGui::Checkbox("Read-only", &read_only); | ||||
|             ImGui::PopStyleVar(); | ||||
|             ImGui::InputTextMultiline("##source", text, IM_ARRAYSIZE(text), ImVec2(-1.0f, ImGui::GetTextLineHeight() * 16), ImGuiInputTextFlags_AllowTabInput | (read_only ? ImGuiInputTextFlags_ReadOnly : 0)); | ||||
|             ImGuiInputTextFlags flags = ImGuiInputTextFlags_AllowTabInput | (read_only ? ImGuiInputTextFlags_ReadOnly : 0); | ||||
|             ImGui::InputTextMultiline("##source", text, IM_ARRAYSIZE(text), ImVec2(-1.0f, ImGui::GetTextLineHeight() * 16), flags); | ||||
|             ImGui::TreePop(); | ||||
|         } | ||||
|  | ||||
|   | ||||
							
								
								
									
										55
									
								
								misc/stl/imgui_stl.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								misc/stl/imgui_stl.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| // imgui_stl.cpp | ||||
| // Wrappers for STL types (std::string, etc.) | ||||
| // This is also an example of how you may wrap your own similar types. | ||||
|  | ||||
| #include "imgui.h" | ||||
| #include "imgui_stl.h" | ||||
|  | ||||
| struct InputTextCallback_UserData | ||||
| { | ||||
|     std::string*            Str; | ||||
|     ImGuiInputTextCallback  ChainCallback; | ||||
|     void*                   ChainCallbackUserData; | ||||
| }; | ||||
|  | ||||
| static int InputTextCallback(ImGuiInputTextCallbackData* data) | ||||
| { | ||||
|     InputTextCallback_UserData* user_data = (InputTextCallback_UserData*)data->UserData; | ||||
|     if (data->EventFlag == ImGuiInputTextFlags_CallbackResize) | ||||
|     { | ||||
|         // Resize string callback | ||||
|         std::string* str = user_data->Str; | ||||
|         IM_ASSERT(data->Buf == str->c_str()); | ||||
|         str->resize(data->BufTextLen); | ||||
|         data->Buf = (char*)str->c_str(); | ||||
|     } | ||||
|     else if (user_data->ChainCallback) | ||||
|     { | ||||
|         // Forward to user callback, if any | ||||
|         data->UserData = user_data->ChainCallbackUserData; | ||||
|         return user_data->ChainCallback(data); | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| bool ImGui::InputText(const char* label, std::string* str, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) | ||||
| { | ||||
|     flags |= ImGuiInputTextFlags_CallbackResize; | ||||
|  | ||||
|     InputTextCallback_UserData cb_user_data; | ||||
|     cb_user_data.Str = str; | ||||
|     cb_user_data.ChainCallback = callback; | ||||
|     cb_user_data.ChainCallbackUserData = user_data; | ||||
|     return InputText(label, (char*)str->c_str(), str->capacity() + 1, flags, InputTextCallback, &cb_user_data); | ||||
| } | ||||
|  | ||||
| bool ImGui::InputTextMultiline(const char* label, std::string* str, const ImVec2& size, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) | ||||
| { | ||||
|     flags |= ImGuiInputTextFlags_CallbackResize; | ||||
|  | ||||
|     InputTextCallback_UserData cb_user_data; | ||||
|     cb_user_data.Str = str; | ||||
|     cb_user_data.ChainCallback = callback; | ||||
|     cb_user_data.ChainCallbackUserData = user_data; | ||||
|     return InputTextMultiline(label, (char*)str->c_str(), str->capacity() + 1, size, flags, InputTextCallback, &cb_user_data); | ||||
| } | ||||
							
								
								
									
										18
									
								
								misc/stl/imgui_stl.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								misc/stl/imgui_stl.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| // imgui_stl.h | ||||
| // Wrappers for STL types (std::string, etc.) | ||||
| // This is also an example of how you may wrap your own similar types. | ||||
|  | ||||
| // Changelog: | ||||
| // - v0.10: Initial version. Added InputText() / InputTextMultiline() calls with std::string | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include <string> | ||||
|  | ||||
| namespace ImGui | ||||
| { | ||||
|     // ImGui::InputText() with std::string | ||||
|     // Because text input needs dynamic resizing, we need to setup a callback to grow the capacity | ||||
|     IMGUI_API bool  InputText(const char* label, std::string* str, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); | ||||
|     IMGUI_API bool  InputTextMultiline(const char* label, std::string* str, const ImVec2& size = ImVec2(0, 0), ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user