Skip to content

Commit 6e1d76f

Browse files
authored
Merge pull request #1 from codecat/feature/padding
2 parents ff47fce + 9e455fa commit 6e1d76f

2 files changed

Lines changed: 101 additions & 11 deletions

File tree

Nimble.Layout.Tests/TestCases.cs

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -694,6 +694,92 @@ public void AnchorRightMargin2()
694694
Assert.AreEqual(new(40, 40, 50, 50), child.Rect);
695695
}
696696

697+
[TestMethod]
698+
public void Padding1()
699+
{
700+
var root = new LayoutItem {
701+
RequestedPadding = new(10),
702+
};
703+
704+
var child = new LayoutItem {
705+
RequestedSize = new(15),
706+
};
707+
708+
root.AddChild(child);
709+
root.Run();
710+
711+
Assert.AreEqual(new(0, 0, 35, 35), root.Rect);
712+
Assert.AreEqual(new(10, 10, 15, 15), child.Rect);
713+
}
714+
715+
[TestMethod]
716+
public void PaddingRow()
717+
{
718+
var root = new LayoutItem {
719+
RequestedPadding = new(10),
720+
Contain = ContainFlags.Row,
721+
};
722+
723+
var child1 = new LayoutItem { RequestedSize = new(15) };
724+
var child2 = new LayoutItem { RequestedSize = new(15) };
725+
726+
root.AddChild(child1);
727+
root.AddChild(child2);
728+
root.Run();
729+
730+
Assert.AreEqual(new(0, 0, 50, 35), root.Rect);
731+
Assert.AreEqual(new(10, 10, 15, 15), child1.Rect);
732+
Assert.AreEqual(new(25, 10, 15, 15), child2.Rect);
733+
}
734+
735+
[TestMethod]
736+
public void PaddingColumn()
737+
{
738+
var root = new LayoutItem {
739+
RequestedPadding = new(10),
740+
Contain = ContainFlags.Column,
741+
};
742+
743+
var child1 = new LayoutItem { RequestedSize = new(15) };
744+
var child2 = new LayoutItem { RequestedSize = new(15) };
745+
746+
root.AddChild(child1);
747+
root.AddChild(child2);
748+
root.Run();
749+
750+
Assert.AreEqual(new(0, 0, 35, 50), root.Rect);
751+
Assert.AreEqual(new(10, 10, 15, 15), child1.Rect);
752+
Assert.AreEqual(new(10, 25, 15, 15), child2.Rect);
753+
}
754+
755+
[TestMethod]
756+
public void PaddingFixedAndFill()
757+
{
758+
var root = new LayoutItem {
759+
RequestedSize = new(50, 60),
760+
RequestedPadding = new(10),
761+
Contain = ContainFlags.Column,
762+
};
763+
764+
var fixedA = new LayoutItem {
765+
RequestedSize = new(50, 15),
766+
};
767+
var fixedB = new LayoutItem {
768+
RequestedSize = new(50, 15),
769+
};
770+
var filler = new LayoutItem {
771+
Behave = BehaveFlags.Fill,
772+
};
773+
774+
root.AddChildren([fixedA, filler, fixedB]);
775+
root.Run();
776+
777+
Assert.AreEqual(new(0, 0, 50, 60), root.Rect);
778+
Assert.AreEqual(new(10, 10, 30, 15), fixedA.Rect);
779+
Assert.AreEqual(new(10, 25, 30, 10), filler.Rect);
780+
Assert.AreEqual(new(10, 35, 30, 15), fixedB.Rect);
781+
}
782+
697783
[TestMethod]
698784
public void IssueUpstream15()
699785
{

Nimble.Layout/LayoutItem.cs

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public class LayoutItem
1616
public LayoutItem? NextSibling { get; internal set; }
1717

1818
public LayoutEdges RequestedMargin = new();
19+
public LayoutEdges RequestedPadding = new();
1920
public LayoutVector RequestedSize = new();
2021

2122
public LayoutRect Rect = new();
@@ -111,6 +112,7 @@ public void Reset(bool withChildren = false)
111112
FirstChild = null;
112113
NextSibling = null;
113114
RequestedMargin = new();
115+
RequestedPadding = new();
114116
RequestedSize = new();
115117
Rect = new();
116118
}
@@ -268,7 +270,7 @@ private float CalcStackedSize(int dim)
268270
foreach (var child in Children) {
269271
need_size += child.Rect[dim] + child.Rect[wdim] + child.RequestedMargin[wdim];
270272
}
271-
return need_size;
273+
return RequestedPadding.GetDimension(dim) + need_size;
272274
}
273275

274276
private float CalcOverlayedSize(int dim)
@@ -280,7 +282,7 @@ private float CalcOverlayedSize(int dim)
280282
float child_size = child.Rect[dim] + child.Rect[wdim] + child.RequestedMargin[wdim];
281283
need_size = Math.Max(need_size, child_size);
282284
}
283-
return need_size;
285+
return RequestedPadding.GetDimension(dim) + need_size;
284286
}
285287

286288
private float CalcWrappedStackedSize(int dim)
@@ -295,7 +297,7 @@ private float CalcWrappedStackedSize(int dim)
295297
}
296298
need_size += child.Rect[dim] + child.Rect[wdim] + child.RequestedMargin[wdim];
297299
}
298-
return Math.Max(need_size2, need_size);
300+
return RequestedPadding.GetDimension(dim) + Math.Max(need_size2, need_size);
299301
}
300302

301303
private float CalcWrappedOverlayedSize(int dim)
@@ -311,7 +313,7 @@ private float CalcWrappedOverlayedSize(int dim)
311313
float child_size = child.Rect[dim] + child.Rect[wdim] + child.RequestedMargin[wdim];
312314
need_size = Math.Max(need_size, child_size);
313315
}
314-
return need_size2 + need_size;
316+
return RequestedPadding.GetDimension(dim) + need_size2 + need_size;
315317
}
316318

317319
private void Arrange(int dim)
@@ -339,7 +341,9 @@ private void Arrange(int dim)
339341
if ((Flags & 1) == (uint)dim) {
340342
ArrangeStacked(dim, false);
341343
} else {
342-
ArrangeOverlaySqueezedRange(dim, FirstChild, null, Rect[dim], Rect[2 + dim]);
344+
ArrangeOverlaySqueezedRange(dim, FirstChild, null,
345+
Rect[dim] + RequestedPadding[dim],
346+
Rect[2 + dim] - RequestedPadding.GetDimension(dim));
343347
}
344348
break;
345349

@@ -358,8 +362,8 @@ private void ArrangeStacked(int dim, bool wrap)
358362
{
359363
int wdim = dim + 2;
360364

361-
float space = Rect[wdim];
362-
float max_x2 = Rect[dim] + space;
365+
float space = Rect[wdim] - RequestedPadding.GetDimension(dim);
366+
float max_x2 = Rect[dim] + space + RequestedPadding[dim];
363367

364368
var startChild = FirstChild;
365369
while (startChild != null) {
@@ -441,7 +445,7 @@ private void ArrangeStacked(int dim, bool wrap)
441445
}
442446

443447
// distribute width among items
444-
float x = Rect[dim];
448+
float x = Rect[dim] + RequestedPadding[dim];
445449
float x1;
446450
// second pass: distribute and rescale
447451
child = startChild;
@@ -479,8 +483,8 @@ private void ArrangeStacked(int dim, bool wrap)
479483
private void ArrangeOverlay(int dim)
480484
{
481485
int wdim = dim + 2;
482-
float offset = Rect[dim];
483-
float space = Rect[wdim];
486+
float offset = Rect[dim] + RequestedPadding[dim];
487+
float space = Rect[wdim] - RequestedPadding.GetDimension(dim);
484488

485489
foreach (var child in Children) {
486490
var b_flags = (BehaveFlags)((uint)child.Behave >> dim);
@@ -509,7 +513,7 @@ private void ArrangeOverlay(int dim)
509513
private float ArrangeWrappedOverlaySqueezed(int dim)
510514
{
511515
int wdim = dim + 2;
512-
float offset = Rect[dim];
516+
float offset = Rect[dim] + RequestedPadding[dim];
513517
float need_size = 0;
514518
var startChild = FirstChild;
515519
foreach (var child in Children) {

0 commit comments

Comments
 (0)