Przeglądaj źródła

ShowWhen: experimental implementation

Marcin Ziąbek 2 lat temu
rodzic
commit
24421943a4

+ 54 - 1
Source/QuestPDF.Examples/ShowOnceExample.cs

@@ -1,4 +1,6 @@
-using NUnit.Framework;
+using System;
+using System.Linq;
+using NUnit.Framework;
 using QuestPDF.Examples.Engine;
 using QuestPDF.Fluent;
 using QuestPDF.Helpers;
@@ -50,5 +52,56 @@ namespace QuestPDF.Examples
                     });
                 });
         }
+        
+        [Test]
+        public void ShowWhen()
+        {
+            RenderingTest
+                .Create()
+                .ProducePdf()
+                .ShowResults()
+                .RenderDocument(container =>
+                {
+                    container.Page(page =>
+                    {
+                        page.Margin(20);
+                        page.Size(PageSizes.A4);
+                        page.PageColor(Colors.White);
+
+                        page.DefaultTextStyle(x => x.FontSize(20));
+                        
+                        page.Header().Text("Show when example").SemiBold();
+                        
+                        page.Content().Column(column =>
+                        {
+                            column.Spacing(10);
+
+                            foreach (var s in Enumerable.Range(0, 10))
+                            {
+                                foreach (var i in Enumerable.Range(0, Random.Shared.Next(10, 50)))
+                                {
+                                    column
+                                        .Item()
+                                        .Height(40)
+                                        .Width(150)
+                                        .Background(Colors.Grey.Lighten3)
+                                        .Text($"{s} - {i}");
+                                }   
+                                
+                                column.Item().PageBreak();
+                                column.Item().ShowWhen(x => x.PageNumber % 2 == 0).PageBreak();
+                            }
+                        });
+                        
+                        page.Footer().Text(text =>
+                        {
+                            text.Span("Page ");
+                            text.CurrentPageNumber();
+                            text.Span(" out of ");
+                            text.TotalPages();
+                        });
+                    });
+                });
+        }
     }
 }

+ 41 - 0
Source/QuestPDF/Elements/ShowWhen.cs

@@ -0,0 +1,41 @@
+using System;
+using QuestPDF.Drawing;
+using QuestPDF.Infrastructure;
+
+namespace QuestPDF.Elements;
+
+public class ShowWhenContext
+{
+    public int PageNumber { get; internal set; }
+    public int TotalPages { get; internal set; }
+}
+
+internal class ShowWhen : ContainerElement
+{
+    public Predicate<ShowWhenContext> VisibilityPredicate { get; set; }
+    
+    internal override SpacePlan Measure(Size availableSpace)
+    {
+        if (!CheckVisibility())
+            return SpacePlan.FullRender(Size.Zero);
+
+        return base.Measure(availableSpace);
+    }
+    
+    internal override void Draw(Size availableSpace)
+    {
+        if (CheckVisibility())
+            base.Draw(availableSpace);
+    }
+
+    private bool CheckVisibility()
+    {
+        var context = new ShowWhenContext
+        {
+            PageNumber = PageContext.CurrentPage,
+            TotalPages = PageContext.DocumentLength
+        };
+
+        return VisibilityPredicate(context);
+    }
+}

+ 8 - 0
Source/QuestPDF/Fluent/ElementExtensions.cs

@@ -119,6 +119,14 @@ namespace QuestPDF.Fluent
                 Text = text ?? string.Empty
             });
         }
+        
+        public static IContainer ShowWhen(this IContainer element, Predicate<ShowWhenContext> predicate)
+        {
+            return element.Element(new ShowWhen
+            {
+                VisibilityPredicate = predicate
+            });
+        }
 
         /// <summary>
         /// If the container spans multiple pages, its content appears only on the first one.