mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 13:11:05 +01:00 
			
		
		
		
	Tables: Initial commit. [Squashed 123+5 commits from tables_wip/]
This commit is contained in:
		
							
								
								
									
										141
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										141
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -947,6 +947,7 @@ ImGuiStyle::ImGuiStyle() | ||||
|     FrameBorderSize         = 0.0f;             // Thickness of border around frames. Generally set to 0.0f or 1.0f. Other values not well tested. | ||||
|     ItemSpacing             = ImVec2(8,4);      // Horizontal and vertical spacing between widgets/lines | ||||
|     ItemInnerSpacing        = ImVec2(4,4);      // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label) | ||||
|     CellPadding             = ImVec2(4,2);      // Padding within a table cell | ||||
|     TouchExtraPadding       = ImVec2(0,0);      // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much! | ||||
|     IndentSpacing           = 21.0f;            // Horizontal spacing when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2). | ||||
|     ColumnsMinSpacing       = 6.0f;             // Minimum horizontal spacing between two columns. Preferably > (FramePadding.x + 1). | ||||
| @@ -987,6 +988,7 @@ void ImGuiStyle::ScaleAllSizes(float scale_factor) | ||||
|     FrameRounding = ImFloor(FrameRounding * scale_factor); | ||||
|     ItemSpacing = ImFloor(ItemSpacing * scale_factor); | ||||
|     ItemInnerSpacing = ImFloor(ItemInnerSpacing * scale_factor); | ||||
|     CellPadding = ImFloor(CellPadding * scale_factor); | ||||
|     TouchExtraPadding = ImFloor(TouchExtraPadding * scale_factor); | ||||
|     IndentSpacing = ImFloor(IndentSpacing * scale_factor); | ||||
|     ColumnsMinSpacing = ImFloor(ColumnsMinSpacing * scale_factor); | ||||
| @@ -2135,6 +2137,14 @@ void ImGuiTextBuffer::appendfv(const char* fmt, va_list args) | ||||
| // the API mid-way through development and support two ways to using the clipper, needs some rework (see TODO) | ||||
| //----------------------------------------------------------------------------- | ||||
|  | ||||
| // FIXME-TABLE: This prevents us from using ImGuiListClipper _inside_ a table cell. | ||||
| // The problem we have is that without a Begin/End scheme for rows using the clipper is ambiguous. | ||||
| static bool GetSkipItemForListClipping() | ||||
| { | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     return (g.CurrentTable ? g.CurrentTable->BackupSkipItems : g.CurrentWindow->SkipItems); | ||||
| } | ||||
|  | ||||
| // Helper to calculate coarse clipping of large list of evenly sized items. | ||||
| // NB: Prefer using the ImGuiListClipper higher-level helper if you can! Read comments and instructions there on how those use this sort of pattern. | ||||
| // NB: 'items_count' is only used to clamp the result, if you don't know your count you can use INT_MAX | ||||
| @@ -2149,7 +2159,7 @@ void ImGui::CalcListClipping(int items_count, float items_height, int* out_items | ||||
|         *out_items_display_end = items_count; | ||||
|         return; | ||||
|     } | ||||
|     if (window->SkipItems) | ||||
|     if (GetSkipItemForListClipping()) | ||||
|     { | ||||
|         *out_items_display_start = *out_items_display_end = 0; | ||||
|         return; | ||||
| @@ -2185,12 +2195,20 @@ static void SetCursorPosYAndSetupForPrevLine(float pos_y, float line_height) | ||||
|     // The clipper should probably have a 4th step to display the last item in a regular manner. | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     ImGuiWindow* window = g.CurrentWindow; | ||||
|     float off_y = pos_y - window->DC.CursorPos.y; | ||||
|     window->DC.CursorPos.y = pos_y; | ||||
|     window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, pos_y); | ||||
|     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 - g.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 (ImGuiOldColumns* columns = window->DC.CurrentColumns) | ||||
|         columns->LineMinY = window->DC.CursorPos.y;                         // Setting this so that cell Y position are set properly | ||||
|         columns->LineMinY = window->DC.CursorPos.y;                         // Setting this so that cell Y position are set properly // FIXME-TABLE | ||||
|     if (ImGuiTable* table = g.CurrentTable) | ||||
|     { | ||||
|         if (table->IsInsideRow) | ||||
|             ImGui::TableEndRow(table); | ||||
|         table->RowPosY2 = window->DC.CursorPos.y; | ||||
|         table->RowBgColorCounter += (int)((off_y / line_height) + 0.5f); | ||||
|     } | ||||
| } | ||||
|  | ||||
| ImGuiListClipper::ImGuiListClipper() | ||||
| @@ -2212,6 +2230,10 @@ void ImGuiListClipper::Begin(int items_count, float items_height) | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     ImGuiWindow* window = g.CurrentWindow; | ||||
|  | ||||
|     if (ImGuiTable* table = g.CurrentTable) | ||||
|         if (table->IsInsideRow) | ||||
|             ImGui::TableEndRow(table); | ||||
|  | ||||
|     StartPosY = window->DC.CursorPos.y; | ||||
|     ItemsHeight = items_height; | ||||
|     ItemsCount = items_count; | ||||
| @@ -2237,8 +2259,12 @@ bool ImGuiListClipper::Step() | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     ImGuiWindow* window = g.CurrentWindow; | ||||
|  | ||||
|     ImGuiTable* table = g.CurrentTable; | ||||
|     if (table && table->IsInsideRow) | ||||
|         ImGui::TableEndRow(table); | ||||
|  | ||||
|     // Reached end of list | ||||
|     if (DisplayEnd >= ItemsCount || window->SkipItems) | ||||
|     if (DisplayEnd >= ItemsCount || GetSkipItemForListClipping()) | ||||
|     { | ||||
|         End(); | ||||
|         return false; | ||||
| @@ -2266,7 +2292,17 @@ bool ImGuiListClipper::Step() | ||||
|     if (StepNo == 1) | ||||
|     { | ||||
|         IM_ASSERT(ItemsHeight <= 0.0f); | ||||
|         ItemsHeight = window->DC.CursorPos.y - StartPosY; | ||||
|         if (table) | ||||
|         { | ||||
|             const float pos_y1 = table->RowPosY1;   // Using this instead of StartPosY to handle clipper straddling the frozen row | ||||
|             const float pos_y2 = table->RowPosY2;   // Using this instead of CursorPos.y to take account of tallest cell. | ||||
|             ItemsHeight = pos_y2 - pos_y1; | ||||
|             window->DC.CursorPos.y = pos_y2; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             ItemsHeight = window->DC.CursorPos.y - StartPosY; | ||||
|         } | ||||
|         IM_ASSERT(ItemsHeight > 0.0f && "Unable to calculate item height! First item hasn't moved the cursor vertically!"); | ||||
|         StepNo = 2; | ||||
|     } | ||||
| @@ -2405,6 +2441,7 @@ static const ImGuiStyleVarInfo GStyleVarInfo[] = | ||||
|     { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemSpacing) },         // ImGuiStyleVar_ItemSpacing | ||||
|     { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemInnerSpacing) },    // ImGuiStyleVar_ItemInnerSpacing | ||||
|     { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, IndentSpacing) },       // ImGuiStyleVar_IndentSpacing | ||||
|     { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, CellPadding) },         // ImGuiStyleVar_CellPadding | ||||
|     { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ScrollbarSize) },       // ImGuiStyleVar_ScrollbarSize | ||||
|     { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ScrollbarRounding) },   // ImGuiStyleVar_ScrollbarRounding | ||||
|     { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, GrabMinSize) },         // ImGuiStyleVar_GrabMinSize | ||||
| @@ -2512,6 +2549,9 @@ const char* ImGui::GetStyleColorName(ImGuiCol idx) | ||||
|     case ImGuiCol_PlotLinesHovered: return "PlotLinesHovered"; | ||||
|     case ImGuiCol_PlotHistogram: return "PlotHistogram"; | ||||
|     case ImGuiCol_PlotHistogramHovered: return "PlotHistogramHovered"; | ||||
|     case ImGuiCol_TableHeaderBg: return "TableHeaderBg"; | ||||
|     case ImGuiCol_TableRowBg: return "TableRowBg"; | ||||
|     case ImGuiCol_TableRowBgAlt: return "TableRowBgAlt"; | ||||
|     case ImGuiCol_TextSelectedBg: return "TextSelectedBg"; | ||||
|     case ImGuiCol_DragDropTarget: return "DragDropTarget"; | ||||
|     case ImGuiCol_NavHighlight: return "NavHighlight"; | ||||
| @@ -3998,6 +4038,10 @@ void ImGui::Shutdown(ImGuiContext* context) | ||||
|     g.CurrentTabBarStack.clear(); | ||||
|     g.ShrinkWidthBuffer.clear(); | ||||
|  | ||||
|     g.Tables.Clear(); | ||||
|     g.CurrentTableStack.clear(); | ||||
|     g.DrawChannelsTempMergeBuffer.clear(); | ||||
|  | ||||
|     g.ClipboardHandlerData.clear(); | ||||
|     g.MenusIdSubmittedThisFrame.clear(); | ||||
|     g.InputTextState.ClearFreeMemory(); | ||||
| @@ -7374,7 +7418,7 @@ ImVec2 ImGui::GetContentRegionMax() | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     ImGuiWindow* window = g.CurrentWindow; | ||||
|     ImVec2 mx = window->ContentRegionRect.Max - window->Pos; | ||||
|     if (window->DC.CurrentColumns) | ||||
|     if (window->DC.CurrentColumns || g.CurrentTable) | ||||
|         mx.x = window->WorkRect.Max.x - window->Pos.x; | ||||
|     return mx; | ||||
| } | ||||
| @@ -7385,7 +7429,7 @@ ImVec2 ImGui::GetContentRegionMaxAbs() | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     ImGuiWindow* window = g.CurrentWindow; | ||||
|     ImVec2 mx = window->ContentRegionRect.Max; | ||||
|     if (window->DC.CurrentColumns) | ||||
|     if (window->DC.CurrentColumns || g.CurrentTable) | ||||
|         mx.x = window->WorkRect.Max.x; | ||||
|     return mx; | ||||
| } | ||||
| @@ -10459,6 +10503,23 @@ void ImGui::ShowMetricsWindow(bool* p_open) | ||||
|  | ||||
|     struct Funcs | ||||
|     { | ||||
|         static ImRect GetTableRect(ImGuiTable* table, int rect_type, int n) | ||||
|         { | ||||
|             if (rect_type == TRT_OuterRect)                 { return table->OuterRect; } | ||||
|             else if (rect_type == TRT_WorkRect)             { return table->WorkRect; } | ||||
|             else if (rect_type == TRT_HostClipRect)         { return table->HostClipRect; } | ||||
|             else if (rect_type == TRT_InnerClipRect)        { return table->InnerClipRect; } | ||||
|             else if (rect_type == TRT_BackgroundClipRect)   { return table->BackgroundClipRect; } | ||||
|             else if (rect_type == TRT_ColumnsRect)                  { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->MinX, table->InnerClipRect.Min.y, c->MaxX, table->InnerClipRect.Min.y + table->LastOuterHeight); } | ||||
|             else if (rect_type == TRT_ColumnsClipRect)              { ImGuiTableColumn* c = &table->Columns[n]; return c->ClipRect; } | ||||
|             else if (rect_type == TRT_ColumnsContentHeadersUsed)    { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->MinX, table->InnerClipRect.Min.y, c->MinX + c->ContentWidthHeadersUsed, table->InnerClipRect.Min.y + table->LastFirstRowHeight); }    // Note: y1/y2 not always accurate | ||||
|             else if (rect_type == TRT_ColumnsContentHeadersIdeal)   { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->MinX, table->InnerClipRect.Min.y, c->MinX + c->ContentWidthHeadersDesired, table->InnerClipRect.Min.y + table->LastFirstRowHeight); } // " | ||||
|             else if (rect_type == TRT_ColumnsContentRowsFrozen)     { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->MinX, table->InnerClipRect.Min.y, c->MinX + c->ContentWidthRowsFrozen, table->InnerClipRect.Min.y + table->LastFirstRowHeight); }     // " | ||||
|             else if (rect_type == TRT_ColumnsContentRowsUnfrozen)   { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->MinX, table->InnerClipRect.Min.y + table->LastFirstRowHeight, c->MinX + c->ContentWidthRowsUnfrozen, table->InnerClipRect.Max.y); }   // " | ||||
|             IM_ASSERT(0); | ||||
|             return ImRect(); | ||||
|         } | ||||
|  | ||||
|         static ImRect GetWindowRect(ImGuiWindow* window, int rect_type) | ||||
|         { | ||||
|             if (rect_type == WRT_OuterRect)                 { return window->Rect(); } | ||||
| @@ -10500,6 +10561,49 @@ void ImGui::ShowMetricsWindow(bool* p_open) | ||||
|         } | ||||
|         Checkbox("Show ImDrawCmd mesh when hovering", &cfg->ShowDrawCmdMesh); | ||||
|         Checkbox("Show ImDrawCmd bounding boxes when hovering", &cfg->ShowDrawCmdBoundingBoxes); | ||||
|  | ||||
|         Checkbox("Show tables rectangles", &cfg->ShowTablesRects); | ||||
|         SameLine(); | ||||
|         SetNextItemWidth(GetFontSize() * 12); | ||||
|         cfg->ShowTablesRects |= Combo("##show_table_rects_type", &cfg->ShowTablesRectsType, trt_rects_names, TRT_Count, TRT_Count); | ||||
|         if (cfg->ShowTablesRects && g.NavWindow != NULL) | ||||
|         { | ||||
|             for (int table_n = 0; table_n < g.Tables.GetSize(); table_n++) | ||||
|             { | ||||
|                 ImGuiTable* table = g.Tables.GetByIndex(table_n); | ||||
|                 if (table->LastFrameActive < g.FrameCount - 1 || table->OuterWindow != g.NavWindow) | ||||
|                     continue; | ||||
|  | ||||
|                 BulletText("Table 0x%08X (%d columns, in '%s')", table->ID, table->ColumnsCount, table->OuterWindow->Name); | ||||
|                 if (IsItemHovered()) | ||||
|                     GetForegroundDrawList()->AddRect(table->OuterRect.Min - ImVec2(1, 1), table->OuterRect.Max + ImVec2(1, 1), IM_COL32(255, 255, 0, 255), 0.0f, ~0, 2.0f); | ||||
|                 Indent(); | ||||
|                 for (int rect_n = 0; rect_n < TRT_Count; rect_n++) | ||||
|                 { | ||||
|                     if (rect_n >= TRT_ColumnsRect) | ||||
|                     { | ||||
|                         if (rect_n != TRT_ColumnsRect && rect_n != TRT_ColumnsClipRect) | ||||
|                             continue; | ||||
|                         for (int column_n = 0; column_n < table->ColumnsCount; column_n++) | ||||
|                         { | ||||
|                             ImRect r = Funcs::GetTableRect(table, rect_n, column_n); | ||||
|                             Text("(%6.1f,%6.1f) (%6.1f,%6.1f) Size (%6.1f,%6.1f) Col %d %s", r.Min.x, r.Min.y, r.Max.x, r.Max.y, r.GetWidth(), r.GetHeight(), column_n, trt_rects_names[rect_n]); | ||||
|                             if (IsItemHovered()) | ||||
|                                 GetForegroundDrawList()->AddRect(r.Min - ImVec2(1, 1), r.Max + ImVec2(1, 1), IM_COL32(255, 255, 0, 255), 0.0f, ~0, 2.0f); | ||||
|                         } | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         ImRect r = Funcs::GetTableRect(table, rect_n, -1); | ||||
|                         Text("(%6.1f,%6.1f) (%6.1f,%6.1f) Size (%6.1f,%6.1f) %s", r.Min.x, r.Min.y, r.Max.x, r.Max.y, r.GetWidth(), r.GetHeight(), trt_rects_names[rect_n]); | ||||
|                         if (IsItemHovered()) | ||||
|                             GetForegroundDrawList()->AddRect(r.Min - ImVec2(1, 1), r.Max + ImVec2(1, 1), IM_COL32(255, 255, 0, 255), 0.0f, ~0, 2.0f); | ||||
|                     } | ||||
|                 } | ||||
|                 Unindent(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         TreePop(); | ||||
|     } | ||||
|  | ||||
| @@ -10533,7 +10637,6 @@ void ImGui::ShowMetricsWindow(bool* p_open) | ||||
|     } | ||||
|  | ||||
|     // Details for Tables | ||||
|     IM_UNUSED(trt_rects_names); | ||||
| #ifdef IMGUI_HAS_TABLE | ||||
|     if (TreeNode("Tables", "Tables (%d)", g.Tables.GetSize())) | ||||
|     { | ||||
| @@ -10584,8 +10687,8 @@ void ImGui::ShowMetricsWindow(bool* p_open) | ||||
| #ifdef IMGUI_HAS_TABLE | ||||
|         if (TreeNode("SettingsTables", "Settings packed data: Tables: %d bytes", g.SettingsTables.size())) | ||||
|         { | ||||
|             for (ImGuiTableSettings* settings = g.SettingsTables.begin(); settings != NULL; settings = g.SettingsTables.next_chunk(settings)) | ||||
|                 DebugNodeTableSettings(settings); | ||||
|             //for (ImGuiTableSettings* settings = g.SettingsTables.begin(); settings != NULL; settings = g.SettingsTables.next_chunk(settings)) | ||||
|             //    DebugNodeTableSettings(settings); | ||||
|             TreePop(); | ||||
|         } | ||||
| #endif // #ifdef IMGUI_HAS_TABLE | ||||
| @@ -10664,11 +10767,29 @@ void ImGui::ShowMetricsWindow(bool* p_open) | ||||
|  | ||||
| #ifdef IMGUI_HAS_TABLE | ||||
|     // Overlay: Display Tables Rectangles | ||||
|     if (show_tables_rects) | ||||
|     if (cfg->ShowTablesRects) | ||||
|     { | ||||
|         for (int table_n = 0; table_n < g.Tables.GetSize(); table_n++) | ||||
|         { | ||||
|             ImGuiTable* table = g.Tables.GetByIndex(table_n); | ||||
|             if (table->LastFrameActive < g.FrameCount - 1) | ||||
|                 continue; | ||||
|             ImDrawList* draw_list = GetForegroundDrawList(table->OuterWindow); | ||||
|             if (cfg->ShowTablesRectsType >= TRT_ColumnsRect) | ||||
|             { | ||||
|                 for (int column_n = 0; column_n < table->ColumnsCount; column_n++) | ||||
|                 { | ||||
|                     ImRect r = Funcs::GetTableRect(table, cfg->ShowTablesRectsType, column_n); | ||||
|                     ImU32 col = (table->HoveredColumnBody == column_n) ? IM_COL32(255, 255, 128, 255) : IM_COL32(255, 0, 128, 255); | ||||
|                     float thickness = (table->HoveredColumnBody == column_n) ? 3.0f : 1.0f; | ||||
|                     draw_list->AddRect(r.Min, r.Max, col, 0.0f, ~0, thickness); | ||||
|                 } | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 ImRect r = Funcs::GetTableRect(table, cfg->ShowTablesRectsType, -1); | ||||
|                 draw_list->AddRect(r.Min, r.Max, IM_COL32(255, 0, 128, 255)); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| #endif // #ifdef IMGUI_HAS_TABLE | ||||
|   | ||||
							
								
								
									
										153
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										153
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -33,6 +33,8 @@ Index of this file: | ||||
| // Draw List API (ImDrawCallback, ImDrawCmd, ImDrawIdx, ImDrawVert, ImDrawChannel, ImDrawListSplitter, ImDrawListFlags, ImDrawList, ImDrawData) | ||||
| // Font API (ImFontConfig, ImFontGlyph, ImFontGlyphRangesBuilder, ImFontAtlasFlags, ImFontAtlas, ImFont) | ||||
|  | ||||
| // FIXME-TABLE: Add ImGuiTableSortSpecsColumn and ImGuiTableSortSpecs in "Misc data structures" section above (we don't do it right now to facilitate merging various branches) | ||||
|  | ||||
| */ | ||||
|  | ||||
| #pragma once | ||||
| @@ -136,6 +138,8 @@ struct ImGuiPayload;                // User data payload for drag and drop opera | ||||
| struct ImGuiSizeCallbackData;       // Callback data when using SetNextWindowSizeConstraints() (rare/advanced use) | ||||
| struct ImGuiStorage;                // Helper for key->value storage | ||||
| struct ImGuiStyle;                  // Runtime data for styling/colors | ||||
| struct ImGuiTableSortSpecs;         // Sorting specifications for a table (often handling sort specs for a single column, occasionally more) | ||||
| struct ImGuiTableSortSpecsColumn;   // Sorting specification for one column of a table | ||||
| struct ImGuiTextBuffer;             // Helper to hold and append into a text buffer (~string builder) | ||||
| struct ImGuiTextFilter;             // Helper to parse and apply text filters (e.g. "aaaaa[,bbbbb][,ccccc]") | ||||
|  | ||||
| @@ -151,6 +155,7 @@ typedef int ImGuiKey;               // -> enum ImGuiKey_             // Enum: A | ||||
| typedef int ImGuiNavInput;          // -> enum ImGuiNavInput_        // Enum: An input identifier for navigation | ||||
| typedef int ImGuiMouseButton;       // -> enum ImGuiMouseButton_     // Enum: A mouse button identifier (0=left, 1=right, 2=middle) | ||||
| typedef int ImGuiMouseCursor;       // -> enum ImGuiMouseCursor_     // Enum: A mouse cursor identifier | ||||
| typedef int ImGuiSortDirection;     // -> enum ImGuiSortDirection_   // Enum: A sorting direction (ascending or descending) | ||||
| typedef int ImGuiStyleVar;          // -> enum ImGuiStyleVar_        // Enum: A variable identifier for styling | ||||
| typedef int ImDrawCornerFlags;      // -> enum ImDrawCornerFlags_    // Flags: for ImDrawList::AddRect(), AddRectFilled() etc. | ||||
| typedef int ImDrawListFlags;        // -> enum ImDrawListFlags_      // Flags: for ImDrawList | ||||
| @@ -170,6 +175,9 @@ typedef int ImGuiSelectableFlags;   // -> enum ImGuiSelectableFlags_ // Flags: f | ||||
| typedef int ImGuiSliderFlags;       // -> enum ImGuiSliderFlags_     // Flags: for DragFloat(), DragInt(), SliderFloat(), SliderInt() etc. | ||||
| typedef int ImGuiTabBarFlags;       // -> enum ImGuiTabBarFlags_     // Flags: for BeginTabBar() | ||||
| typedef int ImGuiTabItemFlags;      // -> enum ImGuiTabItemFlags_    // Flags: for BeginTabItem() | ||||
| typedef int ImGuiTableFlags;        // -> enum ImGuiTableFlags_      // Flags: For BeginTable() | ||||
| typedef int ImGuiTableColumnFlags;  // -> enum ImGuiTableColumnFlags_// Flags: For TableSetupColumn()  | ||||
| typedef int ImGuiTableRowFlags;     // -> enum ImGuiTableRowFlags_   // Flags: For TableNextRow() | ||||
| typedef int ImGuiTreeNodeFlags;     // -> enum ImGuiTreeNodeFlags_   // Flags: for TreeNode(), TreeNodeEx(), CollapsingHeader() | ||||
| typedef int ImGuiWindowFlags;       // -> enum ImGuiWindowFlags_     // Flags: for Begin(), BeginChild() | ||||
|  | ||||
| @@ -657,6 +665,35 @@ namespace ImGui | ||||
|     IMGUI_API void          SetColumnOffset(int column_index, float offset_x);                  // set position of column line (in pixels, from the left side of the contents region). pass -1 to use current column | ||||
|     IMGUI_API int           GetColumnsCount(); | ||||
|  | ||||
|     // Tables | ||||
|     // [ALPHA API] API will evolve! (FIXME-TABLE) | ||||
|     // - Full-featured replacement for old Columns API | ||||
|     // - In most situations you can use TableNextRow() + TableSetColumnIndex() to populate a table. | ||||
|     // - If you are using tables as a sort of grid, populating every columns with the same type of contents, | ||||
|     //   you may prefer using TableNextCell() instead of TableNextRow() + TableSetColumnIndex(). | ||||
|     #define IMGUI_HAS_TABLE 1 | ||||
|     IMGUI_API bool          BeginTable(const char* str_id, int columns_count, ImGuiTableFlags flags = 0, const ImVec2& outer_size = ImVec2(0, 0), float inner_width = 0.0f); | ||||
|     IMGUI_API void          EndTable();                                 // only call EndTable() if BeginTable() returns true! | ||||
|     IMGUI_API void          TableNextRow(ImGuiTableRowFlags row_flags = 0, float min_row_height = 0.0f); // append into the first cell of a new row. | ||||
|     IMGUI_API bool          TableNextCell();                            // append into the next column (next column, or next row if currently in last column). Return true if column is visible. | ||||
|     IMGUI_API bool          TableSetColumnIndex(int column_n);          // append into the specified column. Return true if column is visible. | ||||
|     IMGUI_API int           TableGetColumnIndex();                      // return current column index. | ||||
|     IMGUI_API const char*   TableGetColumnName(int column_n = -1);      // return NULL if column didn't have a name declared by TableSetupColumn(). Use pass -1 to use current column. | ||||
|     IMGUI_API bool          TableGetColumnIsVisible(int column_n = -1); // return true if column is visible. Same value is also returned by TableNextCell() and TableSetColumnIndex(). Use pass -1 to use current column. | ||||
|     IMGUI_API bool          TableGetColumnIsSorted(int column_n = -1);  // return true if column is included in the sort specs. Rarely used, can be useful to tell if a data change should trigger resort. Equivalent to test ImGuiTableSortSpecs's ->ColumnsMask & (1 << column_n). Use pass -1 to use current column. | ||||
|     // Tables: Headers & Columns declaration | ||||
|     // - Use TableSetupColumn() to specify resizing policy, default width, name, id, specific flags etc. | ||||
|     // - The name passed to TableSetupColumn() is used by TableAutoHeaders() and by the context-menu | ||||
|     // - Use TableAutoHeaders() to submit the whole header row, otherwise you may treat the header row as a regular row, manually call TableHeader() and other widgets. | ||||
|     // - Headers are required to perform some interactions: reordering, sorting, context menu // FIXME-TABLES: remove context from this list! | ||||
|     IMGUI_API void          TableSetupColumn(const char* label, ImGuiTableColumnFlags flags = 0, float init_width_or_weight = -1.0f, ImU32 user_id = 0); | ||||
|     IMGUI_API void          TableAutoHeaders();                         // submit all headers cells based on data provided to TableSetupColumn() + submit context menu | ||||
|     IMGUI_API void          TableHeader(const char* label);             // submit one header cell manually. | ||||
|     // Tables: Sorting | ||||
|     // - Call TableGetSortSpecs() to retrieve latest sort specs for the table. Return value will be NULL if no sorting. | ||||
|     // - Read ->SpecsChanged to tell if the specs have changed since last call. | ||||
|     IMGUI_API const ImGuiTableSortSpecs* TableGetSortSpecs();           // get latest sort specs for the table (NULL if not sorting). | ||||
|  | ||||
|     // Tab Bars, Tabs | ||||
|     IMGUI_API bool          BeginTabBar(const char* str_id, ImGuiTabBarFlags flags = 0);        // create and append into a TabBar | ||||
|     IMGUI_API void          EndTabBar();                                                        // only call EndTabBar() if BeginTabBar() returns true! | ||||
| @@ -967,6 +1004,85 @@ enum ImGuiTabItemFlags_ | ||||
|     ImGuiTabItemFlags_Trailing                      = 1 << 7    // Enforce the tab position to the right of the tab bar (before the scrolling buttons) | ||||
| }; | ||||
|  | ||||
| // Flags for ImGui::BeginTable() | ||||
| enum ImGuiTableFlags_ | ||||
| { | ||||
|     // Features | ||||
|     ImGuiTableFlags_None                            = 0, | ||||
|     ImGuiTableFlags_Resizable                       = 1 << 0,   // Allow resizing columns. | ||||
|     ImGuiTableFlags_Reorderable                     = 1 << 1,   // Allow reordering columns (need calling TableSetupColumn() + TableAutoHeaders() or TableHeaders() to display headers) | ||||
|     ImGuiTableFlags_Hideable                        = 1 << 2,   // Allow hiding columns (with right-click on header) (FIXME-TABLE: allow without headers). | ||||
|     ImGuiTableFlags_Sortable                        = 1 << 3,   // Allow sorting on one column (sort_specs_count will always be == 1). Call TableGetSortSpecs() to obtain sort specs. | ||||
|     ImGuiTableFlags_MultiSortable                   = 1 << 4,   // Allow sorting on multiple columns by holding Shift (sort_specs_count may be > 1). Call TableGetSortSpecs() to obtain sort specs. | ||||
|     ImGuiTableFlags_NoSavedSettings                 = 1 << 5,   // Disable persisting columns order, width and sort settings in the .ini file. | ||||
|     // Decoration | ||||
|     ImGuiTableFlags_RowBg                           = 1 << 6,   // Use ImGuiCol_TableRowBg and ImGuiCol_TableRowBgAlt colors behind each rows. | ||||
|     ImGuiTableFlags_BordersOuter                    = 1 << 7,   // Draw outer borders. | ||||
|     ImGuiTableFlags_BordersV                        = 1 << 8,   // Draw vertical borders between columns. | ||||
|     ImGuiTableFlags_BordersH                        = 1 << 9,   // Draw horizontal borders between rows. | ||||
|     ImGuiTableFlags_BordersFullHeight               = 1 << 10,  // Borders covers all lines even when Headers are being used, allow resizing all rows. | ||||
|     ImGuiTableFlags_Borders                         = ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_BordersH, | ||||
|     // Padding, Sizing | ||||
|     ImGuiTableFlags_NoClipX                         = 1 << 12,  // Disable pushing clipping rectangle for every individual columns (reduce draw command count, items with be able to overflow) | ||||
|     ImGuiTableFlags_SizingPolicyStretchX            = 1 << 13,  // (Default if ScrollX is off) Columns will default to use ImGuiTableColumnFlags_WidthStretch. Fit all columns within available width. Fixed and Weighted columns allowed. | ||||
|     ImGuiTableFlags_SizingPolicyFixedX              = 1 << 14,  // (Default if ScrollX is on) Columns will default to use ImGuiTableColumnFlags_WidthFixed or WidthAuto. Enlarge as needed: enable scrollbar if ScrollX is enabled, otherwise extend parent window's contents rect. Only Fixed columns allowed. Weighted columns will calculate their width assuming no scrolling. | ||||
|     ImGuiTableFlags_NoHeadersWidth                  = 1 << 15,  // Disable header width contribute to automatic width calculation for every columns. | ||||
|     ImGuiTableFlags_NoHostExtendY                   = 1 << 16,  // (FIXME-TABLE: Reword as SizingPolicy?) Disable extending past the limit set by outer_size.y, only meaningful when neither of ScrollX|ScrollY are set (data below the limit will be clipped and not visible) | ||||
|     // Scrolling | ||||
|     ImGuiTableFlags_ScrollX                         = 1 << 17,  // Enable horizontal scrolling. Require 'outer_size' parameter of BeginTable() to specify the container size. Because this create a child window, ScrollY is currently generally recommended when using ScrollX. | ||||
|     ImGuiTableFlags_ScrollY                         = 1 << 18,  // Enable vertical scrolling. Require 'outer_size' parameter of BeginTable() to specify the container size. | ||||
|     ImGuiTableFlags_Scroll                          = ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY, | ||||
|     ImGuiTableFlags_ScrollFreezeRowsShift_          = 19,       // We can lock 1 to 3 rows (starting from the top). Encode each of those values as dedicated flags. | ||||
|     ImGuiTableFlags_ScrollFreezeTopRow              = 1 << ImGuiTableFlags_ScrollFreezeRowsShift_, | ||||
|     ImGuiTableFlags_ScrollFreeze2Rows               = 2 << ImGuiTableFlags_ScrollFreezeRowsShift_, | ||||
|     ImGuiTableFlags_ScrollFreeze3Rows               = 3 << ImGuiTableFlags_ScrollFreezeRowsShift_, | ||||
|     ImGuiTableFlags_ScrollFreezeColumnsShift_       = 21,       // We can lock 1 to 3 columns (starting from the left). Encode each of those values as dedicated flags. | ||||
|     ImGuiTableFlags_ScrollFreezeLeftColumn          = 1 << ImGuiTableFlags_ScrollFreezeColumnsShift_, | ||||
|     ImGuiTableFlags_ScrollFreeze2Columns            = 2 << ImGuiTableFlags_ScrollFreezeColumnsShift_, | ||||
|     ImGuiTableFlags_ScrollFreeze3Columns            = 3 << ImGuiTableFlags_ScrollFreezeColumnsShift_, | ||||
|  | ||||
|     // Combinations and masks | ||||
|     ImGuiTableFlags_SizingPolicyMaskX_              = ImGuiTableFlags_SizingPolicyStretchX | ImGuiTableFlags_SizingPolicyFixedX, | ||||
|     ImGuiTableFlags_ScrollFreezeRowsMask_           = 0x03 << ImGuiTableFlags_ScrollFreezeRowsShift_, | ||||
|     ImGuiTableFlags_ScrollFreezeColumnsMask_        = 0x03 << ImGuiTableFlags_ScrollFreezeColumnsShift_ | ||||
| }; | ||||
|  | ||||
| // Flags for ImGui::TableSetupColumn() | ||||
| // FIXME-TABLE: Rename to ImGuiColumns_*, stick old columns api flags in there under an obsolete api block | ||||
| enum ImGuiTableColumnFlags_ | ||||
| { | ||||
|     ImGuiTableColumnFlags_None                      = 0, | ||||
|     ImGuiTableColumnFlags_DefaultHide               = 1 << 0,   // Default as a hidden column. | ||||
|     ImGuiTableColumnFlags_DefaultSort               = 1 << 1,   // Default as a sorting column. | ||||
|     ImGuiTableColumnFlags_WidthFixed                = 1 << 2,   // Column will keep a fixed size, preferable with horizontal scrolling enabled (default if table sizing policy is SizingPolicyFixedX). | ||||
|     ImGuiTableColumnFlags_WidthStretch              = 1 << 3,   // Column will stretch, preferable with horizontal scrolling disabled (default if table sizing policy is SizingPolicyStretchX). | ||||
|     ImGuiTableColumnFlags_WidthAlwaysAutoResize     = 1 << 4,   // Column will keep resizing based on submitted contents (with a one frame delay) == Fixed with auto resize | ||||
|     ImGuiTableColumnFlags_NoResize                  = 1 << 5,   // Disable manual resizing. | ||||
|     ImGuiTableColumnFlags_NoClipX                   = 1 << 6,   // Disable clipping for this column (all NoClipX columns will render in a same draw command). | ||||
|     ImGuiTableColumnFlags_NoSort                    = 1 << 7,   // Disable ability to sort on this field (even if ImGuiTableFlags_Sortable is set on the table). | ||||
|     ImGuiTableColumnFlags_NoSortAscending           = 1 << 8,   // Disable ability to sort in the ascending direction. | ||||
|     ImGuiTableColumnFlags_NoSortDescending          = 1 << 9,   // Disable ability to sort in the descending direction. | ||||
|     ImGuiTableColumnFlags_NoHide                    = 1 << 10,  // Disable hiding this column. | ||||
|     ImGuiTableColumnFlags_NoHeaderWidth             = 1 << 11,  // Header width don't contribute to automatic column width. | ||||
|     ImGuiTableColumnFlags_PreferSortAscending       = 1 << 12,  // Make the initial sort direction Ascending when first sorting on this column (default). | ||||
|     ImGuiTableColumnFlags_PreferSortDescending      = 1 << 13,  // Make the initial sort direction Descending when first sorting on this column. | ||||
|     //ImGuiTableColumnFlags_AlignLeft               = 1 << 14, | ||||
|     //ImGuiTableColumnFlags_AlignCenter             = 1 << 15, | ||||
|     //ImGuiTableColumnFlags_AlignRight              = 1 << 16, | ||||
|  | ||||
|     // Combinations and masks | ||||
|     ImGuiTableColumnFlags_WidthMask_                = ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_WidthAlwaysAutoResize, | ||||
|     ImGuiTableColumnFlags_NoDirectResize_           = 1 << 20   // [Internal] Disable user resizing this column directly (it may however we resized indirectly from its left edge) | ||||
|     //ImGuiTableColumnFlags_AlignMask_              = ImGuiTableColumnFlags_AlignLeft | ImGuiTableColumnFlags_AlignCenter | ImGuiTableColumnFlags_AlignRight | ||||
| }; | ||||
|  | ||||
| // Flags for ImGui::TableNextRow() | ||||
| enum ImGuiTableRowFlags_ | ||||
| { | ||||
|     ImGuiTableRowFlags_None                         = 0, | ||||
|     ImGuiTableRowFlags_Headers                      = 1 << 0    // Identify header row (set default background color + width of its contents accounted different for auto column width) | ||||
| }; | ||||
|  | ||||
| // Flags for ImGui::IsWindowFocused() | ||||
| enum ImGuiFocusedFlags_ | ||||
| { | ||||
| @@ -1044,6 +1160,14 @@ enum ImGuiDir_ | ||||
|     ImGuiDir_COUNT | ||||
| }; | ||||
|  | ||||
| // A sorting direction | ||||
| enum ImGuiSortDirection_ | ||||
| { | ||||
|     ImGuiSortDirection_None         = 0, | ||||
|     ImGuiSortDirection_Ascending    = 1,    // Ascending = 0->9, A->Z etc. | ||||
|     ImGuiSortDirection_Descending   = 2     // Descending = 9->0, Z->A etc. | ||||
| }; | ||||
|  | ||||
| // User fill ImGuiIO.KeyMap[] array with indices into the ImGuiIO.KeysDown[512] array | ||||
| enum ImGuiKey_ | ||||
| { | ||||
| @@ -1188,6 +1312,9 @@ enum ImGuiCol_ | ||||
|     ImGuiCol_PlotLinesHovered, | ||||
|     ImGuiCol_PlotHistogram, | ||||
|     ImGuiCol_PlotHistogramHovered, | ||||
|     ImGuiCol_TableHeaderBg,         // Table header background | ||||
|     ImGuiCol_TableRowBg,            // Table row background (even rows) | ||||
|     ImGuiCol_TableRowBgAlt,         // Table row background (odd rows) | ||||
|     ImGuiCol_TextSelectedBg, | ||||
|     ImGuiCol_DragDropTarget, | ||||
|     ImGuiCol_NavHighlight,          // Gamepad/keyboard: current highlighted item | ||||
| @@ -1228,6 +1355,7 @@ enum ImGuiStyleVar_ | ||||
|     ImGuiStyleVar_ItemSpacing,         // ImVec2    ItemSpacing | ||||
|     ImGuiStyleVar_ItemInnerSpacing,    // ImVec2    ItemInnerSpacing | ||||
|     ImGuiStyleVar_IndentSpacing,       // float     IndentSpacing | ||||
|     ImGuiStyleVar_CellPadding,         // ImVec2    CellPadding | ||||
|     ImGuiStyleVar_ScrollbarSize,       // float     ScrollbarSize | ||||
|     ImGuiStyleVar_ScrollbarRounding,   // float     ScrollbarRounding | ||||
|     ImGuiStyleVar_GrabMinSize,         // float     GrabMinSize | ||||
| @@ -1464,6 +1592,7 @@ struct ImGuiStyle | ||||
|     float       FrameBorderSize;            // Thickness of border around frames. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly). | ||||
|     ImVec2      ItemSpacing;                // Horizontal and vertical spacing between widgets/lines. | ||||
|     ImVec2      ItemInnerSpacing;           // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label). | ||||
|     ImVec2      CellPadding;                // Padding within a table cell | ||||
|     ImVec2      TouchExtraPadding;          // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much! | ||||
|     float       IndentSpacing;              // Horizontal indentation when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2). | ||||
|     float       ColumnsMinSpacing;          // Minimum horizontal spacing between two columns. Preferably > (FramePadding.x + 1). | ||||
| @@ -1700,6 +1829,30 @@ struct ImGuiPayload | ||||
|     bool IsDelivery() const                 { return Delivery; } | ||||
| }; | ||||
|  | ||||
| // Sorting specification for one column of a table (sizeof == 8 bytes) | ||||
| struct ImGuiTableSortSpecsColumn | ||||
| { | ||||
|     ImGuiID         ColumnUserID;       // User id of the column (if specified by a TableSetupColumn() call) | ||||
|     ImU8            ColumnIndex;        // Index of the column | ||||
|     ImU8            SortOrder;          // Index within parent ImGuiTableSortSpecs (always stored in order starting from 0, tables sorted on a single criteria will always have a 0 here) | ||||
|     ImS8            SortSign;           // +1 or -1 (you can use this or SortDirection, whichever is more convenient for your sort function) | ||||
|     ImS8            SortDirection;      // ImGuiSortDirection_Ascending or ImGuiSortDirection_Descending (you can use this or SortSign, whichever is more convenient for your sort function) | ||||
|  | ||||
|     ImGuiTableSortSpecsColumn() { ColumnUserID = 0; ColumnIndex = 0; SortOrder = 0; SortSign = +1; SortDirection = ImGuiSortDirection_Ascending; } | ||||
| }; | ||||
|  | ||||
| // Sorting specifications for a table (often handling sort specs for a single column, occasionally more) | ||||
| // Obtained by calling TableGetSortSpecs() | ||||
| struct ImGuiTableSortSpecs | ||||
| { | ||||
|     const ImGuiTableSortSpecsColumn* Specs;     // Pointer to sort spec array. | ||||
|     int                         SpecsCount;     // Sort spec count. Most often 1 unless e.g. ImGuiTableFlags_MultiSortable is enabled. | ||||
|     bool                        SpecsChanged;   // Set to true by TableGetSortSpecs() call if the specs have changed since the previous call. | ||||
|     ImU64                       ColumnsMask;    // Set to the mask of column indexes included in the Specs array. e.g. (1 << N) when column N is sorted. | ||||
|  | ||||
|     ImGuiTableSortSpecs()       { Specs = NULL; SpecsCount = 0; SpecsChanged = false; ColumnsMask = 0x00; } | ||||
| }; | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
| // Obsolete functions (Will be removed! Read 'API BREAKING CHANGES' section in imgui.cpp for details) | ||||
| // Please keep your copy of dear imgui up to date! Occasionally set '#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS' in imconfig.h to stay ahead. | ||||
|   | ||||
| @@ -222,6 +222,9 @@ void ImGui::StyleColorsDark(ImGuiStyle* dst) | ||||
|     colors[ImGuiCol_PlotLinesHovered]       = ImVec4(1.00f, 0.43f, 0.35f, 1.00f); | ||||
|     colors[ImGuiCol_PlotHistogram]          = ImVec4(0.90f, 0.70f, 0.00f, 1.00f); | ||||
|     colors[ImGuiCol_PlotHistogramHovered]   = ImVec4(1.00f, 0.60f, 0.00f, 1.00f); | ||||
|     colors[ImGuiCol_TableHeaderBg]          = ImVec4(0.19f, 0.19f, 0.20f, 1.00f); | ||||
|     colors[ImGuiCol_TableRowBg]             = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); | ||||
|     colors[ImGuiCol_TableRowBgAlt]          = ImVec4(1.00f, 1.00f, 1.00f, 0.07f); | ||||
|     colors[ImGuiCol_TextSelectedBg]         = ImVec4(0.26f, 0.59f, 0.98f, 0.35f); | ||||
|     colors[ImGuiCol_DragDropTarget]         = ImVec4(1.00f, 1.00f, 0.00f, 0.90f); | ||||
|     colors[ImGuiCol_NavHighlight]           = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); | ||||
| @@ -277,6 +280,9 @@ void ImGui::StyleColorsClassic(ImGuiStyle* dst) | ||||
|     colors[ImGuiCol_PlotLinesHovered]       = ImVec4(0.90f, 0.70f, 0.00f, 1.00f); | ||||
|     colors[ImGuiCol_PlotHistogram]          = ImVec4(0.90f, 0.70f, 0.00f, 1.00f); | ||||
|     colors[ImGuiCol_PlotHistogramHovered]   = ImVec4(1.00f, 0.60f, 0.00f, 1.00f); | ||||
|     colors[ImGuiCol_TableHeaderBg]          = ImVec4(0.27f, 0.27f, 0.38f, 1.00f); | ||||
|     colors[ImGuiCol_TableRowBg]             = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); | ||||
|     colors[ImGuiCol_TableRowBgAlt]          = ImVec4(1.00f, 1.00f, 1.00f, 0.07f); | ||||
|     colors[ImGuiCol_TextSelectedBg]         = ImVec4(0.00f, 0.00f, 1.00f, 0.35f); | ||||
|     colors[ImGuiCol_DragDropTarget]         = ImVec4(1.00f, 1.00f, 0.00f, 0.90f); | ||||
|     colors[ImGuiCol_NavHighlight]           = colors[ImGuiCol_HeaderHovered]; | ||||
| @@ -333,6 +339,9 @@ void ImGui::StyleColorsLight(ImGuiStyle* dst) | ||||
|     colors[ImGuiCol_PlotLinesHovered]       = ImVec4(1.00f, 0.43f, 0.35f, 1.00f); | ||||
|     colors[ImGuiCol_PlotHistogram]          = ImVec4(0.90f, 0.70f, 0.00f, 1.00f); | ||||
|     colors[ImGuiCol_PlotHistogramHovered]   = ImVec4(1.00f, 0.45f, 0.00f, 1.00f); | ||||
|     colors[ImGuiCol_TableHeaderBg]          = ImVec4(0.78f, 0.87f, 0.98f, 1.00f); | ||||
|     colors[ImGuiCol_TableRowBg]             = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); | ||||
|     colors[ImGuiCol_TableRowBgAlt]          = ImVec4(0.30f, 0.30f, 0.30f, 0.07f); | ||||
|     colors[ImGuiCol_TextSelectedBg]         = ImVec4(0.26f, 0.59f, 0.98f, 0.35f); | ||||
|     colors[ImGuiCol_DragDropTarget]         = ImVec4(0.26f, 0.59f, 0.98f, 0.95f); | ||||
|     colors[ImGuiCol_NavHighlight]           = colors[ImGuiCol_HeaderHovered]; | ||||
|   | ||||
							
								
								
									
										224
									
								
								imgui_internal.h
									
									
									
									
									
								
							
							
						
						
									
										224
									
								
								imgui_internal.h
									
									
									
									
									
								
							| @@ -111,6 +111,10 @@ struct ImGuiStackSizes;             // Storage of stack sizes for debugging/asse | ||||
