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). |  - 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) |  - IsItemHovered(): Added ImGuiHoveredFlags_AllowWhenDisabled flag to query hovered status on disabled items. (#1940, #211) | ||||||
|  - Selectable: Added ImGuiSelectableFlags_Disabled flag in the public API. (#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 IMGUI_VERSION_NUM for easy compile-time testing. (#2025) | ||||||
|  - Misc: Added ImGuiMouseCursor_Hand cursor enum + corresponding software cursor. (#1913, 1914) [@aiekick, @ocornut]  |  - 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. |  - 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  | //   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. | //   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. | // - 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) | 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(); |     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); |     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 |     // 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          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          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); |     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_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_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_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] |     // [Internal] | ||||||
|     ImGuiInputTextFlags_Multiline           = 1 << 20   // For internal use by InputTextMultiline() |     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 char str0[128] = "Hello, world!"; | ||||||
|                 static int i0 = 123; |                 static int i0 = 123; | ||||||
|                 ImGui::InputText("input text", str0, IM_ARRAYSIZE(str0)); |                 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::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"); |                 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" |                 "label:\n" | ||||||
|                 "\tlock cmpxchg8b eax\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::Checkbox("Read-only", &read_only); | ||||||
|             ImGui::PopStyleVar(); |             ImGuiInputTextFlags flags = ImGuiInputTextFlags_AllowTabInput | (read_only ? ImGuiInputTextFlags_ReadOnly : 0); | ||||||
|             ImGui::InputTextMultiline("##source", text, IM_ARRAYSIZE(text), ImVec2(-1.0f, ImGui::GetTextLineHeight() * 16), ImGuiInputTextFlags_AllowTabInput | (read_only ? ImGuiInputTextFlags_ReadOnly : 0)); |             ImGui::InputTextMultiline("##source", text, IM_ARRAYSIZE(text), ImVec2(-1.0f, ImGui::GetTextLineHeight() * 16), flags); | ||||||
|             ImGui::TreePop(); |             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