44 float totalCellSize = 0.0f;
46 for (
const auto& trackInfo : tracks)
47 if (! trackInfo.isFractional() || trackInfo.isAuto())
48 totalCellSize += trackInfo.getSize();
50 float totalGap = tracks.size() > 1 ?
static_cast<float> ((tracks.size() - 1) * gapSize.pixels)
53 return totalCellSize + totalGap;
58 const float totalRelative =
jlimit (0.0f,
size,
size - totalAbsolute);
59 float factorsSum = 0.0f;
61 for (
const auto& trackInfo : tracks)
62 if (trackInfo.isFractional())
63 factorsSum += trackInfo.getSize();
66 return totalRelative / factorsSum;
93 return std::any_of (tracks.
begin(),
95 [] (
const auto&
t) { return t.isFractional(); });
99 Px columnGapToUse,
Px rowGapToUse,
142 for (
int i = 1;
i <= tracks.
size(); ++
i)
153 if (
i > 1 &&
i <= tracks.
size())
164 if (
i == tracks.
size())
186 for (
int i = 0;
i < lines.size();
i++)
188 for (
const auto&
name : lines.getReference (
i).lineNames)
233 for (
int i = startLineNumber;
i < lines.size();
i++)
235 for (
const auto&
name : lines.getReference (
i).lineNames)
258 if (propertyWithSpan.
hasName())
261 return startLineNumber + propertyWithSpan.
getNumber();
305 std::swap (
s.start,
s.end);
306 else if (
s.start ==
s.end)
314 const std::map<String, LineArea>& namedAreas)
321 return namedAreas.at (item.
area);
333 for (
const auto& areaString : areasStrings)
336 if (strings.
size() > 0)
338 for (
auto s : strings)
340 jassert (
s.size() == strings[0].size());
351 for (
auto& stringArray : stringsArrays)
353 for (
auto&
string : stringArray)
373 if (
string == area.
name)
393 std::map<String, LineArea> areas;
395 for (
auto area =
findArea (stringsArrays); area.name.isNotEmpty(); area =
findArea (stringsArrays))
397 if (areas.count (area.name) == 0)
398 areas[area.name] = area.lines;
412 for (
const auto* it = tracks.
begin(); it != tracks.
begin() + trackNumber; ++it)
413 c += it->getAbsoluteSize (relativeUnit) +
static_cast<float> (gap.
pixels);
436 int columnNumber,
int rowNumber,
437 int numberOfColumns,
int numberOfRows,
456 const auto shift = ((float) (rowNumber - 1) * (calculation.
remainingHeight / float(numberOfRows - 1)));
462 const auto shift = ((float) (columnNumber - 1) * (calculation.
remainingWidth / float(numberOfColumns - 1)));
468 const auto shift = ((float) rowNumber * (calculation.
remainingHeight / float(numberOfRows + 1)));
474 const auto shift = ((float) columnNumber * (calculation.
remainingWidth / float(numberOfColumns + 1)));
480 const auto inbetweenShift = calculation.
remainingHeight / float(numberOfRows);
481 const auto sidesShift = inbetweenShift / 2;
482 auto shift = (float) (rowNumber - 1) * inbetweenShift + sidesShift;
489 const auto inbetweenShift = calculation.
remainingWidth / float(numberOfColumns);
490 const auto sidesShift = inbetweenShift / 2;
491 auto shift = (float) (columnNumber - 1) * inbetweenShift + sidesShift;
507 const auto findAlignedCell = [&] (
int column,
int row)
520 const auto startCell = findAlignedCell (columnRange.
start, rowRange.
start);
521 const auto endCell = findAlignedCell (columnRange.
end - 1, rowRange.
end - 1);
523 const auto horizontalRange = startCell.getHorizontalRange().getUnionWith (endCell.getHorizontalRange());
524 const auto verticalRange = startCell.getVerticalRange() .getUnionWith (endCell.getVerticalRange());
525 return { horizontalRange.getStart(), verticalRange.getStart(),
526 horizontalRange.getLength(), verticalRange.getLength() };
530template <
typename Item>
555 for (
int i = 0;
i < columnSpan;
i++)
556 for (
int j = 0;
j < rowSpan;
j++)
559 return { {
cell.column,
cell.column + columnSpan }, {
cell.row,
cell.row + rowSpan } };
571 referenceCell =
advance (referenceCell);
573 return referenceCell;
581 while (
isOccupied (referenceCell, columnSpan, rowSpan)
582 || (referenceCell.
row != rowNumber))
583 referenceCell =
advance (referenceCell);
585 return referenceCell;
593 while (
isOccupied (referenceCell, columnSpan, rowSpan)
594 || (referenceCell.
column != columnNumber))
595 referenceCell =
advance (referenceCell);
597 return referenceCell;
640 for (
int i = 0;
i < columnSpan;
i++)
641 for (
int j = 0;
j < rowSpan;
j++)
653 return highestIndexOfGrid < highestIndexOfCell;
680 return { mainDimension, crossDimension };
682 return { crossDimension, mainDimension };
760 for (
auto& item : grid.
items)
761 sortedItems.
add (&item);
763 std::stable_sort (sortedItems.
begin(), sortedItems.
end(),
764 [] (
const GridItem* i1,
const GridItem* i2) { return i1->order < i2->order; });
767 for (
auto* item : sortedItems)
772 plane.
setCell ({
a.column.start,
a.row.start }, {
a.column.end,
a.row.end });
773 itemPlacementArray.
add ({ item,
a });
779 for (
auto* item : sortedItems)
786 const auto columnSpan = std::abs (
p.start -
p.end);
792 const auto lineArea = plane.
setCell (nextAvailableCell, columnSpan, rowSpan);
793 lastInsertionCell = nextAvailableCell;
795 itemPlacementArray.
add ({ item, lineArea });
801 const auto rowSpan = std::abs (
p.start -
p.end);
806 const auto nextAvailableCell = plane.
nextAvailableOnRow (insertionCell, columnSpan, rowSpan,
p.start);
807 const auto lineArea = plane.
setCell (nextAvailableCell, columnSpan, rowSpan);
809 lastInsertionCell = nextAvailableCell;
811 itemPlacementArray.
add ({ item, lineArea });
817 for (
auto* item : sortedItems)
821 lastInsertionCell = { 1, 1 };
823 for (
auto* item : sortedItems)
830 const auto nextAvailableCell = plane.
nextAvailable (lastInsertionCell, columnSpan, rowSpan);
831 const auto lineArea = plane.
setCell (nextAvailableCell, columnSpan, rowSpan);
834 lastInsertionCell = nextAvailableCell;
836 itemPlacementArray.
add ({ item, lineArea });
840 return itemPlacementArray;
844 template <
typename Accessor>
850 const auto combine = [&accessor] (
const auto& acc,
const auto& item)
852 const auto newRange = accessor (item);
854 std::max (acc.end, newRange.end) };
857 return std::accumulate (std::next (
items.begin()),
items.end(), accessor (*
items.begin()), combine);
866 template <
typename Item>
870 result.insertMultiple (-1, item, repeats);
878 const auto leadingColumns = std::max (0, 1 - fullArea.column.start);
879 const auto leadingRows = std::max (0, 1 - fullArea.row.start);
881 const auto trailingColumns = std::max (0, fullArea.column.end - grid.
templateColumns.size() - 1);
882 const auto trailingRows = std::max (0, fullArea.row .end - grid.
templateRows .size() - 1);
893 const auto setSizes = [&placements] (
auto& tracksInDirection,
const auto& getItem,
const auto& getItemSize)
895 auto& array = tracksInDirection.items;
897 for (
int index = 0; index < array.size(); ++index)
899 if (array.getReference (index).isAuto())
901 const auto combiner = [&] (
const auto acc,
const auto& element)
903 const auto item = getItem (element.second);
904 const auto isNotSpan = std::abs (item.end - item.start) <= 1;
905 return isNotSpan && item.start == index + 1 - tracksInDirection.numImplicitLeading
906 ? std::max (acc, getItemSize (*element.first))
910 array.getReference (index).size = std::accumulate (placements.
begin(), placements.
end(), 0.0f, combiner);
915 setSizes (tracks.
rows,
916 [] (
const auto&
i) { return i.row; },
917 [] (
const auto&
i) { return i.height + i.margin.top + i.margin.bottom; });
920 [] (
const auto&
i) { return i.column; },
921 [] (
const auto&
i) { return i.width + i.margin.left + i.margin.right; });
971 :
size (
static_cast<float> (sizeInPixels.pixels)),
isFraction (
false) {}
974 :
size ((
float)fractionOfFreeSpace.fraction),
isFraction (
true) {}
1001 :
TrackInfo (startLineNameToUse, sizeInPixels)
1007 :
TrackInfo (startLineNameToUse, fractionOfFreeSpace)
1033 for (
auto& itemAndArea : itemsAndAreas)
1035 const auto a = itemAndArea.second;
1045 auto* item = itemAndArea.first;
1049 if (
auto*
c = item->associatedComponent)
1050 c->setBounds (item->currentBounds.toNearestIntEdges());
1063 void runTest()
override
1065 using Fr = Grid::Fr;
1066 using Tr = Grid::TrackInfo;
1069 beginTest (
"Layout calculation of an empty grid is a no-op");
1073 grid.performLayout (bounds);
1079 grid.templateColumns.add (Tr (1_fr));
1080 grid.templateRows.addArray ({ Tr (20_px), Tr (1_fr) });
1082 grid.items.addArray ({ GridItem().withArea (1, 1),
1083 GridItem().withArea (2, 1) });
1085 grid.performLayout (Rectangle<int> (200, 400));
1087 beginTest (
"Layout calculation test: 1 column x 2 rows: no gap");
1088 expect (grid.items[0].currentBounds == Rect (0.0f, 0.0f, 200.f, 20.0f));
1089 expect (grid.items[1].currentBounds == Rect (0.0f, 20.0f, 200.f, 380.0f));
1091 grid.templateColumns.add (Tr (50_px));
1092 grid.templateRows.add (Tr (2_fr));
1094 grid.items.addArray ( { GridItem().withArea (1, 2),
1095 GridItem().withArea (2, 2),
1096 GridItem().withArea (3, 1),
1097 GridItem().withArea (3, 2) });
1099 grid.performLayout (Rectangle<int> (150, 170));
1101 beginTest (
"Layout calculation test: 2 columns x 3 rows: no gap");
1102 expect (grid.items[0].currentBounds == Rect (0.0f, 0.0f, 100.0f, 20.0f));
1103 expect (grid.items[1].currentBounds == Rect (0.0f, 20.0f, 100.0f, 50.0f));
1104 expect (grid.items[2].currentBounds == Rect (100.0f, 0.0f, 50.0f, 20.0f));
1105 expect (grid.items[3].currentBounds == Rect (100.0f, 20.0f, 50.0f, 50.0f));
1106 expect (grid.items[4].currentBounds == Rect (0.0f, 70.0f, 100.0f, 100.0f));
1107 expect (grid.items[5].currentBounds == Rect (100.0f, 70.0f, 50.0f, 100.0f));
1109 grid.columnGap = 20_px;
1110 grid.rowGap = 10_px;
1112 grid.performLayout (Rectangle<int> (200, 310));
1114 beginTest (
"Layout calculation test: 2 columns x 3 rows: rowGap of 10 and columnGap of 20");
1115 expect (grid.items[0].currentBounds == Rect (0.0f, 0.0f, 130.0f, 20.0f));
1116 expect (grid.items[1].currentBounds == Rect (0.0f, 30.0f, 130.0f, 90.0f));
1117 expect (grid.items[2].currentBounds == Rect (150.0f, 0.0f, 50.0f, 20.0f));
1118 expect (grid.items[3].currentBounds == Rect (150.0f, 30.0f, 50.0f, 90.0f));
1119 expect (grid.items[4].currentBounds == Rect (0.0f, 130.0f, 130.0f, 180.0f));
1120 expect (grid.items[5].currentBounds == Rect (150.0f, 130.0f, 50.0f, 180.0f));
1126 grid.templateColumns.addArray ({ Tr (
"first", 20_px,
"in"), Tr (
"in", 1_fr,
"in"), Tr (20_px,
"last") });
1127 grid.templateRows.addArray ({ Tr (1_fr),
1131 beginTest (
"Grid items placement tests: integer and custom ident, counting forward");
1133 GridItem i1, i2, i3, i4, i5;
1134 i1.column = { 1, 4 };
1137 i2.column = { 1, 3 };
1140 i3.column = {
"first",
"in" };
1143 i4.column = {
"first", { 2,
"in" } };
1146 i5.column = {
"first",
"last" };
1149 grid.items.addArray ({ i1, i2, i3, i4, i5 });
1151 grid.performLayout ({ 140, 100 });
1153 expect (grid.items[0].currentBounds == Rect (0.0f, 0.0f, 140.0f, 80.0f));
1154 expect (grid.items[1].currentBounds == Rect (0.0f, 0.0f, 120.0f, 100.0f));
1155 expect (grid.items[2].currentBounds == Rect (0.0f, 80.0f, 20.0f, 20.0f));
1156 expect (grid.items[3].currentBounds == Rect (0.0f, 0.0f, 120.0f, 80.0f));
1157 expect (grid.items[4].currentBounds == Rect (0.0f, 0.0f, 140.0f, 80.0f));
1164 grid.templateColumns.addArray ({ Tr (
"first", 20_px,
"in"), Tr (
"in", 1_fr,
"in"), Tr (20_px,
"last") });
1165 grid.templateRows.addArray ({ Tr (1_fr),
1168 beginTest (
"Grid items placement tests: integer and custom ident, counting forward, reversed end and start");
1170 GridItem i1, i2, i3, i4, i5;
1171 i1.column = { 4, 1 };
1174 i2.column = { 3, 1 };
1177 i3.column = {
"in",
"first" };
1180 i4.column = {
"first", { 2,
"in" } };
1183 i5.column = {
"last",
"first" };
1186 grid.items.addArray ({ i1, i2, i3, i4, i5 });
1188 grid.performLayout ({ 140, 100 });
1190 expect (grid.items[0].currentBounds == Rect (0.0f, 0.0f, 140.0f, 80.0f));
1191 expect (grid.items[1].currentBounds == Rect (0.0f, 0.0f, 120.0f, 100.0f));
1192 expect (grid.items[2].currentBounds == Rect (0.0f, 80.0f, 20.0f, 20.0f));
1193 expect (grid.items[3].currentBounds == Rect (0.0f, 0.0f, 120.0f, 80.0f));
1194 expect (grid.items[4].currentBounds == Rect (0.0f, 0.0f, 140.0f, 80.0f));
1200 grid.templateColumns = { Tr (
"first", 20_px,
"in"), Tr (
"in", 1_fr,
"in"), Tr (20_px,
"last") };
1201 grid.templateRows = { Tr (1_fr), Tr (20_px) };
1203 beginTest (
"Grid items placement tests: integer, counting backward");
1205 grid.items = { GridItem{}.withColumn ({ -2, -1 }).withRow ({ 1, 3 }),
1206 GridItem{}.withColumn ({ -10, -1 }).withRow ({ 1, -1 }) };
1208 grid.performLayout ({ 140, 100 });
1210 expect (grid.items[0].currentBounds == Rect (120.0f, 0.0f, 20.0f, 100.0f));
1211 expect (grid.items[1].currentBounds == Rect (0.0f, 0.0f, 140.0f, 100.0f));
1215 beginTest (
"Grid items placement tests: areas");
1219 grid.templateColumns = { Tr (50_px), Tr (100_px), Tr (Fr (1_fr)), Tr (50_px) };
1220 grid.templateRows = { Tr (50_px),
1224 grid.templateAreas = {
"header header header header",
1225 "main main . sidebar",
1226 "footer footer footer footer" };
1228 grid.items.addArray ({ GridItem().withArea (
"header"),
1229 GridItem().withArea (
"main"),
1230 GridItem().withArea (
"sidebar"),
1231 GridItem().withArea (
"footer"),
1234 grid.performLayout ({ 300, 150 });
1236 expect (grid.items[0].currentBounds == Rect (0.f, 0.f, 300.f, 50.f));
1237 expect (grid.items[1].currentBounds == Rect (0.f, 50.f, 150.f, 50.f));
1238 expect (grid.items[2].currentBounds == Rect (250.f, 50.f, 50.f, 50.f));
1239 expect (grid.items[3].currentBounds == Rect (0.f, 100.f, 300.f, 50.f));
1243 beginTest (
"Grid implicit rows and columns: triggered by areas");
1247 grid.templateColumns = { Tr (50_px), Tr (100_px), Tr (1_fr), Tr (50_px) };
1248 grid.templateRows = { Tr (50_px),
1252 grid.autoRows = Tr (30_px);
1253 grid.autoColumns = Tr (30_px);
1255 grid.templateAreas = {
"header header header header header",
1256 "main main . sidebar sidebar",
1257 "footer footer footer footer footer",
1258 "sub sub sub sub sub"};
1260 grid.items.addArray ({ GridItem().withArea (
"header"),
1261 GridItem().withArea (
"main"),
1262 GridItem().withArea (
"sidebar"),
1263 GridItem().withArea (
"footer"),
1264 GridItem().withArea (
"sub"),
1267 grid.performLayout ({ 330, 180 });
1269 expect (grid.items[0].currentBounds == Rect (0.f, 0.f, 330.f, 50.f));
1270 expect (grid.items[1].currentBounds == Rect (0.f, 50.f, 150.f, 50.f));
1271 expect (grid.items[2].currentBounds == Rect (250.f, 50.f, 80.f, 50.f));
1272 expect (grid.items[3].currentBounds == Rect (0.f, 100.f, 330.f, 50.f));
1273 expect (grid.items[4].currentBounds == Rect (0.f, 150.f, 330.f, 30.f));
1277 beginTest (
"Grid implicit rows and columns: triggered by areas");
1281 grid.templateColumns = { Tr (50_px), Tr (100_px), Tr (1_fr), Tr (50_px) };
1282 grid.templateRows = { Tr (50_px),
1286 grid.autoRows = Tr (1_fr);
1287 grid.autoColumns = Tr (1_fr);
1289 grid.templateAreas = {
"header header header header",
1290 "main main . sidebar",
1291 "footer footer footer footer" };
1293 grid.items.addArray ({ GridItem().withArea (
"header"),
1294 GridItem().withArea (
"main"),
1295 GridItem().withArea (
"sidebar"),
1296 GridItem().withArea (
"footer"),
1297 GridItem().withArea (4, 5, 6, 7)
1300 grid.performLayout ({ 350, 250 });
1302 expect (grid.items[0].currentBounds == Rect (0.f, 0.f, 250.f, 50.f));
1303 expect (grid.items[1].currentBounds == Rect (0.f, 50.f, 150.f, 50.f));
1304 expect (grid.items[2].currentBounds == Rect (200.f, 50.f, 50.f, 50.f));
1305 expect (grid.items[3].currentBounds == Rect (0.f, 100.f, 250.f, 50.f));
1306 expect (grid.items[4].currentBounds == Rect (250.f, 150.f, 100.f, 100.f));
1310 beginTest (
"Grid implicit rows and columns: triggered by out-of-bounds indices");
1314 grid.templateColumns = { Tr (1_fr), Tr (1_fr) };
1315 grid.templateRows = { Tr (60_px), Tr (60_px) };
1317 grid.autoColumns = Tr (20_px);
1318 grid.autoRows = Tr (1_fr);
1320 grid.items = { GridItem{}.withColumn ({ 5, 8 }).withRow ({ -5, -4 }),
1321 GridItem{}.withColumn ({ 4, 7 }).withRow ({ -4, -3 }),
1322 GridItem{}.withColumn ({ -2, -1 }).withRow ({ 4, 5 }) };
1324 grid.performLayout ({ 500, 400 });
1354 expect (grid.items[0].currentBounds == Rect (440.0f, 0.0f, 60.0f, 70.0f));
1355 expect (grid.items[1].currentBounds == Rect (420.0f, 70.0f, 60.0f, 70.0f));
1356 expect (grid.items[2].currentBounds == Rect (200.0f, 330.0f, 200.0f, 70.0f));
1361static GridTests gridUnitTests;
#define copy(x)
Definition ADnoteParameters.cpp:1011
Type jmax(const Type a, const Type b)
Definition MathsFunctions.h:48
#define noexcept
Definition DistrhoDefines.h:72
uint8_t a
Definition Spc_Cpu.h:141
static celltype cell[MAXCELLS]
Definition adlibemu.c:89
Definition juce_Array.h:56
int size() const noexcept
Definition juce_Array.h:215
ElementType * begin() noexcept
Definition juce_Array.h:328
ElementType * end() noexcept
Definition juce_Array.h:344
int indexOf(ParameterType elementToLookFor) const
Definition juce_Array.h:382
void add(const ElementType &newElement)
Definition juce_Array.h:418
ElementType & getReference(int index) noexcept
Definition juce_Array.h:267
Definition juce_BorderSize.h:42
Rectangle< ValueType > subtractedFrom(const Rectangle< ValueType > &original) const noexcept
Definition juce_BorderSize.h:101
TrackInfo autoColumns
Definition juce_Grid.h:193
void performLayout(Rectangle< int >)
Definition juce_Grid.cpp:1018
AutoFlow autoFlow
Definition juce_Grid.h:176
JustifyItems justifyItems
Definition juce_Grid.h:164
JustifyItems
Definition juce_Grid.h:105
@ end
Definition juce_Grid.h:107
@ center
Definition juce_Grid.h:108
@ start
Definition juce_Grid.h:106
TrackInfo autoRows
Definition juce_Grid.h:190
Array< TrackInfo > templateRows
Definition juce_Grid.h:184
Px columnGap
Definition juce_Grid.h:196
JustifyContent justifyContent
Definition juce_Grid.h:170
JustifyContent
Definition juce_Grid.h:123
@ end
Definition juce_Grid.h:125
@ center
Definition juce_Grid.h:126
@ spaceBetween
Definition juce_Grid.h:129
@ spaceAround
Definition juce_Grid.h:128
@ spaceEvenly
Definition juce_Grid.h:130
StringArray templateAreas
Definition juce_Grid.h:187
AlignContent
Definition juce_Grid.h:135
@ end
Definition juce_Grid.h:137
@ center
Definition juce_Grid.h:138
@ spaceBetween
Definition juce_Grid.h:141
@ spaceAround
Definition juce_Grid.h:140
@ spaceEvenly
Definition juce_Grid.h:142
Array< TrackInfo > templateColumns
Definition juce_Grid.h:181
AlignContent alignContent
Definition juce_Grid.h:173
AlignItems alignItems
Definition juce_Grid.h:167
Px rowGap
Definition juce_Grid.h:198
AlignItems
Definition juce_Grid.h:114
@ end
Definition juce_Grid.h:116
@ center
Definition juce_Grid.h:117
@ start
Definition juce_Grid.h:115
AutoFlow
Definition juce_Grid.h:147
@ column
Definition juce_Grid.h:149
@ rowDense
Definition juce_Grid.h:150
@ columnDense
Definition juce_Grid.h:151
Array< GridItem > items
Definition juce_Grid.h:205
Definition juce_GridItem.h:36
float maxHeight
Definition juce_GridItem.h:172
float width
Definition juce_GridItem.h:166
String area
Definition juce_GridItem.h:156
@ autoValue
Definition juce_GridItem.h:121
float minHeight
Definition juce_GridItem.h:171
float height
Definition juce_GridItem.h:170
StartAndEndProperty row
Definition juce_GridItem.h:153
@ notAssigned
Definition juce_GridItem.h:162
float minWidth
Definition juce_GridItem.h:167
StartAndEndProperty column
Definition juce_GridItem.h:150
float maxWidth
Definition juce_GridItem.h:168
Margin margin
Definition juce_GridItem.h:189
JustifySelf justifySelf
Definition juce_GridItem.h:142
@ autoValue
Definition juce_GridItem.h:111
AlignSelf alignSelf
Definition juce_GridItem.h:147
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
ValueType getCentreX() const noexcept
Definition juce_Rectangle.h:145
ValueType getHeight() const noexcept
Definition juce_Rectangle.h:136
ValueType getCentreY() const noexcept
Definition juce_Rectangle.h:148
ValueType getX() const noexcept
Definition juce_Rectangle.h:127
ValueType getWidth() const noexcept
Definition juce_Rectangle.h:133
void setX(ValueType newX) noexcept
Definition juce_Rectangle.h:195
void setY(ValueType newY) noexcept
Definition juce_Rectangle.h:198
ValueType getY() const noexcept
Definition juce_Rectangle.h:130
Definition juce_StringArray.h:35
static StringArray fromTokens(StringRef stringToTokenise, bool preserveQuotedStrings)
Definition juce_StringArray.cpp:387
void add(String stringToAdd)
Definition juce_StringArray.cpp:136
bool isEmpty() const noexcept
Definition juce_StringArray.h:139
Definition juce_String.h:53
bool isEmpty() const noexcept
Definition juce_String.h:310
bool isNotEmpty() const noexcept
Definition juce_String.h:316
Definition juce_UnitTest.h:70
struct huft * t
Definition inflate.c:943
register unsigned j
Definition inflate.c:1576
register unsigned i
Definition inflate.c:1575
unsigned s
Definition inflate.c:1555
static const char * name
Definition pugl.h:1582
virtual ASIOError start()=0
Definition juce_UnitTestCategories.h:27
Definition carla_juce.cpp:31
constexpr Type jmin(Type a, Type b)
Definition juce_MathsFunctions.h:106
constexpr Type jmax(Type a, Type b)
Definition juce_MathsFunctions.h:94
RangedDirectoryIterator end(const RangedDirectoryIterator &)
Definition juce_RangedDirectoryIterator.h:184
Type jlimit(Type lowerLimit, Type upperLimit, Type valueToConstrain) noexcept
Definition juce_MathsFunctions.h:262
bool isPositiveAndBelow(Type1 valueToTest, Type2 upperLimit) noexcept
Definition juce_MathsFunctions.h:279
@ column
Definition juce_AccessibilityRole.h:52
@ row
Definition juce_AccessibilityRole.h:53
#define true
Definition ordinals.h:82
GUI::ui_handle_t gui
Definition main.cpp:50
Definition juce_Grid.cpp:30
int numImplicitLeading
Definition juce_Grid.cpp:32
Array< Grid::TrackInfo > items
Definition juce_Grid.cpp:31
Definition juce_Grid.cpp:546
int row
Definition juce_Grid.cpp:546
int column
Definition juce_Grid.cpp:546
Definition juce_Grid.cpp:607
int column
Definition juce_Grid.cpp:608
bool columnFirst
Definition juce_Grid.cpp:609
int row
Definition juce_Grid.cpp:608
Definition juce_Grid.cpp:545
int highestCrossDimension
Definition juce_Grid.cpp:685
PlacementHelpers::LineArea setCell(Cell start, Cell end)
Definition juce_Grid.cpp:562
PlacementHelpers::LineArea setCell(Cell cell, int columnSpan, int rowSpan)
Definition juce_Grid.cpp:553
std::set< SortableCell > occupiedCells
Definition juce_Grid.cpp:687
bool isOccupied(Cell cell) const
Definition juce_Grid.cpp:633
Cell advance(Cell cell) const
Definition juce_Grid.cpp:666
void updateMaxCrossDimensionFromAutoPlacementItem(int columnSpan, int rowSpan)
Definition juce_Grid.cpp:600
Cell fromDimensions(int mainDimension, int crossDimension) const
Definition juce_Grid.cpp:677
bool columnFirst
Definition juce_Grid.cpp:686
Cell nextAvailable(Cell referenceCell, int columnSpan, int rowSpan)
Definition juce_Grid.cpp:568
int getHighestCrossDimension() const
Definition juce_Grid.cpp:656
void setCell(int column, int row)
Definition juce_Grid.cpp:628
Cell nextAvailableOnColumn(Cell referenceCell, int columnSpan, int rowSpan, int columnNumber)
Definition juce_Grid.cpp:588
bool isOutOfBounds(Cell cell, int columnSpan, int rowSpan) const
Definition juce_Grid.cpp:648
bool isOccupied(Cell cell, int columnSpan, int rowSpan) const
Definition juce_Grid.cpp:638
int getCrossDimension(Cell cell) const
Definition juce_Grid.cpp:675
int getMainDimension(Cell cell) const
Definition juce_Grid.cpp:674
Cell nextAvailableOnRow(Cell referenceCell, int columnSpan, int rowSpan, int rowNumber)
Definition juce_Grid.cpp:576
OccupancyPlane(int highestColumnToUse, int highestRowToUse, bool isColumnFirst)
Definition juce_Grid.cpp:548
Definition juce_Grid.cpp:540
ItemPlacementArray deduceAllItems(Grid &grid) const
Definition juce_Grid.cpp:749
static int getSpanFromAuto(GridItem::StartAndEndProperty prop)
Definition juce_Grid.cpp:737
static bool isColumnAutoFlow(AutoFlow autoFlow)
Definition juce_Grid.cpp:730
static bool hasFullyFixedPlacement(const GridItem &item)
Definition juce_Grid.cpp:696
static bool hasPartialFixedPlacement(const GridItem &item)
Definition juce_Grid.cpp:707
static bool hasAutoPlacement(const GridItem &item)
Definition juce_Grid.cpp:718
static Array< Item > repeated(int repeats, const Item &item)
Definition juce_Grid.cpp:867
Array< std::pair< GridItem *, PlacementHelpers::LineArea > > ItemPlacementArray
Definition juce_Grid.cpp:541
static PlacementHelpers::LineRange findFullLineRange(const ItemPlacementArray &items, Accessor &&accessor)
Definition juce_Grid.cpp:845
static void applySizeForAutoTracks(Tracks &tracks, const ItemPlacementArray &placements)
Definition juce_Grid.cpp:891
static PlacementHelpers::LineArea findFullLineArea(const ItemPlacementArray &items)
Definition juce_Grid.cpp:860
static Tracks createImplicitTracks(const Grid &grid, const ItemPlacementArray &items)
Definition juce_Grid.cpp:874
static bool hasDenseAutoFlow(AutoFlow autoFlow)
Definition juce_Grid.cpp:724
static bool isFixed(GridItem::StartAndEndProperty prop)
Definition juce_Grid.cpp:691
Definition juce_Grid.cpp:927
static Rectangle< float > alignItem(const GridItem &item, const Grid &grid, Rectangle< float > area)
Definition juce_Grid.cpp:928
Definition juce_Grid.h:56
Definition juce_Grid.cpp:127
LineRange column
Definition juce_Grid.cpp:127
LineRange row
Definition juce_Grid.cpp:127
Definition juce_Grid.cpp:128
StringArray lineNames
Definition juce_Grid.cpp:128
Definition juce_Grid.cpp:126
int end
Definition juce_Grid.cpp:126
int start
Definition juce_Grid.cpp:126
Definition juce_Grid.cpp:131
LineArea lines
Definition juce_Grid.cpp:133
String name
Definition juce_Grid.cpp:132
Definition juce_Grid.cpp:121
static int deduceAbsoluteLineNumberBasedOnSpan(int startLineNumber, GridItem::Property propertyWithSpan, const Array< TrackInfo > &tracks)
Definition juce_Grid.cpp:252
static Rectangle< float > alignCell(Rectangle< float > area, int columnNumber, int rowNumber, int numberOfColumns, int numberOfRows, SizeCalculation calculation, AlignContent alignContent, JustifyContent justifyContent)
Definition juce_Grid.cpp:435
@ invalid
Definition juce_Grid.cpp:122
static Array< LineInfo > getArrayOfLinesFromTracks(const Array< TrackInfo > &tracks)
Definition juce_Grid.cpp:137
static LineArea deduceLineArea(const GridItem &item, const Grid &grid, const std::map< String, LineArea > &namedAreas)
Definition juce_Grid.cpp:312
static Array< StringArray > parseAreasProperty(const StringArray &areasStrings)
Definition juce_Grid.cpp:329
static int deduceAbsoluteLineNumberFromLineName(GridItem::Property prop, const Array< TrackInfo > &tracks)
Definition juce_Grid.cpp:178
static int deduceAbsoluteLineNumber(GridItem::Property prop, const Array< TrackInfo > &tracks)
Definition juce_Grid.cpp:205
static NamedArea findArea(Array< StringArray > &stringsArrays)
Definition juce_Grid.cpp:347
static LineRange deduceLineRange(GridItem::StartAndEndProperty prop, const Array< TrackInfo > &tracks)
Definition juce_Grid.cpp:265
static std::map< String, LineArea > deduceNamedAreas(const StringArray &areasStrings)
Definition juce_Grid.cpp:389
static Rectangle< float > getAreaBounds(PlacementHelpers::LineRange columnRange, PlacementHelpers::LineRange rowRange, const Tracks &tracks, SizeCalculation calculation, AlignContent alignContent, JustifyContent justifyContent, Px columnGap, Px rowGap)
Definition juce_Grid.cpp:499
static Rectangle< float > getCellBounds(int columnNumber, int rowNumber, const Tracks &tracks, SizeCalculation calculation, Px columnGap, Px rowGap)
Definition juce_Grid.cpp:418
static constexpr auto emptyAreaCharacter
Definition juce_Grid.cpp:123
static float getCoord(int trackNumber, float relativeUnit, Px gap, const Array< TrackInfo > &tracks)
Definition juce_Grid.cpp:408
static int deduceAbsoluteLineNumberFromNamedSpan(int startLineNumber, GridItem::Property propertyWithSpan, const Array< TrackInfo > &tracks)
Definition juce_Grid.cpp:224
Definition juce_Grid.h:45
long double pixels
Definition juce_Grid.h:51
Definition juce_Grid.cpp:41
static float getTotalAbsoluteWidth(const Array< TrackInfo > &columnTracks, Px columnGap)
Definition juce_Grid.cpp:75
static float getTotalAbsoluteSize(const Array< TrackInfo > &tracks, Px gapSize) noexcept
Definition juce_Grid.cpp:42
static float getRelativeUnitSize(float size, float totalAbsolute, const Array< TrackInfo > &tracks) noexcept
Definition juce_Grid.cpp:56
float relativeWidthUnit
Definition juce_Grid.cpp:113
float relativeHeightUnit
Definition juce_Grid.cpp:114
float remainingWidth
Definition juce_Grid.cpp:115
float remainingHeight
Definition juce_Grid.cpp:116
void computeSizes(float gridWidth, float gridHeight, Px columnGapToUse, Px rowGapToUse, const Tracks &tracks)
Definition juce_Grid.cpp:98
static bool hasAnyFractions(const Array< TrackInfo > &tracks)
Definition juce_Grid.cpp:91
static float getTotalAbsoluteHeight(const Array< TrackInfo > &rowTracks, Px rowGap)
Definition juce_Grid.cpp:70
static float getRelativeHeightUnit(float gridHeight, Px rowGap, const Array< TrackInfo > &rowTracks)
Definition juce_Grid.cpp:85
static float getRelativeWidthUnit(float gridWidth, Px columnGap, const Array< TrackInfo > &columnTracks)
Definition juce_Grid.cpp:80
bool isFraction
Definition juce_Grid.h:96
bool hasKeyword
Definition juce_Grid.h:97
String endLineName
Definition juce_Grid.h:99
float getAbsoluteSize(float relativeFractionalUnit) const
Definition juce_Grid.cpp:1012
TrackInfo() noexcept
Definition juce_Grid.cpp:968
bool isFractional() const noexcept
Definition juce_Grid.h:83
float size
Definition juce_Grid.h:95
String startLineName
Definition juce_Grid.h:99
float right
Definition juce_GridItem.h:183
float top
Definition juce_GridItem.h:184
float left
Definition juce_GridItem.h:182
float bottom
Definition juce_GridItem.h:185
Definition juce_GridItem.h:70
bool hasName() const noexcept
Definition juce_GridItem.h:88
int getNumber() const noexcept
Definition juce_GridItem.h:90
bool hasAuto() const noexcept
Definition juce_GridItem.h:87
const String & getName() const noexcept
Definition juce_GridItem.h:89
bool hasSpan() const noexcept
Definition juce_GridItem.h:85
bool hasAbsolute() const noexcept
Definition juce_GridItem.h:86
Definition juce_GridItem.h:43
Definition juce_GridItem.h:101
Property start
Definition juce_GridItem.h:101
Property end
Definition juce_GridItem.h:101
Definition juce_Grid.cpp:36
AllTracksIncludingImplicit rows
Definition juce_Grid.cpp:37
AllTracksIncludingImplicit columns
Definition juce_Grid.cpp:37
void Rectangle(HDC ctx, int l, int t, int r, int b)
Definition swell-gdi-generic.cpp:279
uch * p
Definition crypt.c:594
return c
Definition crypt.c:175
int r
Definition crypt.c:458
int result
Definition process.c:1455
_WDL_CSTRING_PREFIX void INT_PTR count
Definition wdlcstring.h:263