瀏覽代碼

Table layout: refactorization

MarcinZiabek 4 年之前
父節點
當前提交
06418238dc
共有 1 個文件被更改,包括 39 次插入43 次删除
  1. 39 43
      QuestPDF/Elements/Table/Table.cs

+ 39 - 43
QuestPDF/Elements/Table/Table.cs

@@ -75,42 +75,27 @@ namespace QuestPDF.Elements.Table
         internal override SpacePlan Measure(Size availableSpace)
         {
             UpdateColumnsWidth(availableSpace.Width);
-            
-            var renderingCommands = PlanLayout(availableSpace).ToList();
+            var renderingCommands = PlanLayout(availableSpace);
 
             if (!renderingCommands.Any())
                 return SpacePlan.Wrap();
             
-            var lastFullyRenderedRow = renderingCommands
-                .GroupBy(x => x.Cell.Row)
-                .Where(x => x.All(y => y.Measurement.Type == SpacePlanType.FullRender))
-                .Select(x => x.Key)
-                .DefaultIfEmpty(0)
-                .Max();
-
             var width = Columns.Sum(x => x.Width);
             var height = renderingCommands.Max(x => x.Offset.Y + x.Size.Height);
+            var tableSize = new Size(width, height);
 
-            if (width > availableSpace.Width + Size.Epsilon)
+            if (tableSize.Width > availableSpace.Width + Size.Epsilon)
                 return SpacePlan.Wrap();
-            
-            var tableSize = new Size(width, height);
 
-            var result = lastFullyRenderedRow == RowsCount 
+            return FindLastRenderedRow(renderingCommands) == RowsCount 
                 ? SpacePlan.FullRender(tableSize) 
                 : SpacePlan.PartialRender(tableSize);
-            
-            var x = renderingCommands.Select(x => $"{x.Cell.Row} {x.Cell.Column} {x.Offset} {x.Size} {x.Measurement}");
-            var res = string.Join("\n", x);
-            
-            Console.WriteLine($"Measure: {availableSpace} / {result}");
-            return result;
         }
 
         internal override void Draw(Size availableSpace)
         {
             UpdateColumnsWidth(availableSpace.Width);
-            var renderingCommands = PlanLayout(new Size(availableSpace.Width, availableSpace.Height + 1)).ToList();
+            var renderingCommands = PlanLayout(availableSpace);
 
             foreach (var command in renderingCommands)
             {
@@ -122,18 +107,17 @@ namespace QuestPDF.Elements.Table
                 Canvas.Translate(command.Offset.Reverse());
             }
 
-            CurrentRow = renderingCommands
+            CurrentRow = FindLastRenderedRow(renderingCommands) + 1;
+        }
+
+        private static int FindLastRenderedRow(ICollection<TableCellRenderingCommand> commands)
+        {
+            return commands
                 .GroupBy(x => x.Cell.Row)
                 .Where(x => x.All(y => y.Measurement.Type == SpacePlanType.FullRender))
                 .Select(x => x.Key)
                 .DefaultIfEmpty(0)
-                .Max() + 1;
-
-            var x = renderingCommands.Select(x => $"{x.Cell.Row} {x.Cell.Column} {x.Offset} {x.Size} {x.Measurement}");
-            var res = string.Join("\n", x);
-            
-            var height = renderingCommands.Max(x => x.Offset.Y + x.Size.Height);
-            Console.WriteLine($"Draw: {availableSpace} / height {height}");
+                .Max();
         }
         
         private void UpdateColumnsWidth(float availableWidth)
@@ -223,27 +207,39 @@ namespace QuestPDF.Elements.Table
             var tableHeight = commands.Max(cell => cell.Offset.Y + cell.Size.Height);
 
             commands = commands.Where(x => x.Cell.Row <= maxRenderingRow).ToList();
-            
-            foreach (var column in Enumerable.Range(1, Columns.Count))
+
+
+            AdjustLastCellSizes(tableHeight, commands);
+            AdjustCellSizes(tableHeight, commands);
+
+            return commands;
+
+            static void AdjustLastCellSizes(float tableHeight, ICollection<TableCellRenderingCommand> commands)
             {
-                var lastCellInColumn = commands
-                    .Where(x => x.Cell.Column <= column && column < x.Cell.Column + x.Cell.ColumnSpan)
-                    .OrderByDescending(x => x.Cell.Row + x.Cell.RowSpan)
-                    .FirstOrDefault();
+                var columnsCount = commands.Select(x => x.Cell).Max(x => x.Column + x.ColumnSpan - 1);
                 
-                if (lastCellInColumn == null)
-                    continue;
+                foreach (var column in Enumerable.Range(1, columnsCount))
+                {
+                    var lastCellInColumn = commands
+                        .Where(x => x.Cell.Column <= column && column < x.Cell.Column + x.Cell.ColumnSpan)
+                        .OrderByDescending(x => x.Cell.Row + x.Cell.RowSpan)
+                        .FirstOrDefault();
                 
-                lastCellInColumn.Size = new Size(lastCellInColumn.Size.Width, tableHeight - lastCellInColumn.Offset.Y);
+                    if (lastCellInColumn == null)
+                        continue;
+                
+                    lastCellInColumn.Size = new Size(lastCellInColumn.Size.Width, tableHeight - lastCellInColumn.Offset.Y);
+                }
             }
-
-            foreach (var command in commands)
+            
+            static void AdjustCellSizes(float tableHeight, ICollection<TableCellRenderingCommand> commands)
             {
-                var height = tableHeight - command.Offset.Y;
-                command.Size = new Size(command.Size.Width, height);
+                foreach (var command in commands)
+                {
+                    var height = tableHeight - command.Offset.Y;
+                    command.Size = new Size(command.Size.Width, height);
+                }
             }
-
-            return commands;
             
             float GetCellWidth(TableCell cell)
             {