Added GetContentRegionMax() supporting columns. Some bug fixes with using columns.
diff --git a/imgui.cpp b/imgui.cpp
index 5018e20..a029a29 100644
--- a/imgui.cpp
+++ b/imgui.cpp
@@ -901,7 +901,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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.."))
diff --git a/imgui.h b/imgui.h
index 05b5d3f..3434645 100644
--- a/imgui.h
+++ b/imgui.h
@@ -149,7 +149,8 @@
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();