|
@@ -2233,8 +2233,8 @@ static void SetCursorPosYAndSetupDummyPrevLine(float pos_y, float line_height)
|
|
ImGuiWindow* window = ImGui::GetCurrentWindow();
|
|
ImGuiWindow* window = ImGui::GetCurrentWindow();
|
|
window->DC.CursorPosPrevLine.y = window->DC.CursorPos.y - line_height; // Setting those fields so that SetScrollHereY() can properly function after the end of our clipper usage.
|
|
window->DC.CursorPosPrevLine.y = window->DC.CursorPos.y - line_height; // Setting those fields so that SetScrollHereY() can properly function after the end of our clipper usage.
|
|
window->DC.PrevLineSize.y = (line_height - GImGui->Style.ItemSpacing.y); // If we end up needing more accurate data (to e.g. use SameLine) we may as well make the clipper have a fourth step to let user process and display the last item in their list.
|
|
window->DC.PrevLineSize.y = (line_height - GImGui->Style.ItemSpacing.y); // If we end up needing more accurate data (to e.g. use SameLine) we may as well make the clipper have a fourth step to let user process and display the last item in their list.
|
|
- if (window->DC.ColumnsSet)
|
|
|
|
- window->DC.ColumnsSet->LineMinY = window->DC.CursorPos.y; // Setting this so that cell Y position are set properly
|
|
|
|
|
|
+ if (window->DC.CurrentColumns)
|
|
|
|
+ window->DC.CurrentColumns->LineMinY = window->DC.CursorPos.y; // Setting this so that cell Y position are set properly
|
|
}
|
|
}
|
|
|
|
|
|
// Use case A: Begin() called from constructor with items_height<0, then called again from Sync() in StepNo 1
|
|
// Use case A: Begin() called from constructor with items_height<0, then called again from Sync() in StepNo 1
|
|
@@ -2597,7 +2597,7 @@ ImGuiWindow::~ImGuiWindow()
|
|
IM_ASSERT(DrawList == &DrawListInst);
|
|
IM_ASSERT(DrawList == &DrawListInst);
|
|
IM_DELETE(Name);
|
|
IM_DELETE(Name);
|
|
for (int i = 0; i != ColumnsStorage.Size; i++)
|
|
for (int i = 0; i != ColumnsStorage.Size; i++)
|
|
- ColumnsStorage[i].~ImGuiColumnsSet();
|
|
|
|
|
|
+ ColumnsStorage[i].~ImGuiColumns();
|
|
}
|
|
}
|
|
|
|
|
|
ImGuiID ImGuiWindow::GetID(const char* str, const char* str_end)
|
|
ImGuiID ImGuiWindow::GetID(const char* str, const char* str_end)
|
|
@@ -5443,7 +5443,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
window->DC.ItemFlagsStack.resize(0);
|
|
window->DC.ItemFlagsStack.resize(0);
|
|
window->DC.ItemWidthStack.resize(0);
|
|
window->DC.ItemWidthStack.resize(0);
|
|
window->DC.TextWrapPosStack.resize(0);
|
|
window->DC.TextWrapPosStack.resize(0);
|
|
- window->DC.ColumnsSet = NULL;
|
|
|
|
|
|
+ window->DC.CurrentColumns = NULL;
|
|
window->DC.TreeDepth = 0;
|
|
window->DC.TreeDepth = 0;
|
|
window->DC.TreeDepthMayJumpToParentOnPop = 0x00;
|
|
window->DC.TreeDepthMayJumpToParentOnPop = 0x00;
|
|
window->DC.StateStorage = &window->StateStorage;
|
|
window->DC.StateStorage = &window->StateStorage;
|
|
@@ -5627,7 +5627,7 @@ void ImGui::End()
|
|
|
|
|
|
ImGuiWindow* window = g.CurrentWindow;
|
|
ImGuiWindow* window = g.CurrentWindow;
|
|
|
|
|
|
- if (window->DC.ColumnsSet != NULL)
|
|
|
|
|
|
+ if (window->DC.CurrentColumns != NULL)
|
|
EndColumns();
|
|
EndColumns();
|
|
PopClipRect(); // Inner window clip rectangle
|
|
PopClipRect(); // Inner window clip rectangle
|
|
|
|
|
|
@@ -6348,8 +6348,8 @@ ImVec2 ImGui::GetContentRegionMax()
|
|
{
|
|
{
|
|
ImGuiWindow* window = GetCurrentWindowRead();
|
|
ImGuiWindow* window = GetCurrentWindowRead();
|
|
ImVec2 mx = window->ContentsRegionRect.Max - window->Pos;
|
|
ImVec2 mx = window->ContentsRegionRect.Max - window->Pos;
|
|
- if (window->DC.ColumnsSet)
|
|
|
|
- mx.x = GetColumnOffset(window->DC.ColumnsSet->Current + 1) - window->WindowPadding.x;
|
|
|
|
|
|
+ if (window->DC.CurrentColumns)
|
|
|
|
+ mx.x = GetColumnOffset(window->DC.CurrentColumns->Current + 1) - window->WindowPadding.x;
|
|
return mx;
|
|
return mx;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -8275,11 +8275,11 @@ void ImGui::NavUpdateWindowingList()
|
|
void ImGui::NextColumn()
|
|
void ImGui::NextColumn()
|
|
{
|
|
{
|
|
ImGuiWindow* window = GetCurrentWindow();
|
|
ImGuiWindow* window = GetCurrentWindow();
|
|
- if (window->SkipItems || window->DC.ColumnsSet == NULL)
|
|
|
|
|
|
+ if (window->SkipItems || window->DC.CurrentColumns == NULL)
|
|
return;
|
|
return;
|
|
|
|
|
|
ImGuiContext& g = *GImGui;
|
|
ImGuiContext& g = *GImGui;
|
|
- ImGuiColumnsSet* columns = window->DC.ColumnsSet;
|
|
|
|
|
|
+ ImGuiColumns* columns = window->DC.CurrentColumns;
|
|
|
|
|
|
if (columns->Count == 1)
|
|
if (columns->Count == 1)
|
|
{
|
|
{
|
|
@@ -8318,28 +8318,28 @@ void ImGui::NextColumn()
|
|
int ImGui::GetColumnIndex()
|
|
int ImGui::GetColumnIndex()
|
|
{
|
|
{
|
|
ImGuiWindow* window = GetCurrentWindowRead();
|
|
ImGuiWindow* window = GetCurrentWindowRead();
|
|
- return window->DC.ColumnsSet ? window->DC.ColumnsSet->Current : 0;
|
|
|
|
|
|
+ return window->DC.CurrentColumns ? window->DC.CurrentColumns->Current : 0;
|
|
}
|
|
}
|
|
|
|
|
|
int ImGui::GetColumnsCount()
|
|
int ImGui::GetColumnsCount()
|
|
{
|
|
{
|
|
ImGuiWindow* window = GetCurrentWindowRead();
|
|
ImGuiWindow* window = GetCurrentWindowRead();
|
|
- return window->DC.ColumnsSet ? window->DC.ColumnsSet->Count : 1;
|
|
|
|
|
|
+ return window->DC.CurrentColumns ? window->DC.CurrentColumns->Count : 1;
|
|
}
|
|
}
|
|
|
|
|
|
-static float OffsetNormToPixels(const ImGuiColumnsSet* columns, float offset_norm)
|
|
|
|
|
|
+static float OffsetNormToPixels(const ImGuiColumns* columns, float offset_norm)
|
|
{
|
|
{
|
|
return offset_norm * (columns->MaxX - columns->MinX);
|
|
return offset_norm * (columns->MaxX - columns->MinX);
|
|
}
|
|
}
|
|
|
|
|
|
-static float PixelsToOffsetNorm(const ImGuiColumnsSet* columns, float offset)
|
|
|
|
|
|
+static float PixelsToOffsetNorm(const ImGuiColumns* columns, float offset)
|
|
{
|
|
{
|
|
return offset / (columns->MaxX - columns->MinX);
|
|
return offset / (columns->MaxX - columns->MinX);
|
|
}
|
|
}
|
|
|
|
|
|
static inline float GetColumnsRectHalfWidth() { return 4.0f; }
|
|
static inline float GetColumnsRectHalfWidth() { return 4.0f; }
|
|
|
|
|
|
-static float GetDraggedColumnOffset(ImGuiColumnsSet* columns, int column_index)
|
|
|
|
|
|
+static float GetDraggedColumnOffset(ImGuiColumns* columns, int column_index)
|
|
{
|
|
{
|
|
// Active (dragged) column always follow mouse. The reason we need this is that dragging a column to the right edge of an auto-resizing
|
|
// Active (dragged) column always follow mouse. The reason we need this is that dragging a column to the right edge of an auto-resizing
|
|
// window creates a feedback loop because we store normalized positions. So while dragging we enforce absolute positioning.
|
|
// window creates a feedback loop because we store normalized positions. So while dragging we enforce absolute positioning.
|
|
@@ -8359,7 +8359,7 @@ static float GetDraggedColumnOffset(ImGuiColumnsSet* columns, int column_index)
|
|
float ImGui::GetColumnOffset(int column_index)
|
|
float ImGui::GetColumnOffset(int column_index)
|
|
{
|
|
{
|
|
ImGuiWindow* window = GetCurrentWindowRead();
|
|
ImGuiWindow* window = GetCurrentWindowRead();
|
|
- ImGuiColumnsSet* columns = window->DC.ColumnsSet;
|
|
|
|
|
|
+ ImGuiColumns* columns = window->DC.CurrentColumns;
|
|
IM_ASSERT(columns != NULL);
|
|
IM_ASSERT(columns != NULL);
|
|
|
|
|
|
if (column_index < 0)
|
|
if (column_index < 0)
|
|
@@ -8371,7 +8371,7 @@ float ImGui::GetColumnOffset(int column_index)
|
|
return x_offset;
|
|
return x_offset;
|
|
}
|
|
}
|
|
|
|
|
|
-static float GetColumnWidthEx(ImGuiColumnsSet* columns, int column_index, bool before_resize = false)
|
|
|
|
|
|
+static float GetColumnWidthEx(ImGuiColumns* columns, int column_index, bool before_resize = false)
|
|
{
|
|
{
|
|
if (column_index < 0)
|
|
if (column_index < 0)
|
|
column_index = columns->Current;
|
|
column_index = columns->Current;
|
|
@@ -8387,7 +8387,7 @@ static float GetColumnWidthEx(ImGuiColumnsSet* columns, int column_index, bool b
|
|
float ImGui::GetColumnWidth(int column_index)
|
|
float ImGui::GetColumnWidth(int column_index)
|
|
{
|
|
{
|
|
ImGuiWindow* window = GetCurrentWindowRead();
|
|
ImGuiWindow* window = GetCurrentWindowRead();
|
|
- ImGuiColumnsSet* columns = window->DC.ColumnsSet;
|
|
|
|
|
|
+ ImGuiColumns* columns = window->DC.CurrentColumns;
|
|
IM_ASSERT(columns != NULL);
|
|
IM_ASSERT(columns != NULL);
|
|
|
|
|
|
if (column_index < 0)
|
|
if (column_index < 0)
|
|
@@ -8399,7 +8399,7 @@ void ImGui::SetColumnOffset(int column_index, float offset)
|
|
{
|
|
{
|
|
ImGuiContext& g = *GImGui;
|
|
ImGuiContext& g = *GImGui;
|
|
ImGuiWindow* window = g.CurrentWindow;
|
|
ImGuiWindow* window = g.CurrentWindow;
|
|
- ImGuiColumnsSet* columns = window->DC.ColumnsSet;
|
|
|
|
|
|
+ ImGuiColumns* columns = window->DC.CurrentColumns;
|
|
IM_ASSERT(columns != NULL);
|
|
IM_ASSERT(columns != NULL);
|
|
|
|
|
|
if (column_index < 0)
|
|
if (column_index < 0)
|
|
@@ -8420,7 +8420,7 @@ void ImGui::SetColumnOffset(int column_index, float offset)
|
|
void ImGui::SetColumnWidth(int column_index, float width)
|
|
void ImGui::SetColumnWidth(int column_index, float width)
|
|
{
|
|
{
|
|
ImGuiWindow* window = GetCurrentWindowRead();
|
|
ImGuiWindow* window = GetCurrentWindowRead();
|
|
- ImGuiColumnsSet* columns = window->DC.ColumnsSet;
|
|
|
|
|
|
+ ImGuiColumns* columns = window->DC.CurrentColumns;
|
|
IM_ASSERT(columns != NULL);
|
|
IM_ASSERT(columns != NULL);
|
|
|
|
|
|
if (column_index < 0)
|
|
if (column_index < 0)
|
|
@@ -8431,46 +8431,57 @@ void ImGui::SetColumnWidth(int column_index, float width)
|
|
void ImGui::PushColumnClipRect(int column_index)
|
|
void ImGui::PushColumnClipRect(int column_index)
|
|
{
|
|
{
|
|
ImGuiWindow* window = GetCurrentWindowRead();
|
|
ImGuiWindow* window = GetCurrentWindowRead();
|
|
- ImGuiColumnsSet* columns = window->DC.ColumnsSet;
|
|
|
|
|
|
+ ImGuiColumns* columns = window->DC.CurrentColumns;
|
|
if (column_index < 0)
|
|
if (column_index < 0)
|
|
column_index = columns->Current;
|
|
column_index = columns->Current;
|
|
|
|
|
|
- PushClipRect(columns->Columns[column_index].ClipRect.Min, columns->Columns[column_index].ClipRect.Max, false);
|
|
|
|
|
|
+ ImGuiColumnData* column = &columns->Columns[column_index];
|
|
|
|
+ PushClipRect(column->ClipRect.Min, column->ClipRect.Max, false);
|
|
}
|
|
}
|
|
|
|
|
|
-static ImGuiColumnsSet* FindOrAddColumnsSet(ImGuiWindow* window, ImGuiID id)
|
|
|
|
|
|
+ImGuiColumns* ImGui::FindOrCreateColumns(ImGuiWindow* window, ImGuiID id)
|
|
{
|
|
{
|
|
|
|
+ // We have few columns per window so for now we don't need bother much with turning this into a faster lookup.
|
|
for (int n = 0; n < window->ColumnsStorage.Size; n++)
|
|
for (int n = 0; n < window->ColumnsStorage.Size; n++)
|
|
if (window->ColumnsStorage[n].ID == id)
|
|
if (window->ColumnsStorage[n].ID == id)
|
|
return &window->ColumnsStorage[n];
|
|
return &window->ColumnsStorage[n];
|
|
|
|
|
|
- window->ColumnsStorage.push_back(ImGuiColumnsSet());
|
|
|
|
- ImGuiColumnsSet* columns = &window->ColumnsStorage.back();
|
|
|
|
|
|
+ window->ColumnsStorage.push_back(ImGuiColumns());
|
|
|
|
+ ImGuiColumns* columns = &window->ColumnsStorage.back();
|
|
columns->ID = id;
|
|
columns->ID = id;
|
|
return columns;
|
|
return columns;
|
|
}
|
|
}
|
|
|
|
|
|
-void ImGui::BeginColumns(const char* str_id, int columns_count, ImGuiColumnsFlags flags)
|
|
|
|
|
|
+ImGuiID ImGui::GetColumnsID(const char* str_id, int columns_count)
|
|
{
|
|
{
|
|
- ImGuiContext& g = *GImGui;
|
|
|
|
ImGuiWindow* window = GetCurrentWindow();
|
|
ImGuiWindow* window = GetCurrentWindow();
|
|
|
|
|
|
- IM_ASSERT(columns_count >= 1);
|
|
|
|
- IM_ASSERT(window->DC.ColumnsSet == NULL); // Nested columns are currently not supported
|
|
|
|
-
|
|
|
|
// Differentiate column ID with an arbitrary prefix for cases where users name their columns set the same as another widget.
|
|
// Differentiate column ID with an arbitrary prefix for cases where users name their columns set the same as another widget.
|
|
// In addition, when an identifier isn't explicitly provided we include the number of columns in the hash to make it uniquer.
|
|
// In addition, when an identifier isn't explicitly provided we include the number of columns in the hash to make it uniquer.
|
|
PushID(0x11223347 + (str_id ? 0 : columns_count));
|
|
PushID(0x11223347 + (str_id ? 0 : columns_count));
|
|
ImGuiID id = window->GetID(str_id ? str_id : "columns");
|
|
ImGuiID id = window->GetID(str_id ? str_id : "columns");
|
|
PopID();
|
|
PopID();
|
|
|
|
|
|
|
|
+ return id;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void ImGui::BeginColumns(const char* str_id, int columns_count, ImGuiColumnsFlags flags)
|
|
|
|
+{
|
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
|
+ ImGuiWindow* window = GetCurrentWindow();
|
|
|
|
+
|
|
|
|
+ IM_ASSERT(columns_count >= 1);
|
|
|
|
+ IM_ASSERT(window->DC.CurrentColumns == NULL); // Nested columns are currently not supported
|
|
|
|
+
|
|
|
|
+ ImGuiID id = GetColumnsID(str_id, columns_count);
|
|
|
|
+
|
|
// Acquire storage for the columns set
|
|
// Acquire storage for the columns set
|
|
- ImGuiColumnsSet* columns = FindOrAddColumnsSet(window, id);
|
|
|
|
|
|
+ ImGuiColumns* columns = FindOrCreateColumns(window, id);
|
|
IM_ASSERT(columns->ID == id);
|
|
IM_ASSERT(columns->ID == id);
|
|
columns->Current = 0;
|
|
columns->Current = 0;
|
|
columns->Count = columns_count;
|
|
columns->Count = columns_count;
|
|
columns->Flags = flags;
|
|
columns->Flags = flags;
|
|
- window->DC.ColumnsSet = columns;
|
|
|
|
|
|
+ window->DC.CurrentColumns = columns;
|
|
|
|
|
|
// Set state for first column
|
|
// Set state for first column
|
|
const float content_region_width = (window->SizeContentsExplicit.x != 0.0f) ? (window->SizeContentsExplicit.x) : (window->InnerClipRect.Max.x - window->Pos.x);
|
|
const float content_region_width = (window->SizeContentsExplicit.x != 0.0f) ? (window->SizeContentsExplicit.x) : (window->InnerClipRect.Max.x - window->Pos.x);
|
|
@@ -8521,7 +8532,7 @@ void ImGui::EndColumns()
|
|
{
|
|
{
|
|
ImGuiContext& g = *GImGui;
|
|
ImGuiContext& g = *GImGui;
|
|
ImGuiWindow* window = GetCurrentWindow();
|
|
ImGuiWindow* window = GetCurrentWindow();
|
|
- ImGuiColumnsSet* columns = window->DC.ColumnsSet;
|
|
|
|
|
|
+ ImGuiColumns* columns = window->DC.CurrentColumns;
|
|
IM_ASSERT(columns != NULL);
|
|
IM_ASSERT(columns != NULL);
|
|
|
|
|
|
PopItemWidth();
|
|
PopItemWidth();
|
|
@@ -8582,7 +8593,7 @@ void ImGui::EndColumns()
|
|
}
|
|
}
|
|
columns->IsBeingResized = is_being_resized;
|
|
columns->IsBeingResized = is_being_resized;
|
|
|
|
|
|
- window->DC.ColumnsSet = NULL;
|
|
|
|
|
|
+ window->DC.CurrentColumns = NULL;
|
|
window->DC.ColumnsOffset.x = 0.0f;
|
|
window->DC.ColumnsOffset.x = 0.0f;
|
|
window->DC.CursorPos.x = (float)(int)(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x);
|
|
window->DC.CursorPos.x = (float)(int)(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x);
|
|
}
|
|
}
|
|
@@ -8595,10 +8606,10 @@ void ImGui::Columns(int columns_count, const char* id, bool border)
|
|
|
|
|
|
ImGuiColumnsFlags flags = (border ? 0 : ImGuiColumnsFlags_NoBorder);
|
|
ImGuiColumnsFlags flags = (border ? 0 : ImGuiColumnsFlags_NoBorder);
|
|
//flags |= ImGuiColumnsFlags_NoPreserveWidths; // NB: Legacy behavior
|
|
//flags |= ImGuiColumnsFlags_NoPreserveWidths; // NB: Legacy behavior
|
|
- if (window->DC.ColumnsSet != NULL && window->DC.ColumnsSet->Count == columns_count && window->DC.ColumnsSet->Flags == flags)
|
|
|
|
|
|
+ if (window->DC.CurrentColumns != NULL && window->DC.CurrentColumns->Count == columns_count && window->DC.CurrentColumns->Flags == flags)
|
|
return;
|
|
return;
|
|
|
|
|
|
- if (window->DC.ColumnsSet != NULL)
|
|
|
|
|
|
+ if (window->DC.CurrentColumns != NULL)
|
|
EndColumns();
|
|
EndColumns();
|
|
|
|
|
|
if (columns_count != 1)
|
|
if (columns_count != 1)
|
|
@@ -9582,7 +9593,7 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|
{
|
|
{
|
|
for (int n = 0; n < window->ColumnsStorage.Size; n++)
|
|
for (int n = 0; n < window->ColumnsStorage.Size; n++)
|
|
{
|
|
{
|
|
- const ImGuiColumnsSet* columns = &window->ColumnsStorage[n];
|
|
|
|
|
|
+ const ImGuiColumns* columns = &window->ColumnsStorage[n];
|
|
if (ImGui::TreeNode((void*)(uintptr_t)columns->ID, "Columns Id: 0x%08X, Count: %d, Flags: 0x%04X", columns->ID, columns->Count, columns->Flags))
|
|
if (ImGui::TreeNode((void*)(uintptr_t)columns->ID, "Columns Id: 0x%08X, Count: %d, Flags: 0x%04X", columns->ID, columns->Count, columns->Flags))
|
|
{
|
|
{
|
|
ImGui::BulletText("Width: %.1f (MinX: %.1f, MaxX: %.1f)", columns->MaxX - columns->MinX, columns->MinX, columns->MaxX);
|
|
ImGui::BulletText("Width: %.1f (MinX: %.1f, MaxX: %.1f)", columns->MaxX - columns->MinX, columns->MinX, columns->MaxX);
|