From e277c6a8dc9d6898cd8b4cbef59497985b5083a2 Mon Sep 17 00:00:00 2001 From: MarcinZiabek Date: Thu, 29 Sep 2022 14:46:56 +0200 Subject: [PATCH] RTL: table, decoration, minimal box --- QuestPDF.Examples/RightToLeftExamples.cs | 55 +++++++++++++++++++++++- QuestPDF/Elements/Decoration.cs | 12 ++++-- QuestPDF/Elements/MinimalBox.cs | 10 ++++- QuestPDF/Elements/Row.cs | 13 +++--- QuestPDF/Elements/Table/Table.cs | 18 +++++--- 5 files changed, 91 insertions(+), 17 deletions(-) diff --git a/QuestPDF.Examples/RightToLeftExamples.cs b/QuestPDF.Examples/RightToLeftExamples.cs index aa26e0e..03489e0 100644 --- a/QuestPDF.Examples/RightToLeftExamples.cs +++ b/QuestPDF.Examples/RightToLeftExamples.cs @@ -42,7 +42,6 @@ namespace QuestPDF.Examples .Padding(25) .ContentFromRightToLeft() .Border(1) - .MinimalBox() .Row(row => { row.ConstantItem(200).Background(Colors.Red.Lighten2).Height(200); @@ -51,5 +50,59 @@ namespace QuestPDF.Examples }); }); } + + [Test] + public void MinimalBox() + { + RenderingTest + .Create() + .ProduceImages() + .PageSize(600, 600) + .ShowResults() + .Render(container => + { + container + .Padding(25) + .ContentFromRightToLeft() + .Border(1) + .MinimalBox() + .Column(column => + { + column.Item().Background(Colors.Red.Lighten2).Width(200).Height(200); + column.Item().Background(Colors.Green.Lighten2).Width(150).Height(150); + column.Item().Background(Colors.Blue.Lighten2).Width(100).Height(100); + }); + }); + } + + [Test] + public void Table() + { + RenderingTest + .Create() + .ProduceImages() + .PageSize(600, 600) + .ShowResults() + .Render(container => + { + container + .Padding(25) + .ContentFromRightToLeft() + .Border(1) + .Table(table => + { + table.ColumnsDefinition(columns => + { + columns.ConstantColumn(200); + columns.ConstantColumn(150); + columns.ConstantColumn(100); + }); + + table.Cell().Background(Colors.Red.Lighten2).Height(200); + table.Cell().Background(Colors.Green.Lighten2).Height(200); + table.Cell().Background(Colors.Blue.Lighten2).Height(200); + }); + }); + } } } \ No newline at end of file diff --git a/QuestPDF/Elements/Decoration.cs b/QuestPDF/Elements/Decoration.cs index 61d72e6..fc9c9ea 100644 --- a/QuestPDF/Elements/Decoration.cs +++ b/QuestPDF/Elements/Decoration.cs @@ -14,8 +14,10 @@ namespace QuestPDF.Elements public Position Offset { get; set; } } - internal class Decoration : Element, ICacheable + internal class Decoration : Element, ICacheable, IContentDirectionAware { + public ContentDirection ContentDirection { get; set; } + internal Element Before { get; set; } = new Empty(); internal Element Content { get; set; } = new Empty(); internal Element After { get; set; } = new Empty(); @@ -64,9 +66,13 @@ namespace QuestPDF.Elements { var elementSize = new Size(width, command.Measurement.Height); - Canvas.Translate(command.Offset); + var offset = ContentDirection == ContentDirection.LeftToRight + ? command.Offset + : new Position(availableSpace.Width - command.Offset.X - command.Measurement.Width, command.Offset.Y); + + Canvas.Translate(offset); command.Element.Draw(elementSize); - Canvas.Translate(command.Offset.Reverse()); + Canvas.Translate(offset.Reverse()); } } diff --git a/QuestPDF/Elements/MinimalBox.cs b/QuestPDF/Elements/MinimalBox.cs index 741b439..8f611d3 100644 --- a/QuestPDF/Elements/MinimalBox.cs +++ b/QuestPDF/Elements/MinimalBox.cs @@ -3,8 +3,10 @@ using QuestPDF.Infrastructure; namespace QuestPDF.Elements { - internal class MinimalBox : ContainerElement + internal class MinimalBox : ContainerElement, IContentDirectionAware { + public ContentDirection ContentDirection { get; set; } + internal override void Draw(Size availableSpace) { var targetSize = base.Measure(availableSpace); @@ -12,7 +14,13 @@ namespace QuestPDF.Elements if (targetSize.Type == SpacePlanType.Wrap) return; + var translate = ContentDirection == ContentDirection.RightToLeft + ? new Position(availableSpace.Width - targetSize.Width, 0) + : Position.Zero; + + Canvas.Translate(translate); base.Draw(targetSize); + Canvas.Translate(translate.Reverse()); } } } \ No newline at end of file diff --git a/QuestPDF/Elements/Row.cs b/QuestPDF/Elements/Row.cs index 1682d93..bcbe89e 100644 --- a/QuestPDF/Elements/Row.cs +++ b/QuestPDF/Elements/Row.cs @@ -64,7 +64,7 @@ namespace QuestPDF.Elements if (renderingCommands.Any(x => !x.RowItem.IsRendered && x.Measurement.Type == SpacePlanType.Wrap)) return SpacePlan.Wrap(); - var width = renderingCommands.Max(c => c.Offset.X + c.Size.Width); + var width = renderingCommands.Last().Offset.X + renderingCommands.Last().Size.Width; var height = renderingCommands.Max(x => x.Size.Height); var size = new Size(width, height); @@ -93,9 +93,13 @@ namespace QuestPDF.Elements if (command.Measurement.Type == SpacePlanType.Wrap) continue; - Canvas.Translate(command.Offset); + var offset = ContentDirection == ContentDirection.LeftToRight + ? command.Offset + : new Position(availableSpace.Width - command.Offset.X - command.Size.Width, 0); + + Canvas.Translate(offset); command.RowItem.Draw(command.Size); - Canvas.Translate(command.Offset.Reverse()); + Canvas.Translate(offset.Reverse()); } if (Items.All(x => x.IsRendered)) @@ -154,9 +158,6 @@ namespace QuestPDF.Elements { command.Size = new Size(command.Size.Width, rowHeight); command.Measurement = command.RowItem.Measure(command.Size); - - if (ContentDirection == ContentDirection.RightToLeft) - command.Offset = new Position(availableSpace.Width - command.Offset.X - command.Size.Width, 0); } return renderingCommands; diff --git a/QuestPDF/Elements/Table/Table.cs b/QuestPDF/Elements/Table/Table.cs index 6663f50..8226108 100644 --- a/QuestPDF/Elements/Table/Table.cs +++ b/QuestPDF/Elements/Table/Table.cs @@ -9,10 +9,12 @@ using QuestPDF.Infrastructure; namespace QuestPDF.Elements.Table { - internal class Table : Element, IStateResettable + internal class Table : Element, IStateResettable, IContentDirectionAware { - public List Columns { get; set; } = new List(); - public List Cells { get; set; } = new List(); + public ContentDirection ContentDirection { get; set; } + + public List Columns { get; set; } = new(); + public List Cells { get; set; } = new(); public bool ExtendLastCellsToTableBottom { get; set; } private int StartingRowsCount { get; set; } @@ -109,9 +111,13 @@ namespace QuestPDF.Elements.Table if (command.Measurement.Type == SpacePlanType.Wrap) continue; - Canvas.Translate(command.Offset); + var offset = ContentDirection == ContentDirection.LeftToRight + ? command.Offset + : new Position(availableSpace.Width - command.Offset.X - command.Size.Width, 0); + + Canvas.Translate(offset); command.Cell.Draw(command.Size); - Canvas.Translate(command.Offset.Reverse()); + Canvas.Translate(offset.Reverse()); } CurrentRow = FindLastRenderedRow(renderingCommands) + 1; @@ -158,7 +164,7 @@ namespace QuestPDF.Elements.Table if (ExtendLastCellsToTableBottom) AdjustLastCellSizes(tableHeight, commands); - + return commands; static float[] GetColumnLeftOffsets(IList columns)