git subrepo clone --branch=sono6good https://github.com/essej/JUCE.git deps/juce
subrepo: subdir: "deps/juce" merged: "b13f9084e" upstream: origin: "https://github.com/essej/JUCE.git" branch: "sono6good" commit: "b13f9084e" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596"
This commit is contained in:
229
deps/juce/modules/juce_gui_basics/layout/juce_Grid.h
vendored
Normal file
229
deps/juce/modules/juce_gui_basics/layout/juce_Grid.h
vendored
Normal file
@ -0,0 +1,229 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2020 - Raw Material Software Limited
|
||||
|
||||
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 6 End-User License
|
||||
Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).
|
||||
|
||||
End User License Agreement: www.juce.com/juce-6-licence
|
||||
Privacy Policy: www.juce.com/juce-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() = default;
|
||||
|
||||
/** Destructor */
|
||||
~Grid() noexcept = default;
|
||||
|
||||
//==============================================================================
|
||||
/** 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
|
Reference in New Issue
Block a user