Răsfoiți Sursa

Split RenderText into RenderTextWrapped for internal uses

Different text functions with different features (usually orthogonal set
of features)
ocornut 10 ani în urmă
părinte
comite
cc340e0b81
1 a modificat fișierele cu 34 adăugiri și 12 ștergeri
  1. 34 12
      imgui.cpp

+ 34 - 12
imgui.cpp

@@ -268,6 +268,7 @@
  - columns: user specify columns size
  - combo: turn child handling code into pop up helper
  - combo: layer conflict with other child windows
+ - combo: contents should extends to fit label if combo widget is small
  - list selection, concept of a selectable "block" (that can be multiple widgets)
  ! menubar, menus
  - tabs
@@ -403,7 +404,8 @@ struct ImGuiAabb;
 static bool         ButtonBehaviour(const ImGuiAabb& bb, const ImGuiID& id, bool* out_hovered, bool* out_held, bool allow_key_modifiers, bool repeat = false);
 static void         LogText(const ImVec2& ref_pos, const char* text, const char* text_end = NULL);
 
-static void         RenderText(ImVec2 pos, const char* text, const char* text_end = NULL, bool hide_text_after_hash = true, float wrap_width = 0.0f);
+static void         RenderText(ImVec2 pos, const char* text, const char* text_end = NULL, bool hide_text_after_hash = true);
+static void         RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end, float wrap_width);
 static void         RenderTextClipped(ImVec2 pos, const char* text, const char* text_end, const ImVec2* text_size, const ImGuiAabb& clip_aabb);
 static void         RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border = true, float rounding = 0.0f);
 static void         RenderCollapseTriangle(ImVec2 p_min, bool opened, float scale = 1.0f, bool shadow = false);
@@ -2015,6 +2017,7 @@ void ImGui::LogText(const char* fmt, ...)
 }
 
 // Internal version that takes a position to decide on newline placement and pad items according to their depth.
+// We split text into individual lines to add current tree level padding
 static void LogText(const ImVec2& ref_pos, const char* text, const char* text_end)
 {
     ImGuiState& g = *GImGui;
@@ -2079,9 +2082,9 @@ static float CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x)
     return wrap_width;
 }
 
-// Internal ImGui function to render text (called from ImGui::Text(), ImGui::TextUnformatted(), etc.)
-// RenderText() calls ImDrawList::AddText() calls ImBitmapFont::RenderText()
-static void RenderText(ImVec2 pos, const char* text, const char* text_end, bool hide_text_after_hash, float wrap_width)
+// Internal ImGui functions to render text
+// RenderText***() functions calls ImDrawList::AddText() calls ImBitmapFont::RenderText()
+static void RenderText(ImVec2 pos, const char* text, const char* text_end, bool hide_text_after_hash)
 {
     ImGuiState& g = *GImGui;
     ImGuiWindow* window = GetCurrentWindow();
@@ -2103,15 +2106,35 @@ static void RenderText(ImVec2 pos, const char* text, const char* text_end, bool
     if (text_len > 0)
     {
         // Render
-        window->DrawList->AddText(window->Font(), window->FontSize(), pos, window->Color(ImGuiCol_Text), text, text_display_end, wrap_width);
+        window->DrawList->AddText(window->Font(), window->FontSize(), pos, window->Color(ImGuiCol_Text), text, text_display_end);
 
-        // Log as text. We split text into individual lines to add current tree level padding
+        // Log as text
         if (g.LogEnabled)
             LogText(pos, text, text_display_end);
     }
 }
 
-static void RenderTextClipped(ImVec2 pos, const char* text, const char* text_end, const ImVec2* text_size_arg, const ImGuiAabb& clip_rect)
+static void RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end, float wrap_width)
+{
+    ImGuiState& g = *GImGui;
+    ImGuiWindow* window = GetCurrentWindow();
+
+    if (!text_end)
+        text_end = text + strlen(text); // FIXME-OPT
+
+    const int text_len = (int)(text_end - text);
+    if (text_len > 0)
+    {
+        // Render
+        window->DrawList->AddText(window->Font(), window->FontSize(), pos, window->Color(ImGuiCol_Text), text, text_end, wrap_width);
+
+        // Log as text
+        if (g.LogEnabled)
+            LogText(pos, text, text_end);
+    }
+}
+
+static void RenderTextClipped(ImVec2 pos, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImGuiAabb& clip_rect)
 {
     ImGuiState& g = *GImGui;
     ImGuiWindow* window = GetCurrentWindow();
@@ -2121,7 +2144,7 @@ static void RenderTextClipped(ImVec2 pos, const char* text, const char* text_end
     const int text_len = (int)(text_display_end - text);
     if (text_len > 0)
     {
-        const ImVec2 text_size = text_size_arg ? *text_size_arg : ImGui::CalcTextSize(text, text_display_end, false, 0.0f);
+        const ImVec2 text_size = text_size_if_known ? *text_size_if_known : ImGui::CalcTextSize(text, text_display_end, false, 0.0f);
 
         // FIMXE-OPT: Perform software clipping at this point instead of pushing a clipping rectangle
         const bool need_clipping = clip_rect.GetWidth() < text_size.x || clip_rect.GetHeight() < text_size.y;
@@ -2134,7 +2157,7 @@ static void RenderTextClipped(ImVec2 pos, const char* text, const char* text_end
         if (need_clipping)
             PopClipRect();
 
-        // Log as text. We split text into individual lines to add current tree level padding
+        // Log as text
         if (g.LogEnabled)
             LogText(pos, text, text_display_end);
     }
@@ -3619,9 +3642,8 @@ void ImGui::TextUnformatted(const char* text, const char* text_end)
         if (!ItemAdd(bb, NULL))
             return;
 
-        // Render
-        // We don't hide text after ## in this end-user function.
-        RenderText(bb.Min, text_begin, text_end, false, wrap_width);
+        // Render (we don't hide text after ## in this end-user function)
+        RenderTextWrapped(bb.Min, text_begin, text_end, wrap_width);
     }
 }