| struct ImGuiStyleMod;               // Stacked style modifier, backup of modified data so we can restore it | ||||
| struct ImGuiTabBar;                 // Storage for a tab bar | ||||
| struct ImGuiTabItem;                // Storage for a tab item (within a tab bar) | ||||
| struct ImGuiTable;                  // Storage for a table | ||||
| struct ImGuiTableColumn;            // Storage for one column of a table | ||||
| struct ImGuiTableSettings;          // Storage for a table .ini settings | ||||
| struct ImGuiTableColumnsSettings;   // Storage for a column .ini settings | ||||
| struct ImGuiWindow;                 // Storage for one window | ||||
| struct ImGuiWindowTempData;         // Temporary storage for one window (that's the data which in theory we could ditch at the end of the frame) | ||||
| struct ImGuiWindowSettings;         // Storage for a window .ini settings (we keep one of those even if the actual window wasn't instanced during this session) | ||||
| @@ -264,6 +268,7 @@ IMGUI_API ImU32         ImAlphaBlendColors(ImU32 col_a, ImU32 col_b); | ||||
|  | ||||
| // Helpers: Bit manipulation | ||||
| static inline bool      ImIsPowerOfTwo(int v)           { return v != 0 && (v & (v - 1)) == 0; } | ||||
| static inline bool      ImIsPowerOfTwo(ImU64 v)         { return v != 0 && (v & (v - 1)) == 0; } | ||||
| static inline int       ImUpperPowerOfTwo(int v)        { v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; return v; } | ||||
|  | ||||
| // Helpers: String, Formatting | ||||
| @@ -1329,6 +1334,12 @@ struct ImGuiContext | ||||
|     ImVector<unsigned char> DragDropPayloadBufHeap;             // We don't expose the ImVector<> directly, ImGuiPayload only holds pointer+size | ||||
|     unsigned char           DragDropPayloadBufLocal[16];        // Local buffer for small payloads | ||||
|  | ||||
|     // Table | ||||
|     ImGuiTable*                     CurrentTable; | ||||
|     ImPool<ImGuiTable>              Tables; | ||||
|     ImVector<ImGuiPtrOrIndex>       CurrentTableStack; | ||||
|     ImVector<ImDrawChannel>         DrawChannelsTempMergeBuffer; | ||||
|  | ||||
|     // Tab bars | ||||
|     ImGuiTabBar*                    CurrentTabBar; | ||||
|     ImPool<ImGuiTabBar>             TabBars; | ||||
| @@ -1366,6 +1377,7 @@ struct ImGuiContext | ||||
|     ImGuiTextBuffer         SettingsIniData;                    // In memory .ini settings | ||||
|     ImVector<ImGuiSettingsHandler>      SettingsHandlers;       // List of .ini settings handlers | ||||
|     ImChunkStream<ImGuiWindowSettings>  SettingsWindows;        // ImGuiWindow .ini settings entries | ||||
|     ImChunkStream<ImGuiTableSettings>   SettingsTables;         // ImGuiTable .ini settings entries | ||||
|     ImVector<ImGuiContextHook>          Hooks;                  // Hooks for extensions (e.g. test engine) | ||||
|  | ||||
|     // Capture/Logging | ||||
| @@ -1496,6 +1508,7 @@ struct ImGuiContext | ||||
|         DragDropHoldJustPressedId = 0; | ||||
|         memset(DragDropPayloadBufLocal, 0, sizeof(DragDropPayloadBufLocal)); | ||||
|  | ||||
|         CurrentTable = NULL; | ||||
|         CurrentTabBar = NULL; | ||||
|  | ||||
|         LastValidMousePos = ImVec2(0.0f, 0.0f); | ||||
| @@ -1581,6 +1594,7 @@ struct IMGUI_API ImGuiWindowTempData | ||||
|     ImVector<ImGuiWindow*>  ChildWindows; | ||||
|     ImGuiStorage*           StateStorage;           // Current persistent per-window storage (store e.g. tree node open/close state) | ||||
|     ImGuiOldColumns*        CurrentColumns;         // Current columns set | ||||
|     ImGuiTable*             CurrentTable;           // Current table set | ||||
|     ImGuiLayoutType         LayoutType; | ||||
|     ImGuiLayoutType         ParentLayoutType;       // Layout type of parent window at the time of Begin() | ||||
|     int                     FocusCounterRegular;    // (Legacy Focus/Tabbing system) Sequential counter, start at -1 and increase as assigned via FocusableItemRegister() (FIXME-NAV: Needs redesign) | ||||
| @@ -1805,7 +1819,185 @@ struct ImGuiTabBar | ||||
| //----------------------------------------------------------------------------- | ||||
|  | ||||
| #ifdef IMGUI_HAS_TABLE | ||||
| // <this is filled in 'tables' branch> | ||||
|  | ||||
| #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. | ||||
|  | ||||
| // [Internal] sizeof() ~ 96 | ||||
| struct ImGuiTableColumn | ||||
| { | ||||
|     ImGuiID                 UserID;                         // Optional, value passed to TableSetupColumn() | ||||
|     ImGuiTableColumnFlags   FlagsIn;                        // Flags as input by user. See ImGuiTableColumnFlags_ | ||||
|     ImGuiTableColumnFlags   Flags;                          // Effective flags. See ImGuiTableColumnFlags_ | ||||
|     float                   ResizeWeight;                   //  ~1.0f. Master width data when (Flags & _WidthStretch) | ||||
|     float                   MinX;                           // Absolute positions | ||||
|     float                   MaxX; | ||||
|     float                   WidthRequested;                 // Master width data when !(Flags & _WidthStretch) | ||||
|     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                   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                   ContentMaxPosRowsUnfrozen;      // (kept as float because we need to manipulate those between each cell change) | ||||
|     float                   ContentMaxPosHeadersUsed; | ||||
|     float                   ContentMaxPosHeadersDesired; | ||||
|     ImRect                  ClipRect; | ||||
|     ImS16                   NameOffset;                     // Offset into parent ColumnsName[] | ||||
|     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; | ||||
|     ImS8                    IndexDisplayOrder;              // Index within DisplayOrder[] (column may be reordered by users) | ||||
|     ImS8                    IndexWithinActiveSet;           // Index within active set (<= IndexOrder) | ||||
|     ImS8                    DrawChannelCurrent;             // Index within DrawSplitter.Channels[] | ||||
|     ImS8                    DrawChannelRowsBeforeFreeze; | ||||
|     ImS8                    DrawChannelRowsAfterFreeze; | ||||
|     ImS8                    PrevActiveColumn;               // Index of prev active column within Columns[], -1 if first active column | ||||
|     ImS8                    NextActiveColumn;               // Index of next active column within Columns[], -1 if last active column | ||||
|     ImS8                    AutoFitFrames; | ||||
|     ImS8                    SortOrder;                      // -1: Not sorting on this column | ||||
|     ImS8                    SortDirection;                  // enum ImGuiSortDirection_ | ||||
|  | ||||
|     ImGuiTableColumn() | ||||
|     { | ||||
|         memset(this, 0, sizeof(*this)); | ||||
|         ResizeWeight = 1.0f; | ||||
|         WidthRequested = WidthGiven = -1.0f; | ||||
|         NameOffset = -1; | ||||
|         IsActive = NextIsActive = true; | ||||
|         IndexDisplayOrder = IndexWithinActiveSet = -1; | ||||
|         DrawChannelCurrent = DrawChannelRowsBeforeFreeze = DrawChannelRowsAfterFreeze = -1; | ||||
|         PrevActiveColumn = NextActiveColumn = -1; | ||||
|         AutoFitFrames = 3; | ||||
|         SortOrder = -1; | ||||
|         SortDirection = ImGuiSortDirection_Ascending; | ||||
|     } | ||||
| }; | ||||
|  | ||||
| // FIXME-OPT: Since CountColumns is invariant, we could use a single alloc for ImGuiTable + the three vectors it is carrying. | ||||
| struct ImGuiTable | ||||
| { | ||||
|     ImGuiID                     ID; | ||||
|     ImGuiTableFlags             Flags; | ||||
|     ImVector<ImGuiTableColumn>  Columns; | ||||
|     ImVector<ImU8>              DisplayOrder;               // Store display order of columns (when not reordered, the values are 0...Count-1) | ||||
|     ImU64                       ActiveMaskByIndex;          // Column Index -> IsActive map (Active == not hidden by user/api) in a format adequate for iterating column without touching cold data | ||||
|     ImU64                       ActiveMaskByDisplayOrder;   // Column DisplayOrder -> IsActive map | ||||
|     ImGuiTableFlags             SettingsSaveFlags;          // Pre-compute which data we are going to save into the .ini file (e.g. when order is not altered we won't save order) | ||||
|     int                         SettingsOffset;             // Offset in g.SettingsTables | ||||
|     int                         LastFrameActive; | ||||
|     int                         ColumnsCount;               // Number of columns declared in BeginTable() | ||||
|     int                         ColumnsActiveCount;         // Number of non-hidden columns (<= ColumnsCount) | ||||
|     int                         CurrentColumn; | ||||
|     int                         CurrentRow; | ||||
|     float                       RowPosY1; | ||||
|     float                       RowPosY2; | ||||
|     float                       RowTextBaseline; | ||||
|     ImGuiTableRowFlags          RowFlags : 16;              // Current row flags, see ImGuiTableRowFlags_ | ||||
|     ImGuiTableRowFlags          LastRowFlags : 16; | ||||
|     int                         RowBgColorCounter;          // Counter for alternating background colors (can be fast-forwarded by e.g clipper) | ||||
|     ImU32                       RowBgColor;                 // Request for current row background color | ||||
|     ImU32                       BorderOuterColor; | ||||
|     ImU32                       BorderInnerColor; | ||||
|     float                       BorderX1; | ||||
|     float                       BorderX2; | ||||
|     float                       CellPaddingX1;              // Padding from each borders | ||||
|     float                       CellPaddingX2; | ||||
|     float                       CellPaddingY; | ||||
|     float                       CellSpacingX;               // Spacing between non-bordered cells | ||||
|     float                       LastOuterHeight;            // Outer height from last frame | ||||
|     float                       LastFirstRowHeight;         // Height of first row from last frame | ||||
|     float                       ColumnsTotalWidth; | ||||
|     float                       InnerWidth; | ||||
|     ImRect                      OuterRect;                  // Note: OuterRect.Max.y is often FLT_MAX until EndTable(), unless a height has been specified in BeginTable(). | ||||
|     ImRect                      WorkRect; | ||||
|     ImRect                      HostClipRect;               // This is used to check if we can eventually merge our columns draw calls into the current draw call of the current window. | ||||
|     ImRect                      InnerClipRect; | ||||
|     ImRect                      BackgroundClipRect;         // We use this to cpu-clip cell background color fill | ||||
|     ImGuiWindow*                OuterWindow;                // Parent window for the table | ||||
|     ImGuiWindow*                InnerWindow;                // Window holding the table data (== OuterWindow or a child window) | ||||
|     ImGuiTextBuffer             ColumnsNames;               // Contiguous buffer holding columns names | ||||
|     ImDrawListSplitter          DrawSplitter;               // We carry our own ImDrawList splitter to allow recursion (could be stored outside?) | ||||
|     ImVector<ImGuiTableSortSpecsColumn> SortSpecsData;      // FIXME-OPT: Fixed-size array / small-vector pattern, optimize for single sort spec | ||||
|     ImGuiTableSortSpecs         SortSpecs;                  // Public facing sorts specs, this is what we return in TableGetSortSpecs() | ||||
|     ImS8                        SortSpecsCount; | ||||
|     ImS8                        DeclColumnsCount;           // Count calls to TableSetupColumn() | ||||
|     ImS8                        HoveredColumnBody;          // [DEBUG] Unlike HoveredColumnBorder this doesn't fulfill all Hovering rules properly. Used for debugging/tools for now. | ||||
|     ImS8                        HoveredColumnBorder;        // Index of column whose right-border is being hovered (for resizing). | ||||
|     ImS8                        ResizedColumn;              // Index of column being resized. | ||||
|     ImS8                        LastResizedColumn; | ||||
|     ImS8                        ReorderColumn;              // Index of column being reordered. (not cleared) | ||||
|     ImS8                        ReorderColumnDir;           // -1 or +1 | ||||
|     ImS8                        RightMostActiveColumn;      // Index of right-most non-hidden column. | ||||
|     ImS8                        LeftMostStretchedColumnDisplayOrder; // Display order of left-most stretched column. | ||||
|     ImS8                        ContextPopupColumn;         // Column right-clicked on, of -1 if opening context menu from a neutral/empty spot | ||||
|     ImS8                        DummyDrawChannel;           // Redirect non-visible columns here. | ||||
|     ImS8                        FreezeRowsRequest;          // Requested frozen rows count | ||||
|     ImS8                        FreezeRowsCount;            // Actual frozen row count (== FreezeRowsRequest, or == 0 when no scrolling offset) | ||||
|     ImS8                        FreezeColumnsRequest;       // Requested frozen columns count | ||||
|     ImS8                        FreezeColumnsCount;         // Actual frozen columns count (== FreezeColumnsRequest, or == 0 when no scrolling offset) | ||||
|     bool                        IsLayoutLocked;             // Set by TableUpdateLayout() which is called when beginning the first row. | ||||
|     bool                        IsInsideRow;                // Set if inside TableBeginRow()/TableEndRow(). | ||||
|     bool                        IsFirstFrame; | ||||
|     bool                        IsSortSpecsDirty; | ||||
|     bool                        IsUsingHeaders;             // Set if the first row had the ImGuiTableRowFlags_Headers flag. | ||||
|     bool                        IsContextPopupOpen; | ||||
|     bool                        IsSettingsRequestLoad; | ||||
|     bool                        IsSettingsLoaded; | ||||
|     bool                        IsSettingsDirty;            // Set when table settings have changed and needs to be reported into ImGuiTableSetttings data. | ||||
|     bool                        IsDefaultDisplayOrder;      // Set when display order is unchanged from default (DisplayOrder contains 0...Count-1) | ||||
|     bool                        IsResetDisplayOrderRequest; | ||||
|     bool                        IsFreezeRowsPassed;         // Set when we got past the frozen row (the first one). | ||||
|     bool                        BackupSkipItems;            // Backup of InnerWindow->SkipItem at the end of BeginTable(), because we will overwrite InnerWindow->SkipItem on a per-column basis | ||||
|     ImRect                      BackupWorkRect;             // Backup of InnerWindow->WorkRect at the end of BeginTable() | ||||
|     ImVec2                      BackupCursorMaxPos;         // Backup of InnerWindow->DC.CursorMaxPos at the end of BeginTable() | ||||
|  | ||||
|     ImGuiTable() | ||||
|     { | ||||
|         memset(this, 0, sizeof(*this)); | ||||
|         SettingsOffset = -1; | ||||
|         LastFrameActive = -1; | ||||
|         LastResizedColumn = -1; | ||||
|         ContextPopupColumn = -1; | ||||
|         ReorderColumn = -1; | ||||
|     } | ||||
| }; | ||||
|  | ||||
| // sizeof() ~ 12 | ||||
| struct ImGuiTableColumnSettings | ||||
| { | ||||
|     float   WidthOrWeight; | ||||
|     ImGuiID UserID; | ||||
|     ImS8    Index; | ||||
|     ImS8    DisplayOrder; | ||||
|     ImS8    SortOrder; | ||||
|     ImS8    SortDirection : 7; | ||||
|     ImU8    Visible : 1;        // This is called Active in ImGuiTableColumn, in .ini file we call it Visible. | ||||
|  | ||||
|     ImGuiTableColumnSettings() | ||||
|     { | ||||
|         WidthOrWeight = 0.0f; | ||||
|         UserID = 0; | ||||
|         Index = -1; | ||||
|         DisplayOrder = SortOrder = -1; | ||||
|         SortDirection = ImGuiSortDirection_None; | ||||
|         Visible = 1; | ||||
|     } | ||||
| }; | ||||
|  | ||||
| // This is designed to be stored in a single ImChunkStream (1 header followed by N ImGuiTableColumnSettings, etc.) | ||||
| struct ImGuiTableSettings | ||||
| { | ||||
|     ImGuiID                     ID;                     // Set to 0 to invalidate/delete the setting | ||||
|     ImGuiTableFlags             SaveFlags; | ||||
|     ImS8                        ColumnsCount; | ||||
|     ImS8                        ColumnsCountMax; | ||||
|  | ||||
|     ImGuiTableSettings()        { memset(this, 0, sizeof(*this)); } | ||||
|     ImGuiTableColumnSettings*   GetColumnSettings()     { return (ImGuiTableColumnSettings*)(this + 1); } | ||||
| }; | ||||
|  | ||||
| #endif // #ifdef IMGUI_HAS_TABLE | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
| @@ -1977,6 +2169,35 @@ namespace ImGui | ||||
|     IMGUI_API float         GetColumnOffsetFromNorm(const ImGuiOldColumns* columns, float offset_norm); | ||||
|     IMGUI_API float         GetColumnNormFromOffset(const ImGuiOldColumns* columns, float offset); | ||||
|  | ||||
|     // Tables | ||||
|     //IMGUI_API int         GetTableColumnNo(); | ||||
|     //IMGUI_API bool        SetTableColumnNo(int column_n); | ||||
|     //IMGUI_API int         GetTableLineNo(); | ||||
|     IMGUI_API void          TableBeginInitVisibility(ImGuiTable* table); | ||||
|     IMGUI_API void          TableBeginInitDrawChannels(ImGuiTable* table); | ||||
|     IMGUI_API void          TableUpdateLayout(ImGuiTable* table); | ||||
|     IMGUI_API void          TableUpdateBorders(ImGuiTable* table); | ||||
|     IMGUI_API void          TableSetColumnWidth(ImGuiTable* table, ImGuiTableColumn* column, float width); | ||||
|     IMGUI_API void          TableDrawBorders(ImGuiTable* table); | ||||
|     IMGUI_API void          TableDrawMergeChannels(ImGuiTable* table); | ||||
|     IMGUI_API void          TableDrawContextMenu(ImGuiTable* table, int column_n); | ||||
|     IMGUI_API void          TableSortSpecsClickColumn(ImGuiTable* table, ImGuiTableColumn* column, bool add_to_existing_sort_orders); | ||||
|     IMGUI_API void          TableSortSpecsSanitize(ImGuiTable* table); | ||||
|     IMGUI_API void          TableBeginRow(ImGuiTable* table); | ||||
|     IMGUI_API void          TableEndRow(ImGuiTable* table); | ||||
|     IMGUI_API void          TableBeginCell(ImGuiTable* table, int column_no); | ||||
|     IMGUI_API void          TableEndCell(ImGuiTable* table); | ||||
|     IMGUI_API ImRect        TableGetCellRect(); | ||||
|     IMGUI_API const char*   TableGetColumnName(ImGuiTable* table, int column_no); | ||||
|     IMGUI_API void          PushTableBackground(); | ||||
|     IMGUI_API void          PopTableBackground(); | ||||
|     IMGUI_API void          TableLoadSettings(ImGuiTable* table); | ||||
|     IMGUI_API void          TableSaveSettings(ImGuiTable* table); | ||||
|     IMGUI_API ImGuiTableSettings* TableFindSettings(ImGuiTable* table); | ||||
|     IMGUI_API void*         TableSettingsHandler_ReadOpen(ImGuiContext*, ImGuiSettingsHandler*, const char* name); | ||||
|     IMGUI_API void          TableSettingsHandler_ReadLine(ImGuiContext*, ImGuiSettingsHandler*, void* entry, const char* line); | ||||
|     IMGUI_API void          TableSettingsHandler_WriteAll(ImGuiContext*, ImGuiSettingsHandler*, ImGuiTextBuffer* buf); | ||||
|  | ||||
|     // Tab Bars | ||||
|     IMGUI_API bool          BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& bb, ImGuiTabBarFlags flags); | ||||
|     IMGUI_API ImGuiTabItem* TabBarFindTabByID(ImGuiTabBar* tab_bar, ImGuiID tab_id); | ||||
| @@ -2094,6 +2315,7 @@ namespace ImGui | ||||
|     IMGUI_API void          DebugNodeDrawCmdShowMeshAndBoundingBox(ImGuiWindow* window, const ImDrawList* draw_list, const ImDrawCmd* draw_cmd, bool show_mesh, bool show_aabb); | ||||
|     IMGUI_API void          DebugNodeStorage(ImGuiStorage* storage, const char* label); | ||||
|     IMGUI_API void          DebugNodeTabBar(ImGuiTabBar* tab_bar, const char* label); | ||||
|     IMGUI_API void          DebugNodeTable(ImGuiTable* table); | ||||
|     IMGUI_API void          DebugNodeWindow(ImGuiWindow* window, const char* label); | ||||
|     IMGUI_API void          DebugNodeWindowSettings(ImGuiWindowSettings* settings); | ||||
|     IMGUI_API void          DebugNodeWindowsList(ImVector<ImGuiWindow*>* windows, const char* label); | ||||
|   | ||||
							
								
								
									
										2235
									
								
								imgui_tables.cpp
									
									
									
									
									
								
							
							
						
						
									
										2235
									
								
								imgui_tables.cpp
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -5999,6 +5999,8 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl | ||||
|     // which would be advantageous since most selectable are not selected. | ||||
|     if (span_all_columns && window->DC.CurrentColumns) | ||||
|         PushColumnsBackground(); | ||||
|     else if ((flags & ImGuiSelectableFlags_SpanAllColumns) && g.CurrentTable) | ||||
|         PushTableBackground(); | ||||
|  | ||||
|     // We use NoHoldingActiveID on menus so user can click and _hold_ on a menu then drag to browse child entries | ||||
|     ImGuiButtonFlags button_flags = 0; | ||||
| @@ -6047,6 +6049,8 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl | ||||
|  | ||||
|     if (span_all_columns && window->DC.CurrentColumns) | ||||
|         PopColumnsBackground(); | ||||
|     else if (span_all_columns && g.CurrentTable) | ||||
|         PopTableBackground(); | ||||
|  | ||||
|     if (flags & ImGuiSelectableFlags_Disabled) PushStyleColor(ImGuiCol_Text, style.Colors[ImGuiCol_TextDisabled]); | ||||
|     RenderTextClipped(text_min, text_max, label, NULL, &label_size, style.SelectableTextAlign, &bb); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user