diff --git a/Saradomin/App.axaml b/Saradomin/App.axaml index 85e5d35..e48d70b 100644 --- a/Saradomin/App.axaml +++ b/Saradomin/App.axaml @@ -1,8 +1,6 @@ + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> #3E3529 #CC3E3529 @@ -101,7 +99,9 @@ + + diff --git a/Saradomin/Resources/Styles/Expander.axaml b/Saradomin/Resources/Styles/Expander.axaml new file mode 100644 index 0000000..dd35511 --- /dev/null +++ b/Saradomin/Resources/Styles/Expander.axaml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + diff --git a/Saradomin/Resources/Styles/ListBoxItem.axaml b/Saradomin/Resources/Styles/ListBoxItem.axaml index 7086b86..4200f06 100644 --- a/Saradomin/Resources/Styles/ListBoxItem.axaml +++ b/Saradomin/Resources/Styles/ListBoxItem.axaml @@ -4,7 +4,7 @@ - + diff --git a/Saradomin/Resources/Styles/ScrollBar.axaml b/Saradomin/Resources/Styles/ScrollBar.axaml index 3de144b..8a7cc09 100644 --- a/Saradomin/Resources/Styles/ScrollBar.axaml +++ b/Saradomin/Resources/Styles/ScrollBar.axaml @@ -1,16 +1,36 @@ + + - + diff --git a/Saradomin/Resources/Styles/TextBlock.axaml b/Saradomin/Resources/Styles/TextBlock.axaml new file mode 100644 index 0000000..7d9c9a0 --- /dev/null +++ b/Saradomin/Resources/Styles/TextBlock.axaml @@ -0,0 +1,6 @@ + + + diff --git a/Saradomin/Utilities/HtmlRenderer.cs b/Saradomin/Utilities/HtmlRenderer.cs index 0682593..e38f782 100644 --- a/Saradomin/Utilities/HtmlRenderer.cs +++ b/Saradomin/Utilities/HtmlRenderer.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Web; using Avalonia; using Avalonia.Controls; +using Avalonia.Controls.Documents; using Avalonia.Layout; using Avalonia.Media; using HtmlAgilityPack; @@ -12,54 +13,40 @@ namespace Saradomin.Utilities public class HtmlRenderer { private int _listDescent = 0; - private bool seenNonWhiteSpace = false; - - private Stack _panels = new(); - private StackPanel _container; + private string _prefix; + private InlineCollection _inlines; private HtmlNode _rootNode; - public StackPanel CurrentLine => _panels.Peek(); - - public HtmlRenderer(StackPanel container, HtmlNode rootNode) + public HtmlRenderer(HtmlNode rootNode) { - _container = container; _rootNode = rootNode; } - public void RenderToContainer() + public InlineCollection Render() { - _panels.Push(_container); - Visit(_rootNode); - _panels.Pop(); + _inlines = new(); + { + Visit(_rootNode); + } + return _inlines; } - private void InNewBlockDo(Action action) + private void InNewBlockDo(Action action) { - var line = new StackPanel - { - Orientation = Orientation.Vertical, - HorizontalAlignment = HorizontalAlignment.Left - }; - _panels.Push(line); - action(line); - - _container.Children.Add(_panels.Pop()); + action(); + _inlines.Add(new LineBreak()); } private void CreateNewInlineTextElement( string text, FontWeight weight = FontWeight.Normal, - double fontSize = 12, - TextWrapping wrapping = TextWrapping.Wrap) + double fontSize = 12 + ) { - CurrentLine.Children.Add(new TextBlock + _inlines.Add(new Run(text) { - Foreground = new SolidColorBrush(Colors.Black), - FontSize = fontSize, FontWeight = weight, - TextWrapping = wrapping, - Text = text, - Margin = new Thickness(_listDescent * 8, 0, 0, 0) + FontSize = fontSize, }); } @@ -77,7 +64,7 @@ namespace Saradomin.Utilities { _listDescent++; { - InNewBlockDo((_) => + InNewBlockDo(() => { foreach (var child in htmlNode.ChildNodes) { @@ -90,15 +77,29 @@ namespace Saradomin.Utilities private void VisitListEntry(HtmlNode htmlNode) { - foreach (var child in htmlNode.ChildNodes) + _inlines.Add(new Run("• ")); + + for (var i = 0; i < htmlNode.ChildNodes.Count; i++) { + var child = htmlNode.ChildNodes[i]; + + if (i != 0) + { + _prefix = " "; + } + Visit(child); + + _prefix = null; } + + _prefix = null; + _inlines.Add(new LineBreak()); } private void VisitParagraph(HtmlNode htmlNode) { - InNewBlockDo((_) => + InNewBlockDo(() => { foreach (var child in htmlNode.ChildNodes) { @@ -115,21 +116,14 @@ namespace Saradomin.Utilities var text = HttpUtility.HtmlDecode( htmlNode.GetDirectInnerText().Trim(' ').Trim('\n') ); - if (!seenNonWhiteSpace && string.IsNullOrWhiteSpace(htmlNode.InnerText)) break; - seenNonWhiteSpace = true; - - if (htmlNode.ParentNode.Name == "li") - { - if (!string.IsNullOrWhiteSpace(text)) - { - text = $"• {text}"; - } - } - - CreateNewInlineTextElement(text); + + CreateNewInlineTextElement($"{_prefix}{text}"); + break; + + case "br": + _inlines.Add(new LineBreak()); break; - case "strong": case "b": VisitBold(htmlNode); break; diff --git a/Saradomin/View/Controls/PluginManagerView.axaml b/Saradomin/View/Controls/PluginManagerView.axaml index 2bf5254..4c70ae1 100644 --- a/Saradomin/View/Controls/PluginManagerView.axaml +++ b/Saradomin/View/Controls/PluginManagerView.axaml @@ -6,95 +6,105 @@ xmlns:mvvm="clr-namespace:Glitonea.Mvvm;assembly=Glitonea" xmlns:vm="clr-namespace:Saradomin.ViewModel.Controls" DataContext="{mvvm:DataContextSource vm:PluginManagerViewModel}"> - - - - - - - - - - -