2
0
Эх сурвалжийг харах

Added GetContentRegionMax() supporting columns. Some bug fixes with using columns.

omar 10 жил өмнө
parent
commit
6c192f3221
2 өөрчлөгдсөн 49 нэмэгдсэн , 10 устгасан
  1. 47 9
      imgui.cpp
  2. 2 1
      imgui.h

+ 47 - 9
imgui.cpp

@@ -901,7 +901,7 @@ void ImGuiTextFilter::Draw(const char* label, float width)
     if (width < 0.0f)
     {
         ImVec2 label_size = ImGui::CalcTextSize(label, NULL);
-        width = ImMax(window->Pos.x + ImGui::GetWindowContentRegionMax().x - window->DC.CursorPos.x - (label_size.x + GImGui.Style.ItemSpacing.x*4), 10.0f);
+        width = ImMax(window->Pos.x + ImGui::GetContentRegionMax().x - window->DC.CursorPos.x - (label_size.x + GImGui.Style.ItemSpacing.x*4), 10.0f);
     }
     ImGui::PushItemWidth(width);
     ImGui::InputText(label, InputBuf, IM_ARRAYSIZE(InputBuf));
@@ -1662,7 +1662,7 @@ static float CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x)
 
     ImGuiWindow* window = GetCurrentWindow();
 	if (wrap_pos_x == 0.0f)
-		wrap_pos_x = GetWindowContentRegionMax().x;
+		wrap_pos_x = GetContentRegionMax().x;
     if (wrap_pos_x > 0.0f)
         wrap_pos_x += window->Pos.x; // wrap_pos_x is provided is window local space
     
@@ -2618,13 +2618,31 @@ void SetWindowSize(const ImVec2& size)
         window->AutoFitFrames = 3;
 }
 
+ImVec2 GetContentRegionMax()
+{
+	ImGuiWindow* window = GetCurrentWindow();
+
+	ImVec2 m = window->Size - window->WindowPadding();
+	if (window->DC.ColumnsCount != 1)
+	{
+		m.x = GetColumnOffset(window->DC.ColumnCurrent + 1);
+		m.x -= GImGui.Style.WindowPadding.x;
+	}
+	else
+	{
+		if (window->ScrollbarY)
+			m.x -= GImGui.Style.ScrollBarWidth;
+	}
+
+	return m;
+}
+
 ImVec2 GetWindowContentRegionMin()
 {
     ImGuiWindow* window = GetCurrentWindow();
     return ImVec2(0, window->TitleBarHeight()) + window->WindowPadding();
 }
 
