94 template <
typename Value>
155 for (
auto& item :
owner.items)
177 item.resetItemLockedSize();
185 bool firstRow =
true;
189 item.resetItemLockedSize();
193 if (flexitemLength > currentLength)
206 currentLength -= flexitemLength;
221 for (
int maxLoops =
numItems; --maxLoops >= 0;)
235 Coord allFlexGrow = 0;
247 const auto changeUnitWidth = remainingLength / allFlexGrow;
249 if (changeUnitWidth > 0)
299 if (
isAssigned (item.item->maxHeight) && item.lockedHeight > item.item->maxHeight)
300 item.lockedHeight = item.item->maxHeight;
302 if (
isAssigned (item.item->maxWidth) && item.lockedWidth > item.item->maxWidth)
303 item.lockedWidth = item.item->maxWidth;
322 Coord crossHeights = 0;
325 crossHeights +=
lineInfo[row2].crossSize;
332 Coord totalHeight = 0;
368 lineInfo[0].lineY = additionalength;
381 const auto crossSizeForLine =
lineInfo[
row].crossSize;
416 const auto alignment = [&]
418 switch (item.item->alignSelf)
427 return owner.alignItems;
479 Coord additionalMarginRight = 0, additionalMarginLeft = 0;
498 additionalMarginRight
503 additionalMarginLeft = additionalMarginRight
514 item.item->currentBounds.setPosition (
isRowDirection ? (
float) (
x + item.lockedMarginLeft)
515 : (
float) item.lockedMarginLeft,
517 : (
float) (
x + item.lockedMarginTop));
536 item.item->currentBounds.setY ((
float) (lineY + item.lockedMarginTop));
538 item.item->currentBounds.setX ((
float) (lineY + item.lockedMarginLeft));
540 item.item->currentBounds.setSize ((
float) item.lockedWidth,
541 (
float) item.lockedHeight);
583 Coord totalItemsLength = 0, totalFlexGrow = 0, totalFlexShrink = 0;
596 totalFlexGrow += item.item->flexGrow;
597 totalFlexShrink += item.item->flexShrink;
601 Coord changeUnit = 0;
602 const auto difference = flexContainerLength - totalItemsLength;
603 const bool positiveFlexibility = difference > 0;
605 if (positiveFlexibility)
607 if (totalFlexGrow != 0.0)
608 changeUnit = difference / totalFlexGrow;
612 if (totalFlexShrink != 0.0)
613 changeUnit = difference / totalFlexShrink;
623 if (!
addToItemLength (item, (positiveFlexibility ? item.item->flexGrow
624 : item.item->flexShrink) * changeUnit,
row))
647 for (
auto& item :
owner.items)
652 for (
auto& item :
owner.items)
663 for (
auto& item :
owner.items)
668 for (
auto& item :
owner.items)
676 return isRowDirection ? item.lockedWidth + item.lockedMarginLeft + item.lockedMarginRight
677 : item.lockedHeight + item.lockedMarginTop + item.lockedMarginBottom;
682 return isRowDirection ? item.lockedHeight + item.lockedMarginTop + item.lockedMarginBottom
683 : item.lockedWidth + item.lockedMarginLeft + item.lockedMarginRight;
694 if (
isAssigned (pickForMainAxis (item.item->maxWidth, item.item->maxHeight))
695 && pickForMainAxis (item.item->maxWidth, item.item->maxHeight) < prefSize +
length)
697 pickForMainAxis (item.lockedWidth, item.lockedHeight) = pickForMainAxis (item.item->maxWidth, item.item->maxHeight);
700 else if (
isAssigned (prefSize) && pickForMainAxis (item.item->minWidth, item.item->minHeight) > prefSize +
length)
702 pickForMainAxis (item.lockedWidth, item.lockedHeight) = pickForMainAxis (item.item->minWidth, item.item->minHeight);
708 pickForMainAxis (item.lockedWidth, item.lockedHeight) = prefSize +
length;
711 lineInfo[
row].totalLength += pickForMainAxis (item.lockedWidth, item.lockedHeight)
712 + pickForMainAxis (item.lockedMarginLeft, item.lockedMarginTop)
713 + pickForMainAxis (item.lockedMarginRight, item.lockedMarginBottom);
720 const auto& item = *itemWithState.item;
722 auto preferredSize = (item.flexBasis > 0 && axis ==
Axis::main) ? item.flexBasis
726 const auto minSize =
getMinSize (axis, itemWithState);
728 if (
isAssigned (minSize) && preferredSize < minSize)
731 const auto maxSize =
getMaxSize (axis, itemWithState);
733 if (
isAssigned (maxSize) && maxSize < preferredSize)
736 return preferredSize;
750 if (!
items.isEmpty())
766 for (
auto& item :
items)
770 if (
auto*
comp = item.associatedComponent)
772 (
int) item.currentBounds.getY(),
773 (
int) item.currentBounds.getRight(),
774 (
int) item.currentBounds.getBottom()));
776 if (
auto*
box = item.associatedFlexBox)
777 box->performLayout (item.currentBounds);
803 fi.flexGrow = newFlexGrow;
810 fi.flexShrink = newFlexShrink;
816 auto fi =
withFlex (newFlexGrow, newFlexShrink);
817 fi.flexBasis = newFlexBasis;
842 void runTest()
override
844 using AlignSelf = FlexItem::AlignSelf;
852 flex.
items = std::move (items);
857 beginTest (
"flex item with mostly auto properties");
859 const auto test = [
this, &doLayout] (
Direction direction, AlignSelf alignment, Rectangle<float> expectedBounds)
861 const auto flex = doLayout (direction, { juce::FlexItem{}.withAlignSelf (alignment) });
862 expect (flex.
items.getFirst().currentBounds == expectedBounds);
865 test (Direction::row, AlignSelf::autoAlign, { rect.getX(), rect.getY(), 0.0f, rect.getHeight() });
866 test (Direction::row, AlignSelf::stretch, { rect.getX(), rect.getY(), 0.0f, rect.getHeight() });
867 test (Direction::row, AlignSelf::flexStart, { rect.getX(), rect.getY(), 0.0f, 0.0f });
868 test (Direction::row, AlignSelf::flexEnd, { rect.getX(), rect.getBottom(), 0.0f, 0.0f });
869 test (Direction::row, AlignSelf::center, { rect.getX(), rect.getCentreY(), 0.0f, 0.0f });
871 test (Direction::column, AlignSelf::autoAlign, { rect.getX(), rect.getY(), rect.getWidth(), 0.0f });
872 test (Direction::column, AlignSelf::stretch, { rect.getX(), rect.getY(), rect.getWidth(), 0.0f });
873 test (Direction::column, AlignSelf::flexStart, { rect.getX(), rect.getY(), 0.0f, 0.0f });
874 test (Direction::column, AlignSelf::flexEnd, { rect.getRight(), rect.getY(), 0.0f, 0.0f });
875 test (Direction::column, AlignSelf::center, { rect.getCentreX(), rect.getY(), 0.0f, 0.0f });
878 beginTest (
"flex item with specified width and height");
880 constexpr auto w = 50.0f;
881 constexpr auto h = 60.0f;
882 const auto test = [&] (
Direction direction, AlignSelf alignment, Rectangle<float> expectedBounds)
884 const auto flex = doLayout (direction, { juce::FlexItem().withAlignSelf (alignment)
887 expect (flex.
items.getFirst().currentBounds == expectedBounds);
890 test (Direction::row, AlignSelf::autoAlign, { rect.getX(), rect.getY(),
w,
h });
891 test (Direction::row, AlignSelf::stretch, { rect.getX(), rect.getY(),
w,
h });
892 test (Direction::row, AlignSelf::flexStart, { rect.getX(), rect.getY(),
w,
h });
893 test (Direction::row, AlignSelf::flexEnd, { rect.getX(), rect.getBottom() -
h,
w,
h });
894 test (Direction::row, AlignSelf::center, { rect.getX(), rect.getY() + (rect.getHeight() -
h) * 0.5f,
w,
h });
896 test (Direction::column, AlignSelf::autoAlign, { rect.getX(), rect.getY(),
w,
h });
897 test (Direction::column, AlignSelf::stretch, { rect.getX(), rect.getY(),
w,
h });
898 test (Direction::column, AlignSelf::flexStart, { rect.getX(), rect.getY(),
w,
h });
899 test (Direction::column, AlignSelf::flexEnd, { rect.getRight() -
w, rect.getY(),
w,
h });
900 test (Direction::column, AlignSelf::center, { rect.getX() + (rect.getWidth() -
w) * 0.5f, rect.getY(),
w,
h });
903 beginTest (
"flex item with oversized width and height");
905 const auto w = rect.getWidth() * 2;
906 const auto h = rect.getHeight() * 2;
907 const auto test = [
this, &doLayout, &
w, &
h] (
Direction direction, AlignSelf alignment, Rectangle<float> expectedBounds)
909 const auto flex = doLayout (direction, { juce::FlexItem().withAlignSelf (alignment)
912 expect (flex.
items.getFirst().currentBounds == expectedBounds);
915 const Rectangle<float> baseRow (rect.getX(), rect.getY(), rect.getWidth(),
h);
916 test (Direction::row, AlignSelf::autoAlign, baseRow);
917 test (Direction::row, AlignSelf::stretch, baseRow);
918 test (Direction::row, AlignSelf::flexStart, baseRow);
919 test (Direction::row, AlignSelf::flexEnd, baseRow.withBottomY (rect.getBottom()));
920 test (Direction::row, AlignSelf::center, baseRow.withCentre (rect.getCentre()));
922 const Rectangle<float> baseColumn (rect.getX(), rect.getY(),
w, rect.getHeight());
923 test (Direction::column, AlignSelf::autoAlign, baseColumn);
924 test (Direction::column, AlignSelf::stretch, baseColumn);
925 test (Direction::column, AlignSelf::flexStart, baseColumn);
926 test (Direction::column, AlignSelf::flexEnd, baseColumn.withRightX (rect.getRight()));
927 test (Direction::column, AlignSelf::center, baseColumn.withCentre (rect.getCentre()));
930 beginTest (
"flex item with minimum width and height");
932 constexpr auto w = 50.0f;
933 constexpr auto h = 60.0f;
934 const auto test = [&] (
Direction direction, AlignSelf alignment, Rectangle<float> expectedBounds)
936 const auto flex = doLayout (direction, { juce::FlexItem().withAlignSelf (alignment)
938 .withMinHeight (
h) });
939 expect (flex.
items.getFirst().currentBounds == expectedBounds);
942 test (Direction::row, AlignSelf::autoAlign, { rect.getX(), rect.getY(),
w, rect.getHeight() });
943 test (Direction::row, AlignSelf::stretch, { rect.getX(), rect.getY(),
w, rect.getHeight() });
944 test (Direction::row, AlignSelf::flexStart, { rect.getX(), rect.getY(),
w,
h });
945 test (Direction::row, AlignSelf::flexEnd, { rect.getX(), rect.getBottom() -
h,
w,
h });
946 test (Direction::row, AlignSelf::center, { rect.getX(), rect.getY() + (rect.getHeight() -
h) * 0.5f,
w,
h });
948 test (Direction::column, AlignSelf::autoAlign, { rect.getX(), rect.getY(), rect.getWidth(),
h });
949 test (Direction::column, AlignSelf::stretch, { rect.getX(), rect.getY(), rect.getWidth(),
h });
950 test (Direction::column, AlignSelf::flexStart, { rect.getX(), rect.getY(),
w,
h });
951 test (Direction::column, AlignSelf::flexEnd, { rect.getRight() -
w, rect.getY(),
w,
h });
952 test (Direction::column, AlignSelf::center, { rect.getX() + (rect.getWidth() -
w) * 0.5f, rect.getY(),
w,
h });
955 beginTest (
"flex item with maximum width and height");
957 constexpr auto w = 50.0f;
958 constexpr auto h = 60.0f;
959 const auto test = [&] (
Direction direction, AlignSelf alignment, Rectangle<float> expectedBounds)
961 const auto flex = doLayout (direction, { juce::FlexItem().withAlignSelf (alignment)
963 .withMaxHeight (
h) });
964 expect (flex.
items.getFirst().currentBounds == expectedBounds);
967 test (Direction::row, AlignSelf::autoAlign, { rect.getX(), rect.getY(), 0.0f,
h });
968 test (Direction::row, AlignSelf::stretch, { rect.getX(), rect.getY(), 0.0f,
h });
969 test (Direction::row, AlignSelf::flexStart, { rect.getX(), rect.getY(), 0.0f, 0.0f });
970 test (Direction::row, AlignSelf::flexEnd, { rect.getX(), rect.getBottom(), 0.0f, 0.0f });
971 test (Direction::row, AlignSelf::center, { rect.getX(), rect.getCentreY(), 0.0f, 0.0f });
973 test (Direction::column, AlignSelf::autoAlign, { rect.getX(), rect.getY(),
w, 0.0f });
974 test (Direction::column, AlignSelf::stretch, { rect.getX(), rect.getY(),
w, 0.0f });
975 test (Direction::column, AlignSelf::flexStart, { rect.getX(), rect.getY(), 0.0f, 0.0f });
976 test (Direction::column, AlignSelf::flexEnd, { rect.getRight(), rect.getY(), 0.0f, 0.0f });
977 test (Direction::column, AlignSelf::center, { rect.getCentreX(), rect.getY(), 0.0f, 0.0f });
980 beginTest (
"flex item with specified flex");
982 const auto test = [
this, &doLayout] (
Direction direction, AlignSelf alignment, Rectangle<float> expectedBounds)
984 const auto flex = doLayout (direction, { juce::FlexItem().withAlignSelf (alignment).withFlex (1.0f) });
985 expect (flex.
items.getFirst().currentBounds == expectedBounds);
988 test (Direction::row, AlignSelf::autoAlign, { rect.getX(), rect.getY(), rect.getWidth(), rect.getHeight() });
989 test (Direction::row, AlignSelf::stretch, { rect.getX(), rect.getY(), rect.getWidth(), rect.getHeight() });
990 test (Direction::row, AlignSelf::flexStart, { rect.getX(), rect.getY(), rect.getWidth(), 0.0f });
991 test (Direction::row, AlignSelf::flexEnd, { rect.getX(), rect.getBottom(), rect.getWidth(), 0.0f });
992 test (Direction::row, AlignSelf::center, { rect.getX(), rect.getCentreY(), rect.getWidth(), 0.0f });
994 test (Direction::column, AlignSelf::autoAlign, { rect.getX(), rect.getY(), rect.getWidth(), rect.getHeight() });
995 test (Direction::column, AlignSelf::stretch, { rect.getX(), rect.getY(), rect.getWidth(), rect.getHeight() });
996 test (Direction::column, AlignSelf::flexStart, { rect.getX(), rect.getY(), 0.0f, rect.getHeight() });
997 test (Direction::column, AlignSelf::flexEnd, { rect.getRight(), rect.getY(), 0.0f, rect.getHeight() });
998 test (Direction::column, AlignSelf::center, { rect.getCentreX(), rect.getY(), 0.0f, rect.getHeight() });
1001 beginTest (
"flex item with margin");
1003 const FlexItem::Margin margin (10.0f, 20.0f, 30.0f, 40.0f);
1005 const auto test = [
this, &doLayout, &margin] (
Direction direction, AlignSelf alignment, Rectangle<float> expectedBounds)
1007 const auto flex = doLayout (direction, { juce::FlexItem().withAlignSelf (alignment).withMargin (margin) });
1008 expect (flex.
items.getFirst().currentBounds == expectedBounds);
1011 const auto remainingHeight = rect.getHeight() - margin.top - margin.bottom;
1012 const auto remainingWidth = rect.getWidth() - margin.left - margin.right;
1014 test (Direction::row, AlignSelf::autoAlign, { rect.getX() + margin.left, rect.getY() + margin.top, 0.0f, remainingHeight });
1015 test (Direction::row, AlignSelf::stretch, { rect.getX() + margin.left, rect.getY() + margin.top, 0.0f, remainingHeight });
1016 test (Direction::row, AlignSelf::flexStart, { rect.getX() + margin.left, rect.getY() + margin.top, 0.0f, 0.0f });
1017 test (Direction::row, AlignSelf::flexEnd, { rect.getX() + margin.left, rect.getBottom() - margin.bottom, 0.0f, 0.0f });
1018 test (Direction::row, AlignSelf::center, { rect.getX() + margin.left, rect.getY() + margin.top + remainingHeight * 0.5f, 0.0f, 0.0f });
1020 test (Direction::column, AlignSelf::autoAlign, { rect.getX() + margin.left, rect.getY() + margin.top, remainingWidth, 0.0f });
1021 test (Direction::column, AlignSelf::stretch, { rect.getX() + margin.left, rect.getY() + margin.top, remainingWidth, 0.0f });
1022 test (Direction::column, AlignSelf::flexStart, { rect.getX() + margin.left, rect.getY() + margin.top, 0.0f, 0.0f });
1023 test (Direction::column, AlignSelf::flexEnd, { rect.getRight() - margin.right, rect.getY() + margin.top, 0.0f, 0.0f });
1024 test (Direction::column, AlignSelf::center, { rect.getX() + margin.left + remainingWidth * 0.5f, rect.getY() + margin.top, 0.0f, 0.0f });
1027 const AlignSelf alignments[] { AlignSelf::autoAlign,
1029 AlignSelf::flexStart,
1031 AlignSelf::center };
1033 beginTest (
"flex item with auto margin");
1035 for (
const auto& alignment : alignments)
1037 for (
const auto& direction : { Direction::row, Direction::column })
1039 const auto flex = doLayout (direction, { juce::FlexItem().withAlignSelf (alignment)
1040 .withMargin ((
float) FlexItem::autoValue) });
1041 expect (flex.
items.getFirst().currentBounds == Rectangle<float> (rect.getCentre(), rect.getCentre()));
1045 const auto testTop = [
this, &doLayout] (
Direction direction, AlignSelf alignment, Rectangle<float> expectedBounds)
1047 const auto flex = doLayout (direction, { juce::FlexItem().withAlignSelf (alignment)
1048 .withMargin ({ (float) FlexItem::autoValue, 0.0f, 0.0f, 0.0f }) });
1049 expect (flex.
items.getFirst().currentBounds == expectedBounds);
1052 for (
const auto& alignment : alignments)
1053 testTop (Direction::row, alignment, { rect.getX(), rect.getBottom(), 0.0f, 0.0f });
1055 testTop (Direction::column, AlignSelf::autoAlign, { rect.getX(), rect.getBottom(), rect.getWidth(), 0.0f });
1056 testTop (Direction::column, AlignSelf::stretch, { rect.getX(), rect.getBottom(), rect.getWidth(), 0.0f });
1057 testTop (Direction::column, AlignSelf::flexStart, { rect.getX(), rect.getBottom(), 0.0f, 0.0f });
1058 testTop (Direction::column, AlignSelf::flexEnd, { rect.getRight(), rect.getBottom(), 0.0f, 0.0f });
1059 testTop (Direction::column, AlignSelf::center, { rect.getCentreX(), rect.getBottom(), 0.0f, 0.0f });
1061 const auto testBottom = [
this, &doLayout] (
Direction direction, AlignSelf alignment, Rectangle<float> expectedBounds)
1063 const auto flex = doLayout (direction, { juce::FlexItem().withAlignSelf (alignment)
1064 .withMargin ({ 0.0f, 0.0f, (float) FlexItem::autoValue, 0.0f }) });
1065 expect (flex.
items.getFirst().currentBounds == expectedBounds);
1068 for (
const auto& alignment : alignments)
1069 testBottom (Direction::row, alignment, { rect.getX(), rect.getY(), 0.0f, 0.0f });
1071 testBottom (Direction::column, AlignSelf::autoAlign, { rect.getX(), rect.getY(), rect.getWidth(), 0.0f });
1072 testBottom (Direction::column, AlignSelf::stretch, { rect.getX(), rect.getY(), rect.getWidth(), 0.0f });
1073 testBottom (Direction::column, AlignSelf::flexStart, { rect.getX(), rect.getY(), 0.0f, 0.0f });
1074 testBottom (Direction::column, AlignSelf::flexEnd, { rect.getRight(), rect.getY(), 0.0f, 0.0f });
1075 testBottom (Direction::column, AlignSelf::center, { rect.getCentreX(), rect.getY(), 0.0f, 0.0f });
1077 const auto testLeft = [
this, &doLayout] (
Direction direction, AlignSelf alignment, Rectangle<float> expectedBounds)
1079 const auto flex = doLayout (direction, { juce::FlexItem().withAlignSelf (alignment)
1080 .withMargin ({ 0.0f, 0.0f, 0.0f, (float) FlexItem::autoValue }) });
1081 expect (flex.
items.getFirst().currentBounds == expectedBounds);
1084 testLeft (Direction::row, AlignSelf::autoAlign, { rect.getRight(), rect.getY(), 0.0f, rect.getHeight() });
1085 testLeft (Direction::row, AlignSelf::stretch, { rect.getRight(), rect.getY(), 0.0f, rect.getHeight() });
1086 testLeft (Direction::row, AlignSelf::flexStart, { rect.getRight(), rect.getY(), 0.0f, 0.0f });
1087 testLeft (Direction::row, AlignSelf::flexEnd, { rect.getRight(), rect.getBottom(), 0.0f, 0.0f });
1088 testLeft (Direction::row, AlignSelf::center, { rect.getRight(), rect.getCentreY(), 0.0f, 0.0f });
1090 for (
const auto& alignment : alignments)
1091 testLeft (Direction::column, alignment, { rect.getRight(), rect.getY(), 0.0f, 0.0f });
1093 const auto testRight = [
this, &doLayout] (
Direction direction, AlignSelf alignment, Rectangle<float> expectedBounds)
1095 const auto flex = doLayout (direction, { juce::FlexItem().withAlignSelf (alignment)
1096 .withMargin ({ 0.0f, (float) FlexItem::autoValue, 0.0f, 0.0f }) });
1097 expect (flex.
items.getFirst().currentBounds == expectedBounds);
1100 testRight (Direction::row, AlignSelf::autoAlign, { rect.getX(), rect.getY(), 0.0f, rect.getHeight() });
1101 testRight (Direction::row, AlignSelf::stretch, { rect.getX(), rect.getY(), 0.0f, rect.getHeight() });
1102 testRight (Direction::row, AlignSelf::flexStart, { rect.getX(), rect.getY(), 0.0f, 0.0f });
1103 testRight (Direction::row, AlignSelf::flexEnd, { rect.getX(), rect.getBottom(), 0.0f, 0.0f });
1104 testRight (Direction::row, AlignSelf::center, { rect.getX(), rect.getCentreY(), 0.0f, 0.0f });
1106 for (
const auto& alignment : alignments)
1107 testRight (Direction::column, alignment, { rect.getX(), rect.getY(), 0.0f, 0.0f });
1110 beginTest (
"in a multiline layout, items too large to fit on the main axis are given a line to themselves");
1112 const auto spacer = 10.0f;
1114 for (
const auto alignment : alignments)
1117 flex.
flexWrap = FlexBox::Wrap::wrap;
1118 flex.
items = { FlexItem().withAlignSelf (alignment)
1120 .withHeight (spacer),
1121 FlexItem().withAlignSelf (alignment)
1122 .withWidth (rect.getWidth() * 2)
1123 .withHeight (rect.getHeight()),
1124 FlexItem().withAlignSelf (alignment)
1126 .withHeight (spacer) };
1129 expect (flex.
items[0].currentBounds == Rectangle<float> (rect.getX(), rect.getY(), spacer, spacer));
1130 expect (flex.
items[1].currentBounds == Rectangle<float> (rect.getX(), rect.getY() + spacer, rect.getWidth(), rect.getHeight()));
1131 expect (flex.
items[2].currentBounds == Rectangle<float> (rect.getX(), rect.getBottom() + spacer, 10.0f, 10.0f));
1137static FlexBoxTests flexBoxTests;
Type jmin(const Type a, const Type b)
Definition MathsFunctions.h:60
Type jmax(const Type a, const Type b)
Definition MathsFunctions.h:48
Direction
Definition CarlaStyle.cpp:109
#define noexcept
Definition DistrhoDefines.h:72
uint8_t a
Definition Spc_Cpu.h:141
Definition juce_Array.h:56
Definition juce_Component.h:36
Definition juce_FlexBox.h:43
JustifyContent justifyContent
Definition juce_FlexBox.h:134
AlignContent
Definition juce_FlexBox.h:64
@ stretch
Definition juce_FlexBox.h:65
@ center
Definition juce_FlexBox.h:68
@ spaceBetween
Definition juce_FlexBox.h:69
@ flexEnd
Definition juce_FlexBox.h:67
@ spaceAround
Definition juce_FlexBox.h:70
@ flexStart
Definition juce_FlexBox.h:66
Wrap
Definition juce_FlexBox.h:56
@ noWrap
Definition juce_FlexBox.h:57
@ wrapReverse
Definition juce_FlexBox.h:59
Direction
Definition juce_FlexBox.h:47
@ rowReverse
Definition juce_FlexBox.h:49
@ columnReverse
Definition juce_FlexBox.h:51
JustifyContent
Definition juce_FlexBox.h:84
@ center
Definition juce_FlexBox.h:87
@ spaceBetween
Definition juce_FlexBox.h:88
@ flexEnd
Definition juce_FlexBox.h:86
@ spaceAround
Definition juce_FlexBox.h:89
FlexBox() noexcept=default
Wrap flexWrap
Definition juce_FlexBox.h:118
void performLayout(Rectangle< float > targetArea)
Definition juce_FlexBox.cpp:748
AlignItems
Definition juce_FlexBox.h:75
@ stretch
Definition juce_FlexBox.h:76
@ center
Definition juce_FlexBox.h:79
@ flexEnd
Definition juce_FlexBox.h:78
@ flexStart
Definition juce_FlexBox.h:77
Array< FlexItem > items
Definition juce_FlexBox.h:137
AlignItems alignItems
Definition juce_FlexBox.h:127
Direction flexDirection
Definition juce_FlexBox.h:113
AlignContent alignContent
Definition juce_FlexBox.h:124
Definition juce_FlexItem.h:37
float height
Definition juce_FlexItem.h:119
AlignSelf
Definition juce_FlexItem.h:95
@ stretch
Definition juce_FlexItem.h:100
@ center
Definition juce_FlexItem.h:99
@ flexEnd
Definition juce_FlexItem.h:98
@ flexStart
Definition juce_FlexItem.h:97
@ autoAlign
Definition juce_FlexItem.h:96
FlexItem() noexcept
Definition juce_FlexBox.cpp:788
FlexItem withHeight(float newHeight) const noexcept
Definition juce_FlexBox.cpp:827
FlexItem withWidth(float newWidth) const noexcept
Definition juce_FlexBox.cpp:821
float minWidth
Definition juce_FlexItem.h:116
float maxHeight
Definition juce_FlexItem.h:121
FlexItem withOrder(int newOrder) const noexcept
Definition juce_FlexBox.cpp:830
static const int autoValue
Definition juce_FlexItem.h:111
FlexItem withAlignSelf(AlignSelf newAlignSelf) const noexcept
Definition juce_FlexBox.cpp:831
FlexItem withMinWidth(float newMinWidth) const noexcept
Definition juce_FlexBox.cpp:822
FlexItem withMinHeight(float newMinHeight) const noexcept
Definition juce_FlexBox.cpp:825
float minHeight
Definition juce_FlexItem.h:120
FlexItem withMargin(Margin) const noexcept
Definition juce_FlexBox.cpp:829
FlexItem withMaxHeight(float newMaxHeight) const noexcept
Definition juce_FlexBox.cpp:826
float width
Definition juce_FlexItem.h:115
FlexBox * associatedFlexBox
Definition juce_FlexItem.h:68
Component * associatedComponent
Definition juce_FlexItem.h:65
float maxWidth
Definition juce_FlexItem.h:117
FlexItem withMaxWidth(float newMaxWidth) const noexcept
Definition juce_FlexBox.cpp:823
FlexItem withFlex(float newFlexGrow) const noexcept
Definition juce_FlexBox.cpp:800
Rectangle< float > currentBounds
Definition juce_FlexItem.h:62
Margin margin
Definition juce_FlexItem.h:137
static const int notAssigned
Definition juce_FlexItem.h:113
Definition juce_HeapBlock.h:87
Definition juce_Rectangle.h:67
Rectangle< float > toFloat() const noexcept
Definition juce_Rectangle.h:873
Point< ValueType > getPosition() const noexcept
Definition juce_Rectangle.h:161
static Rectangle leftTopRightBottom(ValueType left, ValueType top, ValueType right, ValueType bottom) noexcept
Definition juce_Rectangle.h:107
ValueType getHeight() const noexcept
Definition juce_Rectangle.h:136
ValueType getWidth() const noexcept
Definition juce_Rectangle.h:133
Definition juce_UnitTest.h:70
Definition juce_Value.h:51
UINT_D64 w
Definition inflate.c:942
int * l
Definition inflate.c:1579
unsigned * m
Definition inflate.c:1559
struct huft * t
Definition inflate.c:943
int y
Definition inflate.c:1588
unsigned v[N_MAX]
Definition inflate.c:1584
unsigned d
Definition inflate.c:940
register unsigned i
Definition inflate.c:1575
unsigned x[BMAX+1]
Definition inflate.c:1586
struct @113205115357366127300225113341150224053346037032::@137033172036070230260373056156374243321245367362 left
struct @113205115357366127300225113341150224053346037032::@137033172036070230260373056156374243321245367362 right
static PuglViewHint int value
Definition pugl.h:1708
static int JUCE_CDECL comp(const void *a, const void *b)
Definition lsp.c:298
Definition juce_UnitTestCategories.h:27
Definition carla_juce.cpp:31
constexpr Type jmax(Type a, Type b)
Definition juce_MathsFunctions.h:94
@ column
Definition juce_AccessibilityRole.h:52
@ row
Definition juce_AccessibilityRole.h:53
GUI::ui_handle_t gui
Definition main.cpp:50
png_uint_32 length
Definition png.c:2247
static int test(SerdEnv *env, bool top_level, bool pretty_numbers)
Definition sratom_test.c:79
int main(int argc, char **argv)
Definition main.cpp:247
Definition juce_FlexBox.cpp:46
ItemWithState(FlexItem &source) noexcept
Definition juce_FlexBox.cpp:47
void resetItemLockedSize() noexcept
Definition juce_FlexBox.cpp:55
Coord lockedMarginRight
Definition juce_FlexBox.cpp:51
Coord lockedWidth
Definition juce_FlexBox.cpp:50
FlexItem * item
Definition juce_FlexBox.cpp:49
bool locked
Definition juce_FlexBox.cpp:53
Coord lockedMarginBottom
Definition juce_FlexBox.cpp:51
Coord preferredHeight
Definition juce_FlexBox.cpp:52
Coord preferredWidth
Definition juce_FlexBox.cpp:52
Coord lockedHeight
Definition juce_FlexBox.cpp:50
Coord lockedMarginLeft
Definition juce_FlexBox.cpp:51
Coord lockedMarginTop
Definition juce_FlexBox.cpp:51
Definition juce_FlexBox.cpp:67
Coord totalLength
Definition juce_FlexBox.cpp:69
Coord crossSize
Definition juce_FlexBox.cpp:69
int numItems
Definition juce_FlexBox.cpp:68
Coord lineY
Definition juce_FlexBox.cpp:69
Definition juce_FlexBox.cpp:30
auto & getPreferredSize(Axis axis, ItemWithState &item) const
Definition juce_FlexBox.cpp:125
const int numItems
Definition juce_FlexBox.cpp:74
void calculateCrossSizeOfAllItems() noexcept
Definition juce_FlexBox.cpp:289
auto & getItemSize(Axis axis, ItemWithState &item) const
Definition juce_FlexBox.cpp:135
void recalculateTotalItemLengthPerLineArray() noexcept
Definition juce_FlexBox.cpp:631
static bool isAssigned(Coord value) noexcept
Definition juce_FlexBox.cpp:88
const Coord containerLineLength
Definition juce_FlexBox.cpp:76
static bool isAuto(Coord value) noexcept
Definition juce_FlexBox.cpp:87
void resolveFlexibleLengths() noexcept
Definition juce_FlexBox.cpp:215
Axis
Definition juce_FlexBox.cpp:33
@ cross
Definition juce_FlexBox.cpp:33
@ main
Definition juce_FlexBox.cpp:33
void initialiseItems() noexcept
Definition juce_FlexBox.cpp:168
auto & getLockedSize(Axis axis, ItemWithState &item) const
Definition juce_FlexBox.cpp:120
HeapBlock< ItemWithState * > lineItems
Definition juce_FlexBox.cpp:81
auto & getMaxSize(Axis axis, ItemWithState &item) const
Definition juce_FlexBox.cpp:145
ItemWithState & getItem(int x, int y) const noexcept
Definition juce_FlexBox.cpp:85
void resetRowItems(const int row) noexcept
Definition juce_FlexBox.cpp:550
void resetUnlockedRowItems(const int row) noexcept
Definition juce_FlexBox.cpp:558
FlexBox & owner
Definition juce_FlexBox.cpp:72
void resetItem(ItemWithState &item) noexcept
Definition juce_FlexBox.cpp:571
double Coord
Definition juce_FlexBox.cpp:31
Coord getItemCrossSize(const ItemWithState &item) const noexcept
Definition juce_FlexBox.cpp:680
auto & getEndMargin(Axis axis, ItemWithState &item) const
Definition juce_FlexBox.cpp:105
void alignLinesPerAlignContent() noexcept
Definition juce_FlexBox.cpp:308
bool isSingleLine() const
Definition juce_FlexBox.cpp:92
Coord containerCrossLength
Definition juce_FlexBox.cpp:79
HeapBlock< RowInfo > lineInfo
Definition juce_FlexBox.cpp:82
void reverseLocations() noexcept
Definition juce_FlexBox.cpp:643
auto & getStartMargin(Axis axis, ItemWithState &item) const
Definition juce_FlexBox.cpp:100
void resolveAutoMarginsOnCrossAxis() noexcept
Definition juce_FlexBox.cpp:376
void layoutAllItems() noexcept
Definition juce_FlexBox.cpp:524
auto & getMinSize(Axis axis, ItemWithState &item) const
Definition juce_FlexBox.cpp:140
bool layoutRowItems(const int row) noexcept
Definition juce_FlexBox.cpp:579
void reverseWrap() noexcept
Definition juce_FlexBox.cpp:657
void alignItemsByJustifyContent() noexcept
Definition juce_FlexBox.cpp:477
Array< ItemWithState > itemStates
Definition juce_FlexBox.cpp:83
const bool isRowDirection
Definition juce_FlexBox.cpp:75
Coord getItemMainSize(const ItemWithState &item) const noexcept
Definition juce_FlexBox.cpp:674
void alignItemsInCrossAxisInLinesPerAlignSelf() noexcept
Definition juce_FlexBox.cpp:402
FlexBoxLayoutCalculation(FlexBox &fb, Coord w, Coord h)
Definition juce_FlexBox.cpp:35
void createStates()
Definition juce_FlexBox.cpp:151
Coord getContainerSize(Axis axis) const
Definition juce_FlexBox.cpp:130
const Coord parentHeight
Definition juce_FlexBox.cpp:73
bool addToItemLength(ItemWithState &item, const Coord length, int row) const noexcept
Definition juce_FlexBox.cpp:686
int numberOfRows
Definition juce_FlexBox.cpp:78
const Coord parentWidth
Definition juce_FlexBox.cpp:73
auto & getStartLockedMargin(Axis axis, ItemWithState &item) const
Definition juce_FlexBox.cpp:110
Value & pickForAxis(Axis axis, Value &x, Value &y) const
Definition juce_FlexBox.cpp:95
static Coord getValueOrZeroIfAuto(Coord value) noexcept
Definition juce_FlexBox.cpp:89
auto & getEndLockedMargin(Axis axis, ItemWithState &item) const
Definition juce_FlexBox.cpp:115
void resolveAutoMarginsOnMainAxis() noexcept
Definition juce_FlexBox.cpp:231
Coord computePreferredSize(Axis axis, ItemWithState &itemWithState) const noexcept
Definition juce_FlexBox.cpp:718
void calculateCrossSizesByLine() noexcept
Definition juce_FlexBox.cpp:265
Definition juce_FlexItem.h:125
Margin() noexcept
Definition juce_FlexBox.cpp:795
float right
Definition juce_FlexItem.h:131
float left
Definition juce_FlexItem.h:130
float bottom
Definition juce_FlexItem.h:133
float top
Definition juce_FlexItem.h:132
void Rectangle(HDC ctx, int l, int t, int r, int b)
Definition swell-gdi-generic.cpp:279
return c
Definition crypt.c:175
int r
Definition crypt.c:458
uch h[RAND_HEAD_LEN]
Definition crypt.c:459