mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-04 07:01:04 +01:00 
			
		
		
		
	Tables: Not flagging whole column as SkipItems based on clipping visibility (breaks layout)
This commit is contained in:
		
							
								
								
									
										2
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								imgui.h
									
									
									
									
									
								
							@@ -672,7 +672,7 @@ namespace ImGui
 | 
				
			|||||||
    // - If you are using tables as a sort of grid, populating every columns with the same type of contents,
 | 
					    // - 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().
 | 
					    //   you may prefer using TableNextCell() instead of TableNextRow() + TableSetColumnIndex().
 | 
				
			||||||
    // - See Demo->Tables for details.
 | 
					    // - See Demo->Tables for details.
 | 
				
			||||||
    // - See ImGuiTableFlags_ enums for a description of available flags.
 | 
					    // - See ImGuiTableFlags_ and ImGuiTableColumnsFlags_ enums for a description of available flags.
 | 
				
			||||||
    #define IMGUI_HAS_TABLE 1
 | 
					    #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 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          EndTable();                                 // only call EndTable() if BeginTable() returns true!
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -753,7 +753,7 @@ void    ImGui::TableUpdateLayout(ImGuiTable* table)
 | 
				
			|||||||
        if (table->FreezeColumnsCount > 0 && table->FreezeColumnsCount == visible_n)
 | 
					        if (table->FreezeColumnsCount > 0 && table->FreezeColumnsCount == visible_n)
 | 
				
			||||||
            offset_x += work_rect.Min.x - table->OuterRect.Min.x;
 | 
					            offset_x += work_rect.Min.x - table->OuterRect.Min.x;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!(table->VisibleMaskByDisplayOrder & ((ImU64)1 << order_n)))
 | 
					        if ((table->VisibleMaskByDisplayOrder & ((ImU64)1 << order_n)) == 0)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            // Hidden column: clear a few fields and we are done with it for the remainder of the function.
 | 
					            // Hidden column: clear a few fields and we are done with it for the remainder of the function.
 | 
				
			||||||
            // We set a zero-width clip rect but set Min.y/Max.y properly to not interfere with the clipper.
 | 
					            // We set a zero-width clip rect but set Min.y/Max.y properly to not interfere with the clipper.
 | 
				
			||||||
@@ -798,31 +798,27 @@ 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)
 | 
				
			||||||
        {
 | 
					            table->VisibleUnclippedMaskByIndex &= ~((ImU64)1 << column_n);  // Columns with the _WidthAlwaysAutoResize sizing policy will never be updated then.
 | 
				
			||||||
            // Columns with the _WidthAlwaysAutoResize sizing policy will never be updated then.
 | 
					 | 
				
			||||||
            table->VisibleUnclippedMaskByIndex &= ~((ImU64)1 << column_n);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            // Starting cursor position
 | 
					 | 
				
			||||||
            column->StartXRows = column->StartXHeaders = column->MinX + table->CellPaddingX1;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // Alignment
 | 
					        column->SkipItems = !column->IsVisible || table->HostSkipItems;
 | 
				
			||||||
            // FIXME-TABLE: This align based on the whole column width, not per-cell, and therefore isn't useful in
 | 
					 | 
				
			||||||
            // many cases (to be able to honor this we might be able to store a log of cells width, per row, for
 | 
					 | 
				
			||||||
            // visible rows, but nav/programmatic scroll would have visible artifacts.)
 | 
					 | 
				
			||||||
            //if (column->Flags & ImGuiTableColumnFlags_AlignRight)
 | 
					 | 
				
			||||||
            //    column->StartXRows = ImMax(column->StartXRows, column->MaxX - column->ContentWidthRowsUnfrozen);
 | 
					 | 
				
			||||||
            //else if (column->Flags & ImGuiTableColumnFlags_AlignCenter)
 | 
					 | 
				
			||||||
            //    column->StartXRows = ImLerp(column->StartXRows, ImMax(column->StartXRows, column->MaxX - column->ContentWidthRowsUnfrozen), 0.5f);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // Reset content width variables
 | 
					        // Starting cursor position
 | 
				
			||||||
            const float initial_max_pos_x = column->MinX + table->CellPaddingX1;
 | 
					        column->StartXRows = column->StartXHeaders = column->MinX + table->CellPaddingX1;
 | 
				
			||||||
            column->ContentMaxPosRowsFrozen = column->ContentMaxPosRowsUnfrozen = initial_max_pos_x;
 | 
					
 | 
				
			||||||
            column->ContentMaxPosHeadersUsed = column->ContentMaxPosHeadersIdeal = initial_max_pos_x;
 | 
					        // Alignment
 | 
				
			||||||
        }
 | 
					        // FIXME-TABLE: This align based on the whole column width, not per-cell, and therefore isn't useful in
 | 
				
			||||||
 | 
					        // many cases (to be able to honor this we might be able to store a log of cells width, per row, for
 | 
				
			||||||
 | 
					        // visible rows, but nav/programmatic scroll would have visible artifacts.)
 | 
				
			||||||
 | 
					        //if (column->Flags & ImGuiTableColumnFlags_AlignRight)
 | 
				
			||||||
 | 
					        //    column->StartXRows = ImMax(column->StartXRows, column->MaxX - column->ContentWidthRowsUnfrozen);
 | 
				
			||||||
 | 
					        //else if (column->Flags & ImGuiTableColumnFlags_AlignCenter)
 | 
				
			||||||
 | 
					        //    column->StartXRows = ImLerp(column->StartXRows, ImMax(column->StartXRows, column->MaxX - column->ContentWidthRowsUnfrozen), 0.5f);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Reset content width variables
 | 
				
			||||||
 | 
					        const float initial_max_pos_x = column->MinX + table->CellPaddingX1;
 | 
				
			||||||
 | 
					        column->ContentMaxPosRowsFrozen = column->ContentMaxPosRowsUnfrozen = initial_max_pos_x;
 | 
				
			||||||
 | 
					        column->ContentMaxPosHeadersUsed = column->ContentMaxPosHeadersIdeal = initial_max_pos_x;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Don't decrement auto-fit counters until container window got a chance to submit its items
 | 
					        // Don't decrement auto-fit counters until container window got a chance to submit its items
 | 
				
			||||||
        if (table->HostSkipItems == false)
 | 
					        if (table->HostSkipItems == false)
 | 
				
			||||||
@@ -1798,6 +1794,7 @@ bool    ImGui::TableNextCell()
 | 
				
			|||||||
        TableNextRow();
 | 
					        TableNextRow();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // FIXME-TABLE: it is likely to alter layout if user skips a columns contents based on clipping.
 | 
				
			||||||
    int column_n = table->CurrentColumn;
 | 
					    int column_n = table->CurrentColumn;
 | 
				
			||||||
    return (table->VisibleUnclippedMaskByIndex & ((ImU64)1 << column_n)) != 0;
 | 
					    return (table->VisibleUnclippedMaskByIndex & ((ImU64)1 << column_n)) != 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -1849,6 +1846,7 @@ bool    ImGui::TableSetColumnIndex(int column_idx)
 | 
				
			|||||||
        TableBeginCell(table, column_idx);
 | 
					        TableBeginCell(table, column_idx);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // FIXME-TABLE: it is likely to alter layout if user skips a columns contents based on clipping.
 | 
				
			||||||
    return (table->VisibleUnclippedMaskByIndex & ((ImU64)1 << column_idx)) != 0;
 | 
					    return (table->VisibleUnclippedMaskByIndex & ((ImU64)1 << column_idx)) != 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user