Browse Source

Added new element: PreventPageBreak

Marcin Ziąbek 9 months ago
parent
commit
00eb8d8c35

+ 52 - 0
Source/QuestPDF/Elements/PreventPageBreak.cs

@@ -0,0 +1,52 @@
+using QuestPDF.Drawing;
+using QuestPDF.Infrastructure;
+
+namespace QuestPDF.Elements
+{
+    internal sealed class PreventPageBreak : ContainerElement, IStateful
+    {
+        internal override SpacePlan Measure(Size availableSpace)
+        {
+            var measurement = base.Measure(availableSpace);
+
+            if (IsFirstPageRendered)
+                return measurement;
+
+            if (measurement.Type != SpacePlanType.PartialRender)
+                return measurement;
+
+            return SpacePlan.PartialRender(Size.Zero);
+        }
+        
+        internal override void Draw(Size availableSpace)
+        {
+            if (IsFirstPageRendered)
+            {
+                base.Draw(availableSpace);
+                return;
+            }
+
+            var measurement = base.Measure(availableSpace);
+            
+            if (measurement.Type == SpacePlanType.FullRender)
+                base.Draw(availableSpace);
+        
+            IsFirstPageRendered = true;
+        }
+        
+        #region IStateful
+        
+        private bool IsFirstPageRendered { get; set; }
+
+        public void ResetState(bool hardReset = false)
+        {
+            if (hardReset)
+                IsFirstPageRendered = false;
+        }
+        
+        public object GetState() => IsFirstPageRendered;
+        public void SetState(object state) => IsFirstPageRendered = (bool) state;
+    
+        #endregion
+    }
+}

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

@@ -239,6 +239,23 @@ namespace QuestPDF.Fluent
                 MinHeight = minHeight
             });
         }
+        
+        /// <summary>
+        /// <para>
+        /// Attempts to keep the container's content together on its first page of occurrence.
+        /// If the content does not fit entirely on that page, it is moved to the next page. 
+        /// If it spans multiple pages, all subsequent pages are rendered as usual without restriction.
+        /// </para>
+        /// <para>
+        /// This method is useful for ensuring that content remains visually coherent and is not arbitrarily split.
+        /// </para>
+        /// <br />
+        /// <a href="https://www.questpdf.com/api-reference/prevent-page-break.html">Learn more</a>
+        /// </summary>
+        public static IContainer PreventPageBreak(this IContainer element)
+        {
+            return element.Element(new PreventPageBreak());
+        }
 
         /// <summary>
         /// Inserts a break that pushes the subsequent content to start on a new page.