diff --git a/MatterControlLib/PartPreviewWindow/ViewToolBarControls.cs b/MatterControlLib/PartPreviewWindow/ViewToolBarControls.cs index c294cf2f0..3b7536404 100644 --- a/MatterControlLib/PartPreviewWindow/ViewToolBarControls.cs +++ b/MatterControlLib/PartPreviewWindow/ViewToolBarControls.cs @@ -99,8 +99,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow this.workspace = workspace; this.RowPadding = 0; - this.RowBoarder = new BorderDouble(0, 0, 0, 1); - this.RowBoarderColor = theme.GetBorderColor(50); + this.RowBorder = new BorderDouble(0, 0, 0, 1); + this.RowBorderColor = theme.GetBorderColor(50); var openLibraryButton = CreateOpenLibraryButton(sceneContext, theme); diff --git a/MatterControlLib/Utilities/MarkdigAgg/AggRenderer.cs b/MatterControlLib/Utilities/MarkdigAgg/AggRenderer.cs index 0a040be0d..caf808f10 100644 --- a/MatterControlLib/Utilities/MarkdigAgg/AggRenderer.cs +++ b/MatterControlLib/Utilities/MarkdigAgg/AggRenderer.cs @@ -90,7 +90,7 @@ namespace Markdig.Renderers ObjectRenderers.Add(new AggMatchingTextRenderer(theme)); // Extension renderers - //ObjectRenderers.Add(new AggTableRenderer()); + ObjectRenderers.Add(new AggTableRenderer()); //ObjectRenderers.Add(new AggTaskListRenderer()); } diff --git a/MatterControlLib/Utilities/MarkdigAgg/AggTableRenderer.cs b/MatterControlLib/Utilities/MarkdigAgg/AggTableRenderer.cs new file mode 100644 index 000000000..58810d34b --- /dev/null +++ b/MatterControlLib/Utilities/MarkdigAgg/AggTableRenderer.cs @@ -0,0 +1,126 @@ +// Copyright (c) Nicolas Musset. All rights reserved. +// Copyright (c) 2022, John Lewin +// This file is licensed under the MIT license. +// See the LICENSE.md file in the project root for more information. + +using System; +using Markdig.Extensions.Tables; +using MatterHackers.Agg; +using MatterHackers.Agg.Platform; +using MatterHackers.Agg.UI; +using MatterHackers.MatterControl; + +namespace Markdig.Renderers.Agg +{ + public class AggTableRenderer : AggObjectRenderer + { + protected override void Write(AggRenderer renderer, Table table) + { + if (renderer == null) throw new ArgumentNullException(nameof(renderer)); + if (table == null) throw new ArgumentNullException(nameof(table)); + + var aggTable = new FlowLayoutWidget(FlowDirection.TopToBottom) + { + HAnchor = HAnchor.Fit, + VAnchor = VAnchor.Fit, + Margin = new BorderDouble(top: 12), + }; + + // TODO: Use Markdig parser data to drive column/cell widths + //foreach (var tableColumnDefinition in table.ColumnDefinitions) + // Width = (tableColumnDefinition?.Width ?? 0) != 0 ? tableColumnDefinition.Width : + + renderer.Push(aggTable); + + foreach (var rowObj in table) + { + var row = (TableRow)rowObj; + + var aggRow = new AggTableRow() + { + IsHeadingRow = row.IsHeader, + }; + + renderer.Push(aggRow); + + if (row.IsHeader) + { + // Update to desired header row styling and/or moving into AggTableRow for consistency + aggRow.BackgroundColor = MatterHackers.MatterControl.AppContext.Theme.TabBarBackground; + } + + for (var i = 0; i < row.Count; i++) + { + var cellObj = row[i]; + var cell = (TableCell)cellObj; + + // Fixed width cells just to get something initially on screen + var aggCellBox = new GuiWidget() + { + Width = 200, + Height = 25, + }; + + // TODO: Cell Width - implement next, might be easy to track and perform in AggTableRow + /* (Spec) + * If any line of the markdown source is longer than the column width (see --columns), then the + * table will take up the full text width and the cell contents will wrap, with the relative cell + * widths determined by the number of dashes in the line separating the table header from the table + * body. (For example ---|- would make the first column 3/4 and the second column 1/4 of the full + * text width.) On the other hand, if no lines are wider than column width, then cell contents will + * not be wrapped, and the cells will be sized to their contents. + */ + + // Cell box above enforces boundaries, use flow for layout + var aggCellFlow = new FlowLayoutWidget() + { + HAnchor = HAnchor.Stretch, + }; + + if (table.ColumnDefinitions.Count > 0) + { + // TODO: Ideally we'd be driving column width from metadata rather than hard-coded + // See example below from WPF implementation + // + // Grab the column definition, or fall back to a default + var columnIndex = cell.ColumnIndex < 0 || cell.ColumnIndex >= table.ColumnDefinitions.Count + ? i + : cell.ColumnIndex; + columnIndex = columnIndex >= table.ColumnDefinitions.Count ? table.ColumnDefinitions.Count - 1 : columnIndex; + + // TODO: revise alignment via Agg types that produce aligned text + var columnDefinition = table.ColumnDefinitions[columnIndex]; + var alignment = columnDefinition.Alignment; + if (alignment.HasValue) + { + switch (alignment) + { + case TableColumnAlign.Center: + aggCellFlow.HAnchor |= HAnchor.Center; + break; + case TableColumnAlign.Right: + aggCellFlow.HAnchor |= HAnchor.Right; + break; + case TableColumnAlign.Left: + aggCellFlow.HAnchor |= HAnchor.Left; + break; + } + } + } + + renderer.Push(aggCellBox); + renderer.Push(aggCellFlow); + renderer.Write(cell); + renderer.Pop(); + renderer.Pop(); + } + + // Pop row + renderer.Pop(); + } + + // Pop table + renderer.Pop(); + } + } +} \ No newline at end of file diff --git a/MatterControlLib/Utilities/MarkdigAgg/AggTableRow.cs b/MatterControlLib/Utilities/MarkdigAgg/AggTableRow.cs new file mode 100644 index 000000000..1258993bf --- /dev/null +++ b/MatterControlLib/Utilities/MarkdigAgg/AggTableRow.cs @@ -0,0 +1,52 @@ +// Copyright (c) 2016-2017 Nicolas Musset. All rights reserved. +// Copyright (c) 2022, John Lewin +// This file is licensed under the MIT license. +// See the LICENSE.md file in the project root for more information. + +using System.Linq; +using Markdig.Renderers.Agg.Inlines; +using MatterHackers.Agg; +using MatterHackers.Agg.UI; + +namespace Markdig.Renderers.Agg +{ + public class AggTableRow: FlowLayoutWidget + { + public AggTableRow() + { + this.VAnchor = VAnchor.Fit; + this.Margin = new BorderDouble(3, 4, 0, 12); + + // Hack to force content on-screen (seemingly not working when set late/after constructor) + VAnchor = VAnchor.Absolute; + Height = 25; + } + + public bool IsHeadingRow { get; set; } + + // Override AddChild to push styles to child elements when table rows are resolved to the tree + public override GuiWidget AddChild(GuiWidget childToAdd, int indexInChildrenList = -1) + { + if (childToAdd is TextWidget textWidget) + { + // textWidget.TextColor = new Color("#036ac3"); + if (this.IsHeadingRow) + { + textWidget.Bold = true; + } + } + else if (childToAdd is TextLinkX textLink) + { + foreach (var childTextWidget in childToAdd.Children.OfType()) + { + if (this.IsHeadingRow) + { + childTextWidget.Bold = true; + } + } + } + + return base.AddChild(childToAdd, indexInChildrenList); + } + } +} diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index c4f8114e2..3be867c69 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit c4f8114e2006faa32e6792f1a4d007ab2bbaed9a +Subproject commit 3be867c69f3fedc3dbee0874466743e75bc2062d