#pragma once #include "../../Widgets/Widget.h" #include #include #include #include namespace UI { class VirtualizingGridLayout : public Widget { std::size_t itemCount; float reasonableColumnWidth; float spacing; float maximumRowHeight; float overscan; std::function itemSizeProvider; std::function(std::size_t)> itemFactory; std::vector rowHeights; std::vector rowOffsets; std::size_t columnCount = 1; std::size_t visibleStartRow = 0; std::size_t visibleEndRow = 0; float scrollOffset = 0.0f; bool hasVisibleRange = false; std::size_t CalculateColumnCount(float availableWidth) const; float CalculateColumnWidth(float availableWidth) const; void RebuildMetrics(float availableWidth); bool UpdateVisibleChildren(); void ArrangeChildInCell(Widget* child, Rect cellBounds) const; public: VirtualizingGridLayout( std::size_t itemCount, float reasonableColumnWidth, float spacing, float maximumRowHeight, float overscan, std::function itemSizeProvider, std::function(std::size_t)> itemFactory ); void Measure(Size availableSpace) override; void Arrange(Rect finalBounds) override; void SetScrollOffset(Point offset) override; }; }