-// FIXME: Provide an equivalent that gives the min/max region considering columns.
 ImVec2 GetWindowContentRegionMax()
 {
     ImGuiWindow* window = GetCurrentWindow();
@@ -3167,7 +3185,7 @@ bool CollapsingHeader(const char* label, const char* str_id, const bool display_
     const ImVec2 window_padding = window->WindowPadding();
     const ImVec2 text_size = CalcTextSize(label);
     const ImVec2 pos_min = window->DC.CursorPos;
-    const ImVec2 pos_max = window->Pos + GetWindowContentRegionMax();
+    const ImVec2 pos_max = window->Pos + GetContentRegionMax();
     ImGuiAabb bb = ImGuiAabb(pos_min, ImVec2(pos_max.x, pos_min.y + text_size.y));
     if (display_frame)
     {
@@ -6575,6 +6593,8 @@ void ShowTestWindow(bool* open)
 
     if (ImGui::CollapsingHeader("Columns"))
     {
+		ImGui::Text("Note: columns are not well supported by all corners of the API so far. Please fill a report on GitHub if you run into issues.");
+
         ImGui::Columns(4, "data", true);
         ImGui::Text("ID"); ImGui::NextColumn();
         ImGui::Text("Name"); ImGui::NextColumn();
@@ -6590,7 +6610,7 @@ void ShowTestWindow(bool* open)
         ImGui::Text("0001"); ImGui::NextColumn();
         ImGui::Text("Stephanie"); ImGui::NextColumn();
         ImGui::Text("/path/stephanie"); ImGui::NextColumn();
-        ImGui::Text("...."); ImGui::NextColumn();
+		ImGui::Text("line 1\nline 2"); ImGui::NextColumn(); // two lines!
 
         ImGui::Text("0002"); ImGui::NextColumn();
         ImGui::Text("C64"); ImGui::NextColumn();
@@ -6601,9 +6621,12 @@ void ShowTestWindow(bool* open)
         ImGui::Separator();
 
         ImGui::Columns(3, "mixed");
-        ImGui::Text("Hello"); ImGui::NextColumn();
-        ImGui::Text("World"); ImGui::NextColumn();
-        ImGui::Text("Hmm..."); ImGui::NextColumn();
+
+		// NB: it is may be more efficient to fill all contents of a column and then go to the next one.
+		// However for the user it is more likely you want to fill all columns before proceeding to the next item, so this example does that.
+		ImGui::Text("Hello"); ImGui::NextColumn();
+		ImGui::Text("World"); ImGui::NextColumn();
+		ImGui::Text("Hmm..."); ImGui::NextColumn();
 
         ImGui::Button("Banana"); ImGui::NextColumn();
         ImGui::Button("Apple"); ImGui::NextColumn();
@@ -6613,7 +6636,13 @@ void ShowTestWindow(bool* open)
         ImGui::RadioButton("radio a", &e, 0); ImGui::NextColumn();
         ImGui::RadioButton("radio b", &e, 1); ImGui::NextColumn();
         ImGui::RadioButton("radio c", &e, 2); ImGui::NextColumn();
-        ImGui::Columns(1);
+
+		// FIXME: Exhibit bug of CurrentLineHeight bleeding between columns
+		//if (ImGui::CollapsingHeader("Category A")) ImGui::Text("Blah blah blah"); ImGui::NextColumn();
+		//if (ImGui::CollapsingHeader("Category B")) ImGui::Text("Blah blah blah"); ImGui::NextColumn();
+		//if (ImGui::CollapsingHeader("Category C")) ImGui::Text("Blah blah blah"); ImGui::NextColumn();
+
+		ImGui::Columns(1);
 
         ImGui::Separator();
 
@@ -6624,6 +6653,15 @@ void ShowTestWindow(bool* open)
         ImGui::InputFloat("blue", &bar, 0.05f, 0, 3); ImGui::NextColumn();
         ImGui::Columns(1);
 
+		ImGui::Separator();
+		
+		// FIXME: Exhibit bug of CurrentLineHeight bleeding between columns (notice how dragging the columns far left or far right gets your different vertical alignment on the other side)
+		ImGui::Columns(2, "word wrapping");
+		ImGui::TextWrapped("The quick brown fox jumps over the lazy dog.");
+		ImGui::NextColumn();
+		ImGui::TextWrapped("The quick brown fox jumps over the lazy dog.");
+		ImGui::Columns(1);
+
         ImGui::Separator();
 
         if (ImGui::TreeNode("Inside a tree.."))

+ 2 - 1
imgui.h

@@ -149,7 +149,8 @@ namespace ImGui
     void		SetWindowSize(const ImVec2& size);                                  // set to ImVec2(0,0) to force an auto-fit
     ImVec2      GetWindowPos();                                                     // you should rarely need/care about the window position, but it can be useful if you want to use your own drawing.
     void        SetWindowPos(const ImVec2& pos);                                    // set current window pos.
-    ImVec2      GetWindowContentRegionMin();
+	ImVec2      GetContentRegionMax();                                              // window or current column boundaries
+    ImVec2      GetWindowContentRegionMin();                                        // window boundaries
     ImVec2      GetWindowContentRegionMax();
     ImDrawList* GetWindowDrawList();                                                // get rendering command-list if you want to append your own draw primitives.
     ImFont      GetWindowFont();