123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- /*
- ==============================================================================
- This file is part of the JUCE library.
- Copyright (c) 2017 - ROLI Ltd.
- JUCE is an open source library subject to commercial or open-source
- licensing.
- By using JUCE, you agree to the terms of both the JUCE 5 End-User License
- Agreement and JUCE 5 Privacy Policy (both updated and effective as of the
- 27th April 2017).
- End User License Agreement: www.juce.com/juce-5-licence
- Privacy Policy: www.juce.com/juce-5-privacy-policy
- Or: You may also use this code under the terms of the GPL v3 (see
- www.gnu.org/licenses).
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
- DISCLAIMED.
- ==============================================================================
- */
- namespace juce
- {
- /**
- Container that handles geometry for grid layouts (fixed columns and rows) using a set of declarative rules.
- Implemented from the `CSS Grid Layout` specification as described at:
- https://css-tricks.com/snippets/css/complete-guide-grid/
- @see GridItem
- @tags{GUI}
- */
- class JUCE_API Grid final
- {
- public:
- //==============================================================================
- /** A size in pixels */
- struct Px final
- {
- explicit Px (float p) : pixels (static_cast<long double>(p)) { /*sta (p >= 0.0f);*/ }
- explicit Px (int p) : pixels (static_cast<long double>(p)) { /*sta (p >= 0.0f);*/ }
- explicit constexpr Px (long double p) : pixels (p) {}
- explicit constexpr Px (unsigned long long p) : pixels (static_cast<long double>(p)) {}
- long double pixels;
- };
- /** A fractional ratio integer */
- struct Fr final
- {
- explicit Fr (int f) : fraction (static_cast<unsigned long long> (f)) {}
- explicit constexpr Fr (unsigned long long p) : fraction (p) {}
- unsigned long long fraction;
- };
- //==============================================================================
- /** Represents a track. */
- struct TrackInfo final
- {
- /** Creates a track with auto dimension. */
- TrackInfo() noexcept;
- TrackInfo (Px sizeInPixels) noexcept;
- TrackInfo (Fr fractionOfFreeSpace) noexcept;
- TrackInfo (Px sizeInPixels, const String& endLineNameToUse) noexcept;
- TrackInfo (Fr fractionOfFreeSpace, const String& endLineNameToUse) noexcept;
- TrackInfo (const String& startLineNameToUse, Px sizeInPixels) noexcept;
- TrackInfo (const String& startLineNameToUse, Fr fractionOfFreeSpace) noexcept;
- TrackInfo (const String& startLineNameToUse, Px sizeInPixels, const String& endLineNameToUse) noexcept;
- TrackInfo (const String& startLineNameToUse, Fr fractionOfFreeSpace, const String& endLineNameToUse) noexcept;
- bool isAuto() const noexcept { return hasKeyword; }
- bool isFractional() const noexcept { return isFraction; }
- bool isPixels() const noexcept { return ! isFraction; }
- const String& getStartLineName() const noexcept { return startLineName; }
- const String& getEndLineName() const noexcept { return endLineName; }
- /** Get the track's size - which might mean an absolute pixels value or a fractional ratio. */
- float getSize() const noexcept { return size; }
- private:
- friend class Grid;
- float getAbsoluteSize (float relativeFractionalUnit) const;
- float size = 0; // Either a fraction or an absolute size in pixels
- bool isFraction = false;
- bool hasKeyword = false;
- String startLineName, endLineName;
- };
- //==============================================================================
- /** Possible values for the justifyItems property. */
- enum class JustifyItems : int
- {
- start = 0, /**< Content inside the item is justified towards the left. */
- end, /**< Content inside the item is justified towards the right. */
- center, /**< Content inside the item is justified towards the center. */
- stretch /**< Content inside the item is stretched from left to right. */
- };
- /** Possible values for the alignItems property. */
- enum class AlignItems : int
- {
- start = 0, /**< Content inside the item is aligned towards the top. */
- end, /**< Content inside the item is aligned towards the bottom. */
- center, /**< Content inside the item is aligned towards the center. */
- stretch /**< Content inside the item is stretched from top to bottom. */
- };
- /** Possible values for the justifyContent property. */
- enum class JustifyContent
- {
- start, /**< Items are justified towards the left of the container. */
- end, /**< Items are justified towards the right of the container. */
- center, /**< Items are justified towards the center of the container. */
- stretch, /**< Items are stretched from left to right of the container. */
- spaceAround, /**< Items are evenly spaced along the row with spaces between them. */
- spaceBetween, /**< Items are evenly spaced along the row with spaces around them. */
- spaceEvenly /**< Items are evenly spaced along the row with even amount of spaces between them. */
- };
- /** Possible values for the alignContent property. */
- enum class AlignContent
- {
- start, /**< Items are aligned towards the top of the container. */
- end, /**< Items are aligned towards the bottom of the container. */
- center, /**< Items are aligned towards the center of the container. */
- stretch, /**< Items are stretched from top to bottom of the container. */
- spaceAround, /**< Items are evenly spaced along the column with spaces between them. */
- spaceBetween, /**< Items are evenly spaced along the column with spaces around them. */
- spaceEvenly /**< Items are evenly spaced along the column with even amount of spaces between them. */
- };
- /** Possible values for the autoFlow property. */
- enum class AutoFlow
- {
- row, /**< Fills the grid by adding rows of items. */
- column, /**< Fills the grid by adding columns of items. */
- rowDense, /**< Fills the grid by adding rows of items and attempts to fill in gaps. */
- columnDense /**< Fills the grid by adding columns of items and attempts to fill in gaps. */
- };
- //==============================================================================
- /** Creates an empty Grid container with default parameters. */
- Grid() noexcept;
- /** Destructor */
- ~Grid() noexcept;
- //==============================================================================
- /** Specifies the alignment of content inside the items along the rows. */
- JustifyItems justifyItems = JustifyItems::stretch;
- /** Specifies the alignment of content inside the items along the columns. */
- AlignItems alignItems = AlignItems::stretch;
- /** Specifies the alignment of items along the rows. */
- JustifyContent justifyContent = JustifyContent::stretch;
- /** Specifies the alignment of items along the columns. */
- AlignContent alignContent = AlignContent::stretch;
- /** Specifies how the auto-placement algorithm places items. */
- AutoFlow autoFlow = AutoFlow::row;
- //==============================================================================
- /** The set of column tracks to lay out. */
- Array<TrackInfo> templateColumns;
- /** The set of row tracks to lay out. */
- Array<TrackInfo> templateRows;
- /** Template areas */
- StringArray templateAreas;
- /** The row track for auto dimension. */
- TrackInfo autoRows;
- /** The column track for auto dimension. */
- TrackInfo autoColumns;
- /** The gap in pixels between columns. */
- Px columnGap { 0 };
- /** The gap in pixels between rows. */
- Px rowGap { 0 };
- /** Sets the gap between rows and columns in pixels. */
- void setGap (Px sizeInPixels) noexcept { rowGap = columnGap = sizeInPixels; }
- //==============================================================================
- /** The set of items to lay-out. */
- Array<GridItem> items;
- //==============================================================================
- /** Lays-out the grid's items within the given rectangle. */
- void performLayout (Rectangle<int>);
- //==============================================================================
- /** Returns the number of columns. */
- int getNumberOfColumns() const noexcept { return templateColumns.size(); }
- /** Returns the number of rows. */
- int getNumberOfRows() const noexcept { return templateRows.size(); }
- private:
- //==============================================================================
- struct SizeCalculation;
- struct PlacementHelpers;
- struct AutoPlacement;
- struct BoxAlignment;
- };
- constexpr Grid::Px operator"" _px (long double px) { return Grid::Px { px }; }
- constexpr Grid::Px operator"" _px (unsigned long long px) { return Grid::Px { px }; }
- constexpr Grid::Fr operator"" _fr (unsigned long long fr) { return Grid::Fr { fr }; }
- } // namespace juce
|