#pragma once #include "../../Widgets/Widget.h" #include #include #include #include #include "../Engine/Geometry.h" namespace UI { enum class VirtualizingStackSizing { Fixed, // use size provider Fill // use available space/page layout }; class VirtualizingStackLayout : public Widget { std::size_t itemCount; float spacing; float overscan; std::function itemSizeProvider; std::function(std::size_t)> itemFactory; VirtualizingStackSizing sizing; std::vector itemSizes; std::vector itemOffsets; std::size_t visibleStart = 0; std::size_t visibleEnd = 0; float scrollOffset = 0.0f; bool hasVisibleRange = false; Size metricsSpace{-1.0f, -1.0f}; // available space Size ViewportExtent() const; Size ResolveAvailableSpace(Size availableSpace) const; void RebuildMetrics(Size availableSpace); bool UpdateVisibleChildren(); std::size_t FindFirstVisibleIndex(float start) const; std::size_t FindLastVisibleIndex(float end) const; public: VirtualizingStackLayout( std::size_t itemCount, float spacing, float overscan, std::function itemSizeProvider, std::function(std::size_t)> itemFactory, VirtualizingStackSizing sizing = VirtualizingStackSizing::Fixed ); void Measure(Size availableSpace) override; void Arrange(Rect finalBounds) override; void SetScrollOffset(Point offset) override; }; }