// This file is part of VSTGUI. It is subject to the license terms // in the LICENSE file found in the top-level directory of this // distribution and at http://github.com/steinbergmedia/vstgui/LICENSE #pragma once #include "../iviewlayouter.h" #include #include //------------------------------------------------------------------------ namespace VSTGUI { //------------------------------------------------------------------------ /** Properties for configuring a grid layout, compatible with CSS Grid Layout. * * The GridProperties struct allows you to define a grid layout similar to CSS Grid. * * - rows: Number of grid rows (default: 1). * - columns: Number of grid columns (default: 1). * - autoRows: Defines the height of each row, similar to 'grid-template-rows' in CSS. * - autoColumns: Defines the width of each column, similar to 'grid-template-columns' in CSS. * - rowGap: Space between rows, equivalent to 'row-gap' in CSS. * - columnGap: Space between columns, equivalent to 'column-gap' in CSS. * - alignItems: Controls alignment of items within their grid area (CSS: 'align-items'). * Options: Start, Center, End, Stretch. * - justifyItems: Controls horizontal alignment of items within their grid area (CSS: * 'justify-items'). Options: Start, Center, End, Stretch. * - alignContent: Controls vertical alignment of the grid as a whole (CSS: 'align-content'). * Options: Start, Center, End, Stretch, SpaceBetween, SpaceAround. * - justifyContent: Controls horizontal alignment of the grid as a whole (CSS: 'justify-content'). * Options: Start, Center, End, Stretch, SpaceBetween, SpaceAround. * - gridAreas: Optional. Defines the grid area (row, column, rowSpan, colSpan) for each * child/view. If provided, each child can span multiple rows/columns, similar to * CSS grid-area. If not provided, each child is placed in a single cell by * default. * * Note: justify-content is ignored when grid areas are used and the grid tracks exactly fit the * content (no extra free space). If grid areas are used and the grid is smaller than the * container, justify-content can affect the grid's position within the container. * * This struct is designed to be compatible with the CSS Grid Layout specification: * https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_layout * * @ingroup new_in_4_15 */ struct GridLayoutProperties { enum class AlignItems { Start, Center, End, Stretch }; enum class JustifyItems { Start, Center, End, Stretch }; enum class AlignContent { Start, Center, End, Stretch, SpaceBetween, SpaceAround }; enum class JustifyContent { Start, Center, End, Stretch, SpaceBetween, SpaceAround }; struct GridArea { // 0-based indices size_t row {0}; size_t column {0}; size_t rowSpan {1}; size_t colSpan {1}; }; struct Percentage { double value {0.0}; // 0.0 - 100.0 }; struct Auto { }; using SizeSpec = std::variant; size_t rows {1}; size_t columns {1}; std::vector autoRows; std::vector autoColumns; CCoord rowGap {0.0}; CCoord columnGap {0.0}; AlignItems alignItems {AlignItems::Stretch}; JustifyItems justifyItems {JustifyItems::Stretch}; AlignContent alignContent {AlignContent::Stretch}; JustifyContent justifyContent {JustifyContent::Stretch}; std::vector gridAreas; // Optional: one per child, defines grid area (span) }; //------------------------------------------------------------------------ /** grid view layouter * * @ingroup new_in_4_15 */ class GridLayouter : public IViewLayouter, public NonAtomicReferenceCounted { public: using LayoutData = std::vector>>; GridLayouter (const GridLayoutProperties& props = {}); void setProperties (const GridLayoutProperties& props); const GridLayoutProperties& getProperties () const; GridLayoutProperties& getProperties (); bool applyLayout (CViewContainer& container, const Children& children, const ViewLayout& layout) override; std::optional calculateLayout (const CViewContainer& view, const Children& children, const CRect& newSize) override; private: static constexpr auto kAutoSize = std::numeric_limits::min (); std::vector calculateAutoRows (CCoord& usedRowHeight, CCoord availableHeight, size_t& outNumAutoRows) const; std::vector calculateAutoColumns (CCoord& usedColWidth, CCoord availableWidth, size_t& outNumAutoCols) const; GridLayoutProperties gridProps; }; //------------------------------------------------------------------------ } // namespace VSTGUI