| // dear imgui: wrappers for C++ standard library (STL) types (std::string, etc.) | |
| // This is also an example of how you may wrap your own similar types. | |
| // TL;DR; this is using the ImGuiInputTextFlags_CallbackResize facility, | |
| // which also demonstrated in 'Dear ImGui Demo->Widgets->Text Input->Resize Callback'. | |
| // Changelog: | |
| // - v0.10: Initial version. Added InputText() / InputTextMultiline() calls with std::string | |
| // Usage: | |
| // { | |
| // #include "misc/cpp/imgui_stdlib.h" | |
| // #include "misc/cpp/imgui_stdlib.cpp" // <-- If you want to include implementation without messing with your project/build. | |
| // [...] | |
| // std::string my_string; | |
| // ImGui::InputText("my string", &my_string); | |
| // } | |
| // See more C++ related extension (fmt, RAII, syntactic sugar) on Wiki: | |
| // https://github.com/ocornut/imgui/wiki/Useful-Extensions#cness | |
| #include "imgui.h" | |
| #ifndef IMGUI_DISABLE | |
| #include "imgui_stdlib.h" | |
| // Clang warnings with -Weverything | |
| #if defined(__clang__) | |
| #pragma clang diagnostic push | |
| #pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness | |
| #endif | |
| 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 | |
| // If for some reason we refuse the new length (BufTextLen) and/or capacity (BufSize) we need to set them back to what we want. | |
| 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) | |
| { | |
| IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); | |
| 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) | |
| { | |
| IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); | |
| 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); | |
| } | |
| bool ImGui::InputTextWithHint(const char* label, const char* hint, std::string* str, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) | |
| { | |
| IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); | |
| 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 InputTextWithHint(label, hint, (char*)str->c_str(), str->capacity() + 1, flags, InputTextCallback, &cb_user_data); | |
| } | |
| #if defined(__clang__) | |
| #pragma clang diagnostic pop | |
| #endif | |
| #endif // #ifndef IMGUI_DISABLE |