|
@@ -6,6 +6,7 @@
|
|
Index of this file:
|
|
Index of this file:
|
|
|
|
|
|
// [SECTION] Tables: BeginTable, EndTable, etc.
|
|
// [SECTION] Tables: BeginTable, EndTable, etc.
|
|
|
|
+// [SECTION] Tables: Sorting
|
|
// [SECTION] Tables: Headers
|
|
// [SECTION] Tables: Headers
|
|
// [SECTION] Tables: Context Menu
|
|
// [SECTION] Tables: Context Menu
|
|
// [SECTION] Tables: Settings (.ini data)
|
|
// [SECTION] Tables: Settings (.ini data)
|
|
@@ -556,19 +557,6 @@ static ImGuiTableColumnFlags TableFixColumnFlags(ImGuiTable* table, ImGuiTableCo
|
|
return flags;
|
|
return flags;
|
|
}
|
|
}
|
|
|
|
|
|
-static void TableFixColumnSortDirection(ImGuiTableColumn* column)
|
|
|
|
-{
|
|
|
|
- // Initial sort state
|
|
|
|
- if (column->SortDirection == ImGuiSortDirection_None)
|
|
|
|
- column->SortDirection = (column->Flags & ImGuiTableColumnFlags_PreferSortDescending) ? (ImS8)ImGuiSortDirection_Descending : (ImS8)(ImGuiSortDirection_Ascending);
|
|
|
|
-
|
|
|
|
- // Handle NoSortAscending/NoSortDescending
|
|
|
|
- if (column->SortDirection == ImGuiSortDirection_Ascending && (column->Flags & ImGuiTableColumnFlags_NoSortAscending))
|
|
|
|
- column->SortDirection = ImGuiSortDirection_Descending;
|
|
|
|
- else if (column->SortDirection == ImGuiSortDirection_Descending && (column->Flags & ImGuiTableColumnFlags_NoSortDescending))
|
|
|
|
- column->SortDirection = ImGuiSortDirection_Ascending;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
// Minimum column content width (without padding)
|
|
// Minimum column content width (without padding)
|
|
static float TableGetMinColumnWidth()
|
|
static float TableGetMinColumnWidth()
|
|
{
|
|
{
|
|
@@ -2172,72 +2160,6 @@ void ImGui::TablePopBackgroundChannel()
|
|
table->DrawSplitter.SetCurrentChannel(window->DrawList, column->DrawChannelCurrent);
|
|
table->DrawSplitter.SetCurrentChannel(window->DrawList, column->DrawChannelCurrent);
|
|
}
|
|
}
|
|
|
|
|
|
-// Note that the NoSortAscending/NoSortDescending flags are processed in TableSortSpecsSanitize(), and they may change/revert
|
|
|
|
-// the value of SortDirection. We could technically also do it here but it would be unnecessary and duplicate code.
|
|
|
|
-void ImGui::TableSetColumnSortDirection(int column_n, ImGuiSortDirection sort_direction, bool append_to_sort_specs)
|
|
|
|
-{
|
|
|
|
- ImGuiContext& g = *GImGui;
|
|
|
|
- ImGuiTable* table = g.CurrentTable;
|
|
|
|
-
|
|
|
|
- if (!(table->Flags & ImGuiTableFlags_MultiSortable))
|
|
|
|
- append_to_sort_specs = false;
|
|
|
|
-
|
|
|
|
- ImS8 sort_order_max = 0;
|
|
|
|
- if (append_to_sort_specs)
|
|
|
|
- for (int other_column_n = 0; other_column_n < table->ColumnsCount; other_column_n++)
|
|
|
|
- sort_order_max = ImMax(sort_order_max, table->Columns[other_column_n].SortOrder);
|
|
|
|
-
|
|
|
|
- ImGuiTableColumn* column = &table->Columns[column_n];
|
|
|
|
- column->SortDirection = (ImS8)sort_direction;
|
|
|
|
- if (column->SortOrder == -1 || !append_to_sort_specs)
|
|
|
|
- column->SortOrder = append_to_sort_specs ? sort_order_max + 1 : 0;
|
|
|
|
-
|
|
|
|
- for (int other_column_n = 0; other_column_n < table->ColumnsCount; other_column_n++)
|
|
|
|
- {
|
|
|
|
- ImGuiTableColumn* other_column = &table->Columns[other_column_n];
|
|
|
|
- if (other_column != column && !append_to_sort_specs)
|
|
|
|
- other_column->SortOrder = -1;
|
|
|
|
- TableFixColumnSortDirection(other_column);
|
|
|
|
- }
|
|
|
|
- table->IsSettingsDirty = true;
|
|
|
|
- table->IsSortSpecsDirty = true;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-// Return NULL if no sort specs (most often when ImGuiTableFlags_Sortable is not set)
|
|
|
|
-// 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()!
|
|
|
|
-ImGuiTableSortSpecs* ImGui::TableGetSortSpecs()
|
|
|
|
-{
|
|
|
|
- ImGuiContext& g = *GImGui;
|
|
|
|
- ImGuiTable* table = g.CurrentTable;
|
|
|
|
- IM_ASSERT(table != NULL);
|
|
|
|
-
|
|
|
|
- if (!(table->Flags & ImGuiTableFlags_Sortable))
|
|
|
|
- return NULL;
|
|
|
|
-
|
|
|
|
- // Require layout (in case TableHeadersRow() hasn't been called) as it may alter IsSortSpecsDirty in some paths.
|
|
|
|
- if (!table->IsLayoutLocked)
|
|
|
|
- TableUpdateLayout(table);
|
|
|
|
-
|
|
|
|
- if (table->IsSortSpecsDirty)
|
|
|
|
- TableSortSpecsBuild(table);
|
|
|
|
-
|
|
|
|
- return table->SortSpecs.SpecsCount ? &table->SortSpecs : NULL;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-bool ImGui::TableGetColumnIsSorted(int column_n)
|
|
|
|
-{
|
|
|
|
- ImGuiContext& g = *GImGui;
|
|
|
|
- ImGuiTable* table = g.CurrentTable;
|
|
|
|
- if (!table)
|
|
|
|
- return false;
|
|
|
|
- if (column_n < 0)
|
|
|
|
- column_n = table->CurrentColumn;
|
|
|
|
- ImGuiTableColumn* column = &table->Columns[column_n];
|
|
|
|
- return (column->SortOrder != -1);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
// Return -1 when table is not hovered. return columns_count if the unused space at the right of visible columns is hovered.
|
|
// Return -1 when table is not hovered. return columns_count if the unused space at the right of visible columns is hovered.
|
|
int ImGui::TableGetHoveredColumn()
|
|
int ImGui::TableGetHoveredColumn()
|
|
{
|
|
{
|
|
@@ -2301,6 +2223,86 @@ void ImGui::TableSetBgColor(ImGuiTableBgTarget bg_target, ImU32 color, int colum
|
|
// - TableSortSpecsBuild() [Internal]
|
|
// - TableSortSpecsBuild() [Internal]
|
|
//-------------------------------------------------------------------------
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
|
|
|
+// Return NULL if no sort specs (most often when ImGuiTableFlags_Sortable is not set)
|
|
|
|
+// 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()!
|
|
|
|
+ImGuiTableSortSpecs* ImGui::TableGetSortSpecs()
|
|
|
|
+{
|
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
|
+ ImGuiTable* table = g.CurrentTable;
|
|
|
|
+ IM_ASSERT(table != NULL);
|
|
|
|
+
|
|
|
|
+ if (!(table->Flags & ImGuiTableFlags_Sortable))
|
|
|
|
+ return NULL;
|
|
|
|
+
|
|
|
|
+ // Require layout (in case TableHeadersRow() hasn't been called) as it may alter IsSortSpecsDirty in some paths.
|
|
|
|
+ if (!table->IsLayoutLocked)
|
|
|
|
+ TableUpdateLayout(table);
|
|
|
|
+
|
|
|
|
+ if (table->IsSortSpecsDirty)
|
|
|
|
+ TableSortSpecsBuild(table);
|
|
|
|
+
|
|
|
|
+ return table->SortSpecs.SpecsCount ? &table->SortSpecs : NULL;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+bool ImGui::TableGetColumnIsSorted(int column_n)
|
|
|
|
+{
|
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
|
+ ImGuiTable* table = g.CurrentTable;
|
|
|
|
+ if (!table)
|
|
|
|
+ return false;
|
|
|
|
+ if (column_n < 0)
|
|
|
|
+ column_n = table->CurrentColumn;
|
|
|
|
+ ImGuiTableColumn* column = &table->Columns[column_n];
|
|
|
|
+ return (column->SortOrder != -1);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void ImGui::TableFixColumnSortDirection(ImGuiTableColumn* column)
|
|
|
|
+{
|
|
|
|
+ // Initial sort state
|
|
|
|
+ if (column->SortDirection == ImGuiSortDirection_None)
|
|
|
|
+ column->SortDirection = (column->Flags & ImGuiTableColumnFlags_PreferSortDescending) ? (ImS8)ImGuiSortDirection_Descending : (ImS8)(ImGuiSortDirection_Ascending);
|
|
|
|
+
|
|
|
|
+ // Handle NoSortAscending/NoSortDescending
|
|
|
|
+ if (column->SortDirection == ImGuiSortDirection_Ascending && (column->Flags & ImGuiTableColumnFlags_NoSortAscending))
|
|
|
|
+ column->SortDirection = ImGuiSortDirection_Descending;
|
|
|
|
+ else if (column->SortDirection == ImGuiSortDirection_Descending && (column->Flags & ImGuiTableColumnFlags_NoSortDescending))
|
|
|
|
+ column->SortDirection = ImGuiSortDirection_Ascending;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+// Note that the NoSortAscending/NoSortDescending flags are processed in TableSortSpecsSanitize(), and they may change/revert
|
|
|
|
+// the value of SortDirection. We could technically also do it here but it would be unnecessary and duplicate code.
|
|
|
|
+void ImGui::TableSetColumnSortDirection(int column_n, ImGuiSortDirection sort_direction, bool append_to_sort_specs)
|
|
|
|
+{
|
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
|
+ ImGuiTable* table = g.CurrentTable;
|
|
|
|
+
|
|
|
|
+ if (!(table->Flags & ImGuiTableFlags_MultiSortable))
|
|
|
|
+ append_to_sort_specs = false;
|
|
|
|
+
|
|
|
|
+ ImS8 sort_order_max = 0;
|
|
|
|
+ if (append_to_sort_specs)
|
|
|
|
+ for (int other_column_n = 0; other_column_n < table->ColumnsCount; other_column_n++)
|
|
|
|
+ sort_order_max = ImMax(sort_order_max, table->Columns[other_column_n].SortOrder);
|
|
|
|
+
|
|
|
|
+ ImGuiTableColumn* column = &table->Columns[column_n];
|
|
|
|
+ column->SortDirection = (ImS8)sort_direction;
|
|
|
|
+ if (column->SortOrder == -1 || !append_to_sort_specs)
|
|
|
|
+ column->SortOrder = append_to_sort_specs ? sort_order_max + 1 : 0;
|
|
|
|
+
|
|
|
|
+ for (int other_column_n = 0; other_column_n < table->ColumnsCount; other_column_n++)
|
|
|
|
+ {
|
|
|
|
+ ImGuiTableColumn* other_column = &table->Columns[other_column_n];
|
|
|
|
+ if (other_column != column && !append_to_sort_specs)
|
|
|
|
+ other_column->SortOrder = -1;
|
|
|
|
+ TableFixColumnSortDirection(other_column);
|
|
|
|
+ }
|
|
|
|
+ table->IsSettingsDirty = true;
|
|
|
|
+ table->IsSortSpecsDirty = true;
|
|
|
|
+}
|
|
|
|
+
|
|
void ImGui::TableSortSpecsSanitize(ImGuiTable* table)
|
|
void ImGui::TableSortSpecsSanitize(ImGuiTable* table)
|
|
{
|
|
{
|
|
IM_ASSERT(table->Flags & ImGuiTableFlags_Sortable);
|
|
IM_ASSERT(table->Flags & ImGuiTableFlags_Sortable);
|