From 76a6e7ec92b6d091aa69f2e3ee1ff77f1814aa47 Mon Sep 17 00:00:00 2001 From: Ivaylo Draganov Date: Fri, 10 May 2019 13:35:31 +0300 Subject: [PATCH] Scissor the text of a ButtonWidget if it overflows and display a tooltip Also: * add a variable to a comomn pattern used for truncating text in HotkeyEntryWidget and TextFieldWidget --- OpenRA.Mods.Common/Widgets/ButtonWidget.cs | 18 ++++++++++++++++++ .../Widgets/HotkeyEntryWidget.cs | 5 +++-- OpenRA.Mods.Common/Widgets/TextFieldWidget.cs | 5 +++-- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/OpenRA.Mods.Common/Widgets/ButtonWidget.cs b/OpenRA.Mods.Common/Widgets/ButtonWidget.cs index f5d3fa247f..7f0715e955 100644 --- a/OpenRA.Mods.Common/Widgets/ButtonWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ButtonWidget.cs @@ -243,12 +243,27 @@ namespace OpenRA.Mods.Common.Widgets var bgDark = GetContrastColorDark(); var bgLight = GetContrastColorLight(); + var contentWidth = Bounds.Width - LeftMargin - RightMargin; var stateOffset = Depressed ? new int2(VisualHeight, VisualHeight) : new int2(0, 0); var position = GetTextPosition(text, font, rb); var hover = Ui.MouseOverWidget == this || Children.Any(c => c == Ui.MouseOverWidget); DrawBackground(rb, disabled, Depressed, hover, highlighted); + + // Scissor when the text overflows + var isTextOverflowing = font.Measure(text).X > contentWidth; + if (isTextOverflowing && TooltipContainer != null) + { + Game.Renderer.EnableScissor(new Rectangle(RenderOrigin.X + LeftMargin, RenderOrigin.Y, + contentWidth, Bounds.Bottom)); + + if (GetTooltipText() == null) + GetTooltipText = () => GetText(); + + text = WidgetUtils.TruncateText(text, contentWidth, font); + } + if (Contrast) font.DrawTextWithContrast(text, position + stateOffset, disabled ? colordisabled : color, bgDark, bgLight, 2); @@ -257,6 +272,9 @@ namespace OpenRA.Mods.Common.Widgets else font.DrawText(text, position + stateOffset, disabled ? colordisabled : color); + + if (isTextOverflowing && TooltipContainer != null) + Game.Renderer.DisableScissor(); } int2 GetTextPosition(string text, SpriteFont font, Rectangle rb) diff --git a/OpenRA.Mods.Common/Widgets/HotkeyEntryWidget.cs b/OpenRA.Mods.Common/Widgets/HotkeyEntryWidget.cs index cfc96f6c5d..e35ee9922e 100644 --- a/OpenRA.Mods.Common/Widgets/HotkeyEntryWidget.cs +++ b/OpenRA.Mods.Common/Widgets/HotkeyEntryWidget.cs @@ -124,7 +124,8 @@ namespace OpenRA.Mods.Common.Widgets var textPos = pos + new int2(LeftMargin, (Bounds.Height - textSize.Y) / 2 - VisualHeight); // Scissor when the text overflows - if (textSize.X > Bounds.Width - LeftMargin - RightMargin) + var isTextOverflowing = textSize.X > Bounds.Width - LeftMargin - RightMargin; + if (isTextOverflowing) { Game.Renderer.EnableScissor(new Rectangle(pos.X + LeftMargin, pos.Y, Bounds.Width - LeftMargin - RightMargin, Bounds.Bottom)); @@ -133,7 +134,7 @@ namespace OpenRA.Mods.Common.Widgets var color = disabled ? TextColorDisabled : TextColor; font.DrawText(apparentText, textPos, color); - if (textSize.X > Bounds.Width - LeftMargin - RightMargin) + if (isTextOverflowing) Game.Renderer.DisableScissor(); } diff --git a/OpenRA.Mods.Common/Widgets/TextFieldWidget.cs b/OpenRA.Mods.Common/Widgets/TextFieldWidget.cs index a21acf22e0..672dca44fc 100644 --- a/OpenRA.Mods.Common/Widgets/TextFieldWidget.cs +++ b/OpenRA.Mods.Common/Widgets/TextFieldWidget.cs @@ -579,7 +579,8 @@ namespace OpenRA.Mods.Common.Widgets var textPos = pos + new int2(LeftMargin, verticalMargin); // Right align when editing and scissor when the text overflows - if (textSize.X > Bounds.Width - LeftMargin - RightMargin) + var isTextOverflowing = textSize.X > Bounds.Width - LeftMargin - RightMargin; + if (isTextOverflowing) { if (HasKeyboardFocus) textPos += new int2(Bounds.Width - LeftMargin - RightMargin - textSize.X, 0); @@ -609,7 +610,7 @@ namespace OpenRA.Mods.Common.Widgets if (showCursor && HasKeyboardFocus) font.DrawText("|", new float2(textPos.X + cursorPosition.X - 2, textPos.Y), TextColor); - if (textSize.X > Bounds.Width - LeftMargin - RightMargin) + if (isTextOverflowing) Game.Renderer.DisableScissor(); }