diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index c70988797..06c441bbe 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -42,6 +42,7 @@ END TEMPLATE--> * You can now specify CVar overrides via environment variable with the `ROBUST_CVAR_*` prefix. For example `ROBUST_CVAR_game__hostname=foobar` would set the appropriate CVar. Double underscores in the environment variable name are replaced with ".". * Added non-generic variant of `GetCVar` to `IConfigurationManager`. * Control layout properties such as `Margin` can now be set via style sheets. +* Distance between lines of a `RichTextLabel` can now be modified with `LineHeightScale`. ### Bugfixes diff --git a/Robust.Client/UserInterface/Controls/RichTextLabel.cs b/Robust.Client/UserInterface/Controls/RichTextLabel.cs index 8836b42e3..8e4f2e8c9 100644 --- a/Robust.Client/UserInterface/Controls/RichTextLabel.cs +++ b/Robust.Client/UserInterface/Controls/RichTextLabel.cs @@ -6,6 +6,7 @@ using Robust.Client.UserInterface.RichText; using Robust.Shared.IoC; using Robust.Shared.Maths; using Robust.Shared.Utility; +using Robust.Shared.ViewVariables; namespace Robust.Client.UserInterface.Controls { @@ -16,6 +17,26 @@ namespace Robust.Client.UserInterface.Controls private FormattedMessage? _message; private RichTextEntry _entry; + private float _lineHeightScale = 1; + private bool _lineHeightOverride; + + [ViewVariables(VVAccess.ReadWrite)] + public float LineHeightScale + { + get + { + if (!_lineHeightOverride && TryGetStyleProperty(nameof(LineHeightScale), out float value)) + return value; + + return _lineHeightScale; + } + set + { + _lineHeightScale = value; + _lineHeightOverride = true; + InvalidateMeasure(); + } + } public RichTextLabel() { @@ -47,7 +68,7 @@ namespace Robust.Client.UserInterface.Controls } var font = _getFont(); - _entry.Update(font, availableSize.X * UIScale, UIScale); + _entry.Update(font, availableSize.X * UIScale, UIScale, LineHeightScale); return new Vector2(_entry.Width / UIScale, _entry.Height / UIScale); } @@ -61,7 +82,7 @@ namespace Robust.Client.UserInterface.Controls return; } - _entry.Draw(handle, _getFont(), SizeBox, 0, new MarkupDrawingContext(), UIScale); + _entry.Draw(handle, _getFont(), SizeBox, 0, new MarkupDrawingContext(), UIScale, LineHeightScale); } [Pure] diff --git a/Robust.Client/UserInterface/RichTextEntry.cs b/Robust.Client/UserInterface/RichTextEntry.cs index 529bdd15c..4c42084a5 100644 --- a/Robust.Client/UserInterface/RichTextEntry.cs +++ b/Robust.Client/UserInterface/RichTextEntry.cs @@ -71,7 +71,8 @@ namespace Robust.Client.UserInterface /// The font being used for display. /// The maximum horizontal size of the container of this entry. /// - public void Update(Font defaultFont, float maxSizeX, float uiScale) + /// + public void Update(Font defaultFont, float maxSizeX, float uiScale, float lineHeightScale = 1) { // This method is gonna suck due to complexity. // Bear with me here. @@ -159,7 +160,7 @@ namespace Robust.Client.UserInterface if (!context.Font.TryPeek(out var font)) font = defaultFont; - src.Height += font.GetLineHeight(uiScale); + src.Height += GetLineHeight(font, uiScale, lineHeightScale); } } } @@ -170,7 +171,8 @@ namespace Robust.Client.UserInterface UIBox2 drawBox, float verticalOffset, MarkupDrawingContext context, - float uiScale) + float uiScale, + float lineHeightScale = 1) { context.Clear(); context.Color.Push(_defaultColor); @@ -197,7 +199,7 @@ namespace Robust.Client.UserInterface if (lineBreakIndex < LineBreaks.Count && LineBreaks[lineBreakIndex] == globalBreakCounter) { - baseLine = new Vector2(drawBox.Left, baseLine.Y + font.GetLineHeight(uiScale) + controlYAdvance); + baseLine = new Vector2(drawBox.Left, baseLine.Y + GetLineHeight(font, uiScale, lineHeightScale) + controlYAdvance); controlYAdvance = 0; lineBreakIndex += 1; } @@ -216,7 +218,7 @@ namespace Robust.Client.UserInterface control.Position = new Vector2(baseLine.X * invertedScale, (baseLine.Y - defaultFont.GetAscent(uiScale)) * invertedScale); control.Measure(new Vector2(Width, Height)); var advanceX = control.DesiredPixelSize.X; - controlYAdvance = Math.Max(0f, (control.DesiredPixelSize.Y - font.GetLineHeight(uiScale)) * invertedScale); + controlYAdvance = Math.Max(0f, (control.DesiredPixelSize.Y - GetLineHeight(font, uiScale, lineHeightScale)) * invertedScale); baseLine += new Vector2(advanceX, 0); } } @@ -242,5 +244,11 @@ namespace Robust.Client.UserInterface tag.PopDrawContext(node, context); return tag.TextAfter(node); } + + private static int GetLineHeight(Font font, float uiScale, float lineHeightScale) + { + var height = font.GetLineHeight(uiScale); + return (int)(height * lineHeightScale); + } } }