Jelajahi Sumber

Experimental version of controlling content repeatability

MarcinZiabek 3 tahun lalu
induk
melakukan
b658344a46

+ 20 - 0
QuestPDF/Drawing/DocumentGenerator.cs

@@ -64,6 +64,8 @@ namespace QuestPDF.Drawing
             var container = new DocumentContainer();
             document.Compose(container);
             var content = container.Compose();
+
+            ApplyRepeatContent(content);
             ApplyDefaultTextStyle(content, TextStyle.LibraryDefault);
             
             var debuggingState = Settings.EnableDebugging ? ApplyDebugging(content) : null;
@@ -192,5 +194,23 @@ namespace QuestPDF.Drawing
             foreach (var child in content.GetChildren())
                 ApplyDefaultTextStyle(child, documentDefaultTextStyle);
         }
+        
+        internal static void ApplyRepeatContent(this Element? content, bool enabled = false)
+        {
+            if (content == null)
+                return;
+
+            if (content is RepeatContent repeatContent)
+            {
+                ApplyRepeatContent(repeatContent.Child, repeatContent.Repeat);
+                return;
+            }
+            
+            foreach (var child in content.GetChildren())
+                ApplyRepeatContent(child, enabled);
+            
+            if (!enabled)
+                content.CreateProxy(y => y is IContent ? new ShowOnce { Child = y } : y);
+        }
     }
 }

+ 1 - 1
QuestPDF/Elements/Canvas.cs

@@ -7,7 +7,7 @@ namespace QuestPDF.Elements
 {
     public delegate void DrawOnCanvas(SKCanvas canvas, Size availableSpace);
     
-    internal class Canvas : Element, ICacheable
+    internal class Canvas : Element, ICacheable, IContent
     {
         public DrawOnCanvas Handler { get; set; }
         

+ 1 - 1
QuestPDF/Elements/Dynamic.cs

@@ -6,7 +6,7 @@ using QuestPDF.Infrastructure;
 
 namespace QuestPDF.Elements
 {
-    internal class DynamicHost : Element, IStateResettable
+    internal class DynamicHost : Element, IStateResettable, IContent
     {
         private DynamicComponentProxy Child { get; }
         private object InitialComponentState { get; set; }

+ 1 - 1
QuestPDF/Elements/DynamicImage.cs

@@ -6,7 +6,7 @@ using SkiaSharp;
 
 namespace QuestPDF.Elements
 {
-    internal class DynamicImage : Element
+    internal class DynamicImage : Element, IContent
     {
         public Func<Size, byte[]>? Source { get; set; }
         

+ 1 - 1
QuestPDF/Elements/Image.cs

@@ -5,7 +5,7 @@ using SkiaSharp;
 
 namespace QuestPDF.Elements
 {
-    internal class Image : Element, ICacheable
+    internal class Image : Element, ICacheable, IContent
     {
         public SKImage? InternalImage { get; set; }
 

+ 1 - 1
QuestPDF/Elements/Line.cs

@@ -15,7 +15,7 @@ namespace QuestPDF.Elements
         Horizontal
     }
     
-    internal class Line : Element, ILine, ICacheable
+    internal class Line : Element, ILine, ICacheable, IContent
     {
         public LineType Type { get; set; } = LineType.Vertical;
         public string Color { get; set; } = Colors.Black;

+ 9 - 0
QuestPDF/Elements/RepeatContent.cs

@@ -0,0 +1,9 @@
+using QuestPDF.Infrastructure;
+
+namespace QuestPDF.Elements
+{
+    internal class RepeatContent : ContainerElement
+    {
+        public bool Repeat { get; set; }
+    }
+}

+ 1 - 1
QuestPDF/Elements/Text/TextBlock.cs

@@ -8,7 +8,7 @@ using QuestPDF.Infrastructure;
 
 namespace QuestPDF.Elements.Text
 {
-    internal class TextBlock : Element, IStateResettable
+    internal class TextBlock : Element, IStateResettable, IContent
     {
         public HorizontalAlignment Alignment { get; set; } = HorizontalAlignment.Left;
         public List<ITextBlockItem> Items { get; set; } = new List<ITextBlockItem>();

+ 2 - 2
QuestPDF/Fluent/DecorationExtensions.cs

@@ -12,7 +12,7 @@ namespace QuestPDF.Fluent
         {
             var container = new Container();
             Decoration.Before = container;
-            return container;
+            return container.RepeatContent();
         }
         
         public void Before(Action<IContainer> handler)
@@ -36,7 +36,7 @@ namespace QuestPDF.Fluent
         {
             var container = new Container();
             Decoration.After = container;
-            return container;
+            return container.RepeatContent();
         }
         
         public void After(Action<IContainer> handler)

+ 8 - 0
QuestPDF/Fluent/ElementExtensions.cs

@@ -195,5 +195,13 @@ namespace QuestPDF.Fluent
         {
             return element.Element(new ScaleToFit());
         }
+        
+        public static IContainer RepeatContent(this IContainer element, bool enabled = true)
+        {
+            return element.Element(new RepeatContent
+            {
+                Repeat = enabled
+            });
+        }
     }
 }

+ 7 - 0
QuestPDF/Infrastructure/IContent.cs

@@ -0,0 +1,7 @@
+namespace QuestPDF.Infrastructure
+{
+    internal interface IContent
+    {
+        
+    }
+}