mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-17 00:44:19 +00:00
182 lines
6.1 KiB
C++
182 lines
6.1 KiB
C++
/*
|
|
==============================================================================
|
|
|
|
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
|
|
*/
|
|
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;
|
|
};
|
|
|
|
//==============================================================================
|
|
/** */
|
|
struct TrackInfo final
|
|
{
|
|
/** Creates a track with auto dimension. */
|
|
TrackInfo() noexcept;
|
|
/** */
|
|
TrackInfo (Px sizeInPixels) noexcept;
|
|
/** */
|
|
TrackInfo (Fr fractionOfFreeSpace) noexcept;
|
|
|
|
/** */
|
|
TrackInfo (Px sizeInPixels, const juce::String& endLineNameToUse) noexcept;
|
|
/** */
|
|
TrackInfo (Fr fractionOfFreeSpace, const juce::String& endLineNameToUse) noexcept;
|
|
|
|
/** */
|
|
TrackInfo (const juce::String& startLineNameToUse, Px sizeInPixels) noexcept;
|
|
/** */
|
|
TrackInfo (const juce::String& startLineNameToUse, Fr fractionOfFreeSpace) noexcept;
|
|
|
|
/** */
|
|
TrackInfo (const juce::String& startLineNameToUse, Px sizeInPixels, const juce::String& endLineNameToUse) noexcept;
|
|
/** */
|
|
TrackInfo (const juce::String& startLineNameToUse, Fr fractionOfFreeSpace, const juce::String& endLineNameToUse) noexcept;
|
|
|
|
private:
|
|
friend class Grid;
|
|
friend class GridItem;
|
|
|
|
float size = 0; // Either a fraction or an absolute size in pixels
|
|
bool isFraction = false;
|
|
bool hasKeyword = false;
|
|
|
|
juce::String startLineName, endLineName;
|
|
};
|
|
|
|
//==============================================================================
|
|
/** */
|
|
enum class JustifyItems : int { start = 0, end, center, stretch };
|
|
/** */
|
|
enum class AlignItems : int { start = 0, end, center, stretch };
|
|
/** */
|
|
enum class JustifyContent { start, end, center, stretch, spaceAround, spaceBetween, spaceEvenly };
|
|
/** */
|
|
enum class AlignContent { start, end, center, stretch, spaceAround, spaceBetween, spaceEvenly };
|
|
/** */
|
|
enum class AutoFlow { row, column, rowDense, columnDense };
|
|
|
|
|
|
//==============================================================================
|
|
/** */
|
|
Grid() noexcept;
|
|
|
|
/** Destructor */
|
|
~Grid() noexcept;
|
|
|
|
//==============================================================================
|
|
/** */
|
|
JustifyItems justifyItems = JustifyItems::stretch;
|
|
/** */
|
|
AlignItems alignItems = AlignItems::stretch;
|
|
/** */
|
|
JustifyContent justifyContent = JustifyContent::stretch;
|
|
/** */
|
|
AlignContent alignContent = AlignContent::stretch;
|
|
/** */
|
|
AutoFlow autoFlow = AutoFlow::row;
|
|
|
|
|
|
//==============================================================================
|
|
/** */
|
|
juce::Array<TrackInfo> templateColumns;
|
|
|
|
/** */
|
|
juce::Array<TrackInfo> templateRows;
|
|
|
|
/** Template areas */
|
|
juce::StringArray templateAreas;
|
|
|
|
/** */
|
|
TrackInfo autoRows;
|
|
|
|
/** */
|
|
TrackInfo autoColumns;
|
|
|
|
/** */
|
|
Px columnGap { 0 };
|
|
/** */
|
|
Px rowGap { 0 };
|
|
|
|
/** */
|
|
void setGap (Px sizeInPixels) noexcept { rowGap = columnGap = sizeInPixels; }
|
|
|
|
//==============================================================================
|
|
/** */
|
|
juce::Array<GridItem> items;
|
|
|
|
//==============================================================================
|
|
/** */
|
|
void performLayout (juce::Rectangle<int>);
|
|
|
|
//==============================================================================
|
|
/** */
|
|
int getNumberOfColumns() const noexcept { return templateColumns.size(); }
|
|
/** */
|
|
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
|