imgui

FORK: Dear ImGui: Bloat-free Graphical User interface for C++ with minimal dependencies
git clone https://git.neptards.moe/neptards/imgui.git
Log | Files | Refs

imgui_stdlib.cpp (3139B)


      1 // dear imgui: wrappers for C++ standard library (STL) types (std::string, etc.)
      2 // This is also an example of how you may wrap your own similar types.
      3 
      4 // Compatibility:
      5 // - std::string support is only guaranteed to work from C++11.
      6 //   If you try to use it pre-C++11, please share your findings (w/ info about compiler/architecture)
      7 
      8 // Changelog:
      9 // - v0.10: Initial version. Added InputText() / InputTextMultiline() calls with std::string
     10 
     11 #include "imgui.h"
     12 #include "imgui_stdlib.h"
     13 
     14 struct InputTextCallback_UserData
     15 {
     16     std::string*            Str;
     17     ImGuiInputTextCallback  ChainCallback;
     18     void*                   ChainCallbackUserData;
     19 };
     20 
     21 static int InputTextCallback(ImGuiInputTextCallbackData* data)
     22 {
     23     InputTextCallback_UserData* user_data = (InputTextCallback_UserData*)data->UserData;
     24     if (data->EventFlag == ImGuiInputTextFlags_CallbackResize)
     25     {
     26         // Resize string callback
     27         // If for some reason we refuse the new length (BufTextLen) and/or capacity (BufSize) we need to set them back to what we want.
     28         std::string* str = user_data->Str;
     29         IM_ASSERT(data->Buf == str->c_str());
     30         str->resize(data->BufTextLen);
     31         data->Buf = (char*)str->c_str();
     32     }
     33     else if (user_data->ChainCallback)
     34     {
     35         // Forward to user callback, if any
     36         data->UserData = user_data->ChainCallbackUserData;
     37         return user_data->ChainCallback(data);
     38     }
     39     return 0;
     40 }
     41 
     42 bool ImGui::InputText(const char* label, std::string* str, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data)
     43 {
     44     IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0);
     45     flags |= ImGuiInputTextFlags_CallbackResize;
     46 
     47     InputTextCallback_UserData cb_user_data;
     48     cb_user_data.Str = str;
     49     cb_user_data.ChainCallback = callback;
     50     cb_user_data.ChainCallbackUserData = user_data;
     51     return InputText(label, (char*)str->c_str(), str->capacity() + 1, flags, InputTextCallback, &cb_user_data);
     52 }
     53 
     54 bool ImGui::InputTextMultiline(const char* label, std::string* str, const ImVec2& size, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data)
     55 {
     56     IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0);
     57     flags |= ImGuiInputTextFlags_CallbackResize;
     58 
     59     InputTextCallback_UserData cb_user_data;
     60     cb_user_data.Str = str;
     61     cb_user_data.ChainCallback = callback;
     62     cb_user_data.ChainCallbackUserData = user_data;
     63     return InputTextMultiline(label, (char*)str->c_str(), str->capacity() + 1, size, flags, InputTextCallback, &cb_user_data);
     64 }
     65 
     66 bool ImGui::InputTextWithHint(const char* label, const char* hint, std::string* str, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data)
     67 {
     68     IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0);
     69     flags |= ImGuiInputTextFlags_CallbackResize;
     70 
     71     InputTextCallback_UserData cb_user_data;
     72     cb_user_data.Str = str;
     73     cb_user_data.ChainCallback = callback;
     74     cb_user_data.ChainCallbackUserData = user_data;
     75     return InputTextWithHint(label, hint, (char*)str->c_str(), str->capacity() + 1, flags, InputTextCallback, &cb_user_data);
     76 }