// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using System; using Markdig.Syntax; using osu.Framework.Allocation; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Containers.Markdown; using osu.Framework.Graphics.Effects; using osu.Framework.Graphics.Shapes; using osu.Framework.Graphics.Sprites; using osu.Game.Graphics; using osu.Game.Graphics.Containers.Markdown; using osu.Game.Overlays.Wiki.Markdown; using osuTK; using osuTK.Graphics; namespace osu.Game.Overlays.Wiki { public class WikiPanelContainer : Container { [Resolved] private OverlayColourProvider colourProvider { get; set; } private WikiPanelMarkdownContainer panelContainer; public string Text; public bool IsFullWidth; public WikiPanelContainer() { RelativeSizeAxes = Axes.X; Padding = new MarginPadding(3); } [BackgroundDependencyLoader] private void load() { Children = new Drawable[] { new Container { RelativeSizeAxes = Axes.Both, Masking = true, CornerRadius = 4, EdgeEffect = new EdgeEffectParameters { Type = EdgeEffectType.Shadow, Colour = Color4.Black.Opacity(25), Offset = new Vector2(0, 1), Radius = 3, }, Child = new Box { Colour = colourProvider.Background4, RelativeSizeAxes = Axes.Both, }, }, panelContainer = new WikiPanelMarkdownContainer { Text = Text, RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, IsFullWidth = IsFullWidth, } }; } protected override void Update() { base.Update(); Height = Math.Max(panelContainer.Height, Parent.DrawHeight); } private class WikiPanelMarkdownContainer : WikiMarkdownContainer { public bool IsFullWidth; public WikiPanelMarkdownContainer() { LineSpacing = 0; DocumentPadding = new MarginPadding(30); DocumentMargin = new MarginPadding(0); } public override SpriteText CreateSpriteText() => base.CreateSpriteText().With(t => t.Font = t.Font.With(weight: FontWeight.Bold)); public override MarkdownTextFlowContainer CreateTextFlow() => base.CreateTextFlow().With(f => f.TextAnchor = Anchor.TopCentre); protected override MarkdownParagraph CreateParagraph(ParagraphBlock paragraphBlock, int level) => base.CreateParagraph(paragraphBlock, level).With(p => p.Margin = new MarginPadding { Bottom = 10 }); protected override MarkdownHeading CreateHeading(HeadingBlock headingBlock) => new WikiPanelHeading(headingBlock) { IsFullWidth = IsFullWidth, }; } private class WikiPanelHeading : OsuMarkdownHeading { public bool IsFullWidth; public WikiPanelHeading(HeadingBlock headingBlock) : base(headingBlock) { Margin = new MarginPadding { Bottom = 40 }; } public override MarkdownTextFlowContainer CreateTextFlow() => base.CreateTextFlow().With(f => { f.Anchor = Anchor.TopCentre; f.Origin = Anchor.TopCentre; f.TextAnchor = Anchor.TopCentre; }); protected override FontWeight GetFontWeightByLevel(int level) => FontWeight.Light; protected override float GetFontSizeByLevel(int level) => base.GetFontSizeByLevel(IsFullWidth ? level : 3); } } }