From 656d1a6ecffd4ec00be2cf099047b07fbcefb053 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Zi=C4=85bek?= Date: Thu, 16 Dec 2021 01:39:26 +0100 Subject: [PATCH] Improved Row element stability --- QuestPDF.Examples/Engine/RenderingTest.cs | 11 +++-- QuestPDF.Examples/RowExamples.cs | 56 +++++++++++++++++++++++ QuestPDF/Elements/Row.cs | 24 ++++++++-- QuestPDF/Infrastructure/Element.cs | 5 -- 4 files changed, 82 insertions(+), 14 deletions(-) create mode 100644 QuestPDF.Examples/RowExamples.cs diff --git a/QuestPDF.Examples/Engine/RenderingTest.cs b/QuestPDF.Examples/Engine/RenderingTest.cs index 3309c4a..975af95 100644 --- a/QuestPDF.Examples/Engine/RenderingTest.cs +++ b/QuestPDF.Examples/Engine/RenderingTest.cs @@ -67,6 +67,12 @@ namespace QuestPDF.Examples.Engine return this; } + public RenderingTest MaxPages(int value) + { + MaxPagesThreshold = value; + return this; + } + public void Render(Action content) { RenderDocument(container => @@ -78,11 +84,6 @@ namespace QuestPDF.Examples.Engine }); }); } - - public void MaxPages(int value) - { - MaxPagesThreshold = value; - } public void RenderDocument(Action content) { diff --git a/QuestPDF.Examples/RowExamples.cs b/QuestPDF.Examples/RowExamples.cs new file mode 100644 index 0000000..ffb6dfc --- /dev/null +++ b/QuestPDF.Examples/RowExamples.cs @@ -0,0 +1,56 @@ +using NUnit.Framework; +using QuestPDF.Examples.Engine; +using QuestPDF.Fluent; +using QuestPDF.Helpers; +using QuestPDF.Infrastructure; + +namespace QuestPDF.Examples +{ + public class RowExamples + { + [Test] + public void Stability() + { + // up to version 2021.12, this code would always result with the infinite layout exception + + RenderingTest + .Create() + .ProducePdf() + .MaxPages(100) + .PageSize(250, 150) + .ShowResults() + .Render(container => + { + container + .Padding(25) + .Row(row => + { + row.RelativeColumn().Stack(stack => + { + stack.Item().ShowOnce().Element(CreateBox).Text("X"); + stack.Item().Element(CreateBox).Text("1"); + stack.Item().Element(CreateBox).Text("2"); + }); + + row.RelativeColumn().Stack(stack => + { + stack.Item().Element(CreateBox).Text("1"); + stack.Item().Element(CreateBox).Text("2"); + }); + }); + }); + + static IContainer CreateBox(IContainer container) + { + return container + .ExtendHorizontal() + .ExtendVertical() + .Background(Colors.Grey.Lighten4) + .Border(1) + .AlignCenter() + .AlignMiddle() + .ShowOnce(); + } + } + } +} \ No newline at end of file diff --git a/QuestPDF/Elements/Row.cs b/QuestPDF/Elements/Row.cs index 7d2b293..8a2c023 100644 --- a/QuestPDF/Elements/Row.cs +++ b/QuestPDF/Elements/Row.cs @@ -34,11 +34,20 @@ namespace QuestPDF.Elements } } - internal class BinaryRow : Element, ICacheable + internal class BinaryRow : Element, ICacheable, IStateResettable { internal Element Left { get; set; } internal Element Right { get; set; } + private bool IsLeftRendered { get; set; } + private bool IsRightRendered { get; set; } + + public void ResetState() + { + IsLeftRendered = false; + IsRightRendered = false; + } + internal override void HandleVisitor(Action visit) { Left.HandleVisitor(visit); @@ -52,27 +61,34 @@ namespace QuestPDF.Elements Left = create(Left); Right = create(Right); } - + internal override SpacePlan Measure(Size availableSpace) { var leftMeasurement = Left.Measure(new Size(availableSpace.Width, availableSpace.Height)); if (leftMeasurement.Type == SpacePlanType.Wrap) return SpacePlan.Wrap(); + + if (leftMeasurement.Type == SpacePlanType.FullRender) + IsLeftRendered = true; var rightMeasurement = Right.Measure(new Size(availableSpace.Width - leftMeasurement.Width, availableSpace.Height)); if (rightMeasurement.Type == SpacePlanType.Wrap) return SpacePlan.Wrap(); + if (leftMeasurement.Type == SpacePlanType.FullRender) + IsRightRendered = true; + var totalWidth = leftMeasurement.Width + rightMeasurement.Width; var totalHeight = Math.Max(leftMeasurement.Height, rightMeasurement.Height); var targetSize = new Size(totalWidth, totalHeight); - if (leftMeasurement.Type == SpacePlanType.PartialRender || rightMeasurement.Type == SpacePlanType.PartialRender) + if ((!IsLeftRendered && leftMeasurement.Type == SpacePlanType.PartialRender) || + (!IsRightRendered && rightMeasurement.Type == SpacePlanType.PartialRender)) return SpacePlan.PartialRender(targetSize); - + return SpacePlan.FullRender(targetSize); } diff --git a/QuestPDF/Infrastructure/Element.cs b/QuestPDF/Infrastructure/Element.cs index a77f3b8..55b56c5 100644 --- a/QuestPDF/Infrastructure/Element.cs +++ b/QuestPDF/Infrastructure/Element.cs @@ -28,10 +28,5 @@ namespace QuestPDF.Infrastructure internal abstract SpacePlan Measure(Size availableSpace); internal abstract void Draw(Size availableSpace); - - protected virtual IEnumerable GetDebugInformation() - { - yield break; - } } } \ No newline at end of file