mirror of
https://github.com/Drezil/imgui.git
synced 2024-11-22 11:57:00 +00:00
Tables: Storing per-column SkipItems as a shortcut. Comments, Spacings.
# Conflicts: # imgui_internal.h
This commit is contained in:
parent
31de161066
commit
2958e37310
2
imgui.h
2
imgui.h
@ -694,7 +694,7 @@ namespace ImGui
|
|||||||
// Tables: Sorting
|
// Tables: Sorting
|
||||||
// - Call TableGetSortSpecs() to retrieve latest sort specs for the table. Return value will be NULL if no sorting.
|
// - Call TableGetSortSpecs() to retrieve latest sort specs for the table. Return value will be NULL if no sorting.
|
||||||
// - You can sort your data again when 'SpecsChanged == true'. It will be true with sorting specs have changed since last call, or the first time.
|
// - You can sort your data again when 'SpecsChanged == true'. It will be true with sorting specs have changed since last call, or the first time.
|
||||||
// - Don't hold on this structure over multiple frames.
|
// - Lifetime: don't hold on this pointer over multiple frames or past any subsequent call to BeginTable()!
|
||||||
IMGUI_API const ImGuiTableSortSpecs* TableGetSortSpecs(); // get latest sort specs for the table (NULL if not sorting).
|
IMGUI_API const ImGuiTableSortSpecs* TableGetSortSpecs(); // get latest sort specs for the table (NULL if not sorting).
|
||||||
|
|
||||||
// Tab Bars, Tabs
|
// Tab Bars, Tabs
|
||||||
|
@ -3618,7 +3618,7 @@ static void ShowDemoWindowTables()
|
|||||||
ImGui::CheckboxFlags("ImGuiTableFlags_ScrollY", (unsigned int*)&flags, ImGuiTableFlags_ScrollY);
|
ImGui::CheckboxFlags("ImGuiTableFlags_ScrollY", (unsigned int*)&flags, ImGuiTableFlags_ScrollY);
|
||||||
ImGui::CheckboxFlags("ImGuiTableFlags_ScrollFreezeTopRow", (unsigned int*)&flags, ImGuiTableFlags_ScrollFreezeTopRow);
|
ImGui::CheckboxFlags("ImGuiTableFlags_ScrollFreezeTopRow", (unsigned int*)&flags, ImGuiTableFlags_ScrollFreezeTopRow);
|
||||||
ImGui::CheckboxFlags("ImGuiTableFlags_ScrollFreezeLeftColumn", (unsigned int*)&flags, ImGuiTableFlags_ScrollFreezeLeftColumn);
|
ImGui::CheckboxFlags("ImGuiTableFlags_ScrollFreezeLeftColumn", (unsigned int*)&flags, ImGuiTableFlags_ScrollFreezeLeftColumn);
|
||||||
|
|
||||||
if (ImGui::BeginTable("##table1", 7, flags, size))
|
if (ImGui::BeginTable("##table1", 7, flags, size))
|
||||||
{
|
{
|
||||||
ImGui::TableSetupColumn("Line #", ImGuiTableColumnFlags_NoHide); // Make the first column not hideable to match our use of ImGuiTableFlags_ScrollFreezeLeftColumn
|
ImGui::TableSetupColumn("Line #", ImGuiTableColumnFlags_NoHide); // Make the first column not hideable to match our use of ImGuiTableFlags_ScrollFreezeLeftColumn
|
||||||
|
@ -1823,11 +1823,12 @@ struct ImGuiTabBar
|
|||||||
#define IM_COL32_DISABLE IM_COL32(0,0,0,1) // Special sentinel code
|
#define IM_COL32_DISABLE IM_COL32(0,0,0,1) // Special sentinel code
|
||||||
#define IMGUI_TABLE_MAX_COLUMNS 64 // sizeof(ImU64) * 8. This is solely because we frequently encode columns set in a ImU64.
|
#define IMGUI_TABLE_MAX_COLUMNS 64 // sizeof(ImU64) * 8. This is solely because we frequently encode columns set in a ImU64.
|
||||||
|
|
||||||
// [Internal] sizeof() ~ 96
|
// [Internal] sizeof() ~ 100
|
||||||
struct ImGuiTableColumn
|
struct ImGuiTableColumn
|
||||||
{
|
{
|
||||||
|
ImRect ClipRect; // Clipping rectangle for the column
|
||||||
ImGuiID UserID; // Optional, value passed to TableSetupColumn()
|
ImGuiID UserID; // Optional, value passed to TableSetupColumn()
|
||||||
ImGuiTableColumnFlags FlagsIn; // Flags as input by user. See ImGuiTableColumnFlags_
|
ImGuiTableColumnFlags FlagsIn; // Flags as they were provided by user. See ImGuiTableColumnFlags_
|
||||||
ImGuiTableColumnFlags Flags; // Effective flags. See ImGuiTableColumnFlags_
|
ImGuiTableColumnFlags Flags; // Effective flags. See ImGuiTableColumnFlags_
|
||||||
float ResizeWeight; // ~1.0f. Master width data when (Flags & _WidthStretch)
|
float ResizeWeight; // ~1.0f. Master width data when (Flags & _WidthStretch)
|
||||||
float MinX; // Absolute positions
|
float MinX; // Absolute positions
|
||||||
@ -1836,19 +1837,19 @@ struct ImGuiTableColumn
|
|||||||
float WidthGiven; // == (MaxX - MinX). FIXME-TABLE: Store all persistent width in multiple of FontSize?
|
float WidthGiven; // == (MaxX - MinX). FIXME-TABLE: Store all persistent width in multiple of FontSize?
|
||||||
float StartXRows; // Start position for the frame, currently ~(MinX + CellPaddingX)
|
float StartXRows; // Start position for the frame, currently ~(MinX + CellPaddingX)
|
||||||
float StartXHeaders;
|
float StartXHeaders;
|
||||||
ImS16 ContentWidthRowsFrozen; // Contents width. Because freezing is non correlated from headers we need all 4 variants (ImDrawCmd merging uses different data than alignment code).
|
|
||||||
ImS16 ContentWidthRowsUnfrozen; // (encoded as ImS16 because we actually rarely use those width)
|
|
||||||
ImS16 ContentWidthHeadersUsed; // TableHeader() automatically softclip itself + report ideal desired size, to avoid creating extraneous draw calls
|
|
||||||
ImS16 ContentWidthHeadersDesired;
|
|
||||||
float ContentMaxPosRowsFrozen; // Submitted contents absolute maximum position, from which we can infer width.
|
float ContentMaxPosRowsFrozen; // Submitted contents absolute maximum position, from which we can infer width.
|
||||||
float ContentMaxPosRowsUnfrozen; // (kept as float because we need to manipulate those between each cell change)
|
float ContentMaxPosRowsUnfrozen; // (kept as float because we need to manipulate those between each cell change)
|
||||||
float ContentMaxPosHeadersUsed;
|
float ContentMaxPosHeadersUsed;
|
||||||
float ContentMaxPosHeadersDesired;
|
float ContentMaxPosHeadersDesired;
|
||||||
ImRect ClipRect;
|
ImS16 ContentWidthRowsFrozen; // Contents width. Because row freezing is not correlated with headers/not-headers we need all 4 variants (ImDrawCmd merging uses different data than alignment code).
|
||||||
ImS16 NameOffset; // Offset into parent ColumnsName[]
|
ImS16 ContentWidthRowsUnfrozen; // (encoded as ImS16 because we actually rarely use those width)
|
||||||
|
ImS16 ContentWidthHeadersUsed; // TableHeader() automatically softclip itself + report ideal desired size, to avoid creating extraneous draw calls
|
||||||
|
ImS16 ContentWidthHeadersDesired;
|
||||||
|
ImS16 NameOffset; // Offset into parent ColumnsNames[]
|
||||||
bool IsActive; // Is the column not marked Hidden by the user (regardless of clipping). We're not calling this "Visible" here because visibility also depends on clipping.
|
bool IsActive; // Is the column not marked Hidden by the user (regardless of clipping). We're not calling this "Visible" here because visibility also depends on clipping.
|
||||||
bool NextIsActive;
|
bool NextIsActive;
|
||||||
bool IsClipped; // Set when not overlapping the host window clipping rectangle. We don't use the opposite "!Visible" name because Clipped can be altered by events.
|
bool IsClipped; // Set when not overlapping the host window clipping rectangle. We don't use the opposite "!Visible" name because Clipped can be altered by events.
|
||||||
|
bool SkipItems;
|
||||||
ImS8 IndexDisplayOrder; // Index within DisplayOrder[] (column may be reordered by users)
|
ImS8 IndexDisplayOrder; // Index within DisplayOrder[] (column may be reordered by users)
|
||||||
ImS8 IndexWithinActiveSet; // Index within active set (<= IndexOrder)
|
ImS8 IndexWithinActiveSet; // Index within active set (<= IndexOrder)
|
||||||
ImS8 DrawChannelCurrent; // Index within DrawSplitter.Channels[]
|
ImS8 DrawChannelCurrent; // Index within DrawSplitter.Channels[]
|
||||||
@ -2178,10 +2179,6 @@ namespace ImGui
|
|||||||
IMGUI_API float GetColumnNormFromOffset(const ImGuiOldColumns* columns, float offset);
|
IMGUI_API float GetColumnNormFromOffset(const ImGuiOldColumns* columns, float offset);
|
||||||
|
|
||||||
// Tables
|
// Tables
|
||||||
//IMGUI_API int GetTableColumnNo();
|
|
||||||
//IMGUI_API bool SetTableColumnNo(int column_n);
|
|
||||||
//IMGUI_API int GetTableLineNo();
|
|
||||||
|
|
||||||
IMGUI_API bool BeginTableEx(const char* name, ImGuiID id, int columns_count, ImGuiTableFlags flags = 0, const ImVec2& outer_size = ImVec2(0, 0), float inner_width = 0.0f);
|
IMGUI_API bool BeginTableEx(const char* name, ImGuiID id, int columns_count, ImGuiTableFlags flags = 0, const ImVec2& outer_size = ImVec2(0, 0), float inner_width = 0.0f);
|
||||||
IMGUI_API void TableBeginUpdateColumns(ImGuiTable* table);
|
IMGUI_API void TableBeginUpdateColumns(ImGuiTable* table);
|
||||||
IMGUI_API void TableUpdateDrawChannels(ImGuiTable* table);
|
IMGUI_API void TableUpdateDrawChannels(ImGuiTable* table);
|
||||||
|
@ -68,20 +68,22 @@
|
|||||||
// - TableBeginUpdateColumns() - apply resize/order requests, lock columns active state, order
|
// - TableBeginUpdateColumns() - apply resize/order requests, lock columns active state, order
|
||||||
// - TableSetupColumn() user submit columns details (optional)
|
// - TableSetupColumn() user submit columns details (optional)
|
||||||
// - TableAutoHeaders() or TableHeader() user submit a headers row (optional)
|
// - TableAutoHeaders() or TableHeader() user submit a headers row (optional)
|
||||||
// - TableSortSpecsClickColumn()
|
// - TableSortSpecsClickColumn() - when clicked: alter sort order and sort direction
|
||||||
// - TableGetSortSpecs() user queries updated sort specs (optional)
|
// - TableGetSortSpecs() user queries updated sort specs (optional)
|
||||||
// - TableNextRow() / TableNextCell() user begin into the first row, also automatically called by TableAutoHeaders()
|
// - TableNextRow() / TableNextCell() user begin into the first row, also automatically called by TableAutoHeaders()
|
||||||
// - TableUpdateLayout() - called by the FIRST call to TableNextRow()
|
// - TableUpdateLayout() - called by the FIRST call to TableNextRow()!
|
||||||
// - TableUpdateDrawChannels() - setup ImDrawList channels
|
// - TableUpdateDrawChannels() - setup ImDrawList channels
|
||||||
// - TableUpdateBorders() - detect hovering columns for resize, ahead of contents submission
|
// - TableUpdateBorders() - detect hovering columns for resize, ahead of contents submission
|
||||||
// - TableDrawContextMenu() - draw right-click context menu
|
// - TableDrawContextMenu() - draw right-click context menu
|
||||||
|
// - TableEndCell() - close existing cell if not the first time
|
||||||
|
// - TableBeginCell() - enter into current cell
|
||||||
// - [...] user emit contents
|
// - [...] user emit contents
|
||||||
// - EndTable() user ends the table
|
// - EndTable() user ends the table
|
||||||
// - TableDrawBorders() - draw outer borders, inner vertical borders
|
// - TableDrawBorders() - draw outer borders, inner vertical borders
|
||||||
// - TableDrawMergeChannels() - merge draw channels if clipping isn't required
|
// - TableDrawMergeChannels() - merge draw channels if clipping isn't required
|
||||||
// - TableSetColumnWidth() - apply resizing width
|
// - TableSetColumnWidth() - apply resizing width
|
||||||
// - TableUpdateColumnsWeightFromWidth()
|
// - TableUpdateColumnsWeightFromWidth() - recompute columns weights (of weighted columns) from their respective width
|
||||||
// - EndChild() - (if ScrollX/ScrollY is set)
|
// - EndChild() - (if ScrollX/ScrollY is set)
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
// Configuration
|
// Configuration
|
||||||
@ -700,7 +702,7 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
|
|||||||
column->ClipRect.Max.x = offset_x;
|
column->ClipRect.Max.x = offset_x;
|
||||||
column->ClipRect.Max.y = FLT_MAX;
|
column->ClipRect.Max.y = FLT_MAX;
|
||||||
column->ClipRect.ClipWithFull(host_clip_rect);
|
column->ClipRect.ClipWithFull(host_clip_rect);
|
||||||
column->IsClipped = true;
|
column->IsClipped = column->SkipItems = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -731,6 +733,7 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
|
|||||||
column->ClipRect.ClipWithFull(host_clip_rect);
|
column->ClipRect.ClipWithFull(host_clip_rect);
|
||||||
|
|
||||||
column->IsClipped = (column->ClipRect.Max.x <= column->ClipRect.Min.x) && (column->AutoFitQueue & 1) == 0 && (column->CannotSkipItemsQueue & 1) == 0;
|
column->IsClipped = (column->ClipRect.Max.x <= column->ClipRect.Min.x) && (column->AutoFitQueue & 1) == 0 && (column->CannotSkipItemsQueue & 1) == 0;
|
||||||
|
column->SkipItems = column->IsClipped || table->HostSkipItems;
|
||||||
if (column->IsClipped)
|
if (column->IsClipped)
|
||||||
{
|
{
|
||||||
// Columns with the _WidthAlwaysAutoResize sizing policy will never be updated then.
|
// Columns with the _WidthAlwaysAutoResize sizing policy will never be updated then.
|
||||||
@ -1580,9 +1583,10 @@ void ImGui::TableBeginCell(ImGuiTable* table, int column_no)
|
|||||||
const float start_x = (table->RowFlags & ImGuiTableRowFlags_Headers) ? column->StartXHeaders : column->StartXRows;
|
const float start_x = (table->RowFlags & ImGuiTableRowFlags_Headers) ? column->StartXHeaders : column->StartXRows;
|
||||||
|
|
||||||
window->DC.LastItemId = 0;
|
window->DC.LastItemId = 0;
|
||||||
window->DC.CursorPos = ImVec2(start_x, table->RowPosY1 + table->CellPaddingY);
|
window->DC.CursorPos.x = start_x;
|
||||||
|
window->DC.CursorPos.y = table->RowPosY1 + table->CellPaddingY;
|
||||||
window->DC.CursorMaxPos.x = window->DC.CursorPos.x;
|
window->DC.CursorMaxPos.x = window->DC.CursorPos.x;
|
||||||
window->DC.ColumnsOffset.x = start_x - window->Pos.x - window->DC.Indent.x; // FIXME-WORKRECT // FIXME-TABLE: Recurse
|
window->DC.ColumnsOffset.x = start_x - window->Pos.x - window->DC.Indent.x; // FIXME-WORKRECT
|
||||||
window->DC.CurrLineTextBaseOffset = table->RowTextBaseline;
|
window->DC.CurrLineTextBaseOffset = table->RowTextBaseline;
|
||||||
|
|
||||||
window->WorkRect.Min.y = window->DC.CursorPos.y;
|
window->WorkRect.Min.y = window->DC.CursorPos.y;
|
||||||
@ -1593,10 +1597,7 @@ void ImGui::TableBeginCell(ImGuiTable* table, int column_no)
|
|||||||
if (!column->IsActive)
|
if (!column->IsActive)
|
||||||
window->DC.CursorPos.y = ImMax(window->DC.CursorPos.y, table->RowPosY2);
|
window->DC.CursorPos.y = ImMax(window->DC.CursorPos.y, table->RowPosY2);
|
||||||
|
|
||||||
// FIXME-COLUMNS: Setup baseline, preserve across columns (how can we obtain first line baseline tho..)
|
window->SkipItems = column->SkipItems;
|
||||||
// window->DC.CurrLineTextBaseOffset = ImMax(window->DC.CurrLineTextBaseOffset, g.Style.FramePadding.y);
|
|
||||||
|
|
||||||
window->SkipItems = column->IsClipped ? true : table->HostSkipItems;
|
|
||||||
if (table->Flags & ImGuiTableFlags_NoClipX)
|
if (table->Flags & ImGuiTableFlags_NoClipX)
|
||||||
{
|
{
|
||||||
table->DrawSplitter.SetCurrentChannel(window->DrawList, 1);
|
table->DrawSplitter.SetCurrentChannel(window->DrawList, 1);
|
||||||
@ -1615,7 +1616,7 @@ void ImGui::TableBeginCell(ImGuiTable* table, int column_no)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// [Internal] Called by TableNextRow()TableNextCell()!
|
// [Internal] Called by TableNextRow()/TableNextCell()!
|
||||||
void ImGui::TableEndCell(ImGuiTable* table)
|
void ImGui::TableEndCell(ImGuiTable* table)
|
||||||
{
|
{
|
||||||
ImGuiTableColumn* column = &table->Columns[table->CurrentColumn];
|
ImGuiTableColumn* column = &table->Columns[table->CurrentColumn];
|
||||||
@ -2078,7 +2079,8 @@ void ImGui::TableSortSpecsClickColumn(ImGuiTable* table, ImGuiTableColumn* click
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Return NULL if no sort specs.
|
// Return NULL if no sort specs.
|
||||||
// You can sort your data again when 'SpecsChanged == true'.It will be true with sorting specs have changed since last call, or the first time.
|
// You can sort your data again when 'SpecsChanged == true'. It will be true with sorting specs have changed since last call, or the first time.
|
||||||
|
// Lifetime: don't hold on this pointer over multiple frames or past any subsequent call to BeginTable()!
|
||||||
const ImGuiTableSortSpecs* ImGui::TableGetSortSpecs()
|
const ImGuiTableSortSpecs* ImGui::TableGetSortSpecs()
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
|
Loading…
Reference in New Issue
Block a user