/* ============================================================================== 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 { /** Defines an item in a Grid @see Grid */ class JUCE_API GridItem { public: enum class Keyword { autoValue }; //============================================================================== /** */ struct Span { explicit Span (int numberToUse) noexcept : number (numberToUse) { /* Span must be at least one and positive */ jassert (numberToUse > 0); } explicit Span (int numberToUse, const juce::String& nameToUse) : Span (numberToUse) { /* Name must not be empty */ jassert (nameToUse.isNotEmpty()); name = nameToUse; } explicit Span (const juce::String& nameToUse) : name (nameToUse) { /* Name must not be empty */ jassert (nameToUse.isNotEmpty()); } int number = 1; juce::String name; }; //============================================================================== /** */ struct Property { /** */ Property() noexcept; /** */ Property (Keyword keyword) noexcept; /** */ Property (const char* lineNameToUse) noexcept; /** */ Property (const juce::String& lineNameToUse) noexcept; /** */ Property (int numberToUse) noexcept; /** */ Property (int numberToUse, const juce::String& lineNameToUse) noexcept; /** */ Property (Span spanToUse) noexcept; private: bool hasSpan() const noexcept { return isSpan && ! isAuto; } bool hasAbsolute() const noexcept { return ! (isSpan || isAuto); } bool hasAuto() const noexcept { return isAuto; } bool hasName() const noexcept { return name.isNotEmpty(); } friend class Grid; juce::String name; int number = 1; /** Either an absolute line number or number of lines to span across. */ bool isSpan = false; bool isAuto = false; }; //============================================================================== /** */ struct StartAndEndProperty { Property start, end; }; //============================================================================== /** */ enum class JustifySelf : int { start = 0, end, center, stretch, autoValue }; /** */ enum class AlignSelf : int { start = 0, end, center, stretch, autoValue }; /** */ GridItem() noexcept; /** */ GridItem (juce::Component& componentToUse) noexcept; /** */ GridItem (juce::Component* componentToUse) noexcept; /** Destructor. */ ~GridItem() noexcept; //============================================================================== /** */ juce::Component* associatedComponent = nullptr; //============================================================================== /** */ int order = 0; /** */ JustifySelf justifySelf = JustifySelf::autoValue; /** */ AlignSelf alignSelf = AlignSelf::autoValue; /** */ StartAndEndProperty column = { Keyword::autoValue, Keyword::autoValue }; /** */ StartAndEndProperty row = { Keyword::autoValue, Keyword::autoValue }; /** */ juce::String area; //============================================================================== enum { useDefaultValue = -2, /* TODO: useDefaultValue should be named useAuto */ notAssigned = -1 }; /* TODO: move all of this into a common class that is shared with the FlexItem */ float width = notAssigned; float minWidth = 0; float maxWidth = notAssigned; float height = notAssigned; float minHeight = 0; float maxHeight = notAssigned; struct Margin { Margin() noexcept; Margin (int size) noexcept; Margin (float size) noexcept; Margin (float top, float right, float bottom, float left) noexcept; /**< Creates a margin with these sizes. */ float left; float right; float top; float bottom; }; /** */ Margin margin; /** */ juce::Rectangle currentBounds; /** Short-hand */ void setArea (Property rowStart, Property columnStart, Property rowEnd, Property columnEnd); /** Short-hand, span of 1 by default */ void setArea (Property rowStart, Property columnStart); /** Short-hand */ void setArea (const juce::String& areaName); /** Short-hand */ GridItem withArea (Property rowStart, Property columnStart, Property rowEnd, Property columnEnd) const noexcept; /** Short-hand, span of 1 by default */ GridItem withArea (Property rowStart, Property columnStart) const noexcept; /** Short-hand */ GridItem withArea (const juce::String& areaName) const noexcept; /** */ GridItem withRow (StartAndEndProperty row) const noexcept; /** */ GridItem withColumn (StartAndEndProperty column) const noexcept; /** */ GridItem withAlignSelf (AlignSelf newAlignSelf) const noexcept; /** */ GridItem withJustifySelf (JustifySelf newJustifySelf) const noexcept; /** */ GridItem withWidth (float newWidth) const noexcept; /** */ GridItem withHeight (float newHeight) const noexcept; /** */ GridItem withSize (float newWidth, float newHeight) const noexcept; /** */ GridItem withMargin (Margin newMargin) const noexcept; /** Returns a copy of this object with a new order. */ GridItem withOrder (int newOrder) const noexcept; }; } // namespace juce