#region Copyright & License Information /* * Copyright 2007-2022 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. For more * information, see COPYING. */ #endregion using System; using OpenRA.Widgets; namespace OpenRA.Mods.Common.Widgets.Logic { public class SimpleTooltipLogic : ChromeLogic { [ObjectCreator.UseCtor] public SimpleTooltipLogic(Widget widget, TooltipContainerWidget tooltipContainer, Func getText) { var label = widget.Get("LABEL"); var spacing = widget.Get("LINE_HEIGHT"); widget.RemoveChildren(); var font = Game.Renderer.Fonts[label.Font]; var horizontalPadding = label.Bounds.Width - widget.Bounds.Width; if (horizontalPadding <= 0) horizontalPadding = 2 * label.Bounds.X; var cachedText = ""; tooltipContainer.BeforeRender = () => { var text = getText(); if (text == cachedText) return; var lines = text.Split('\n'); var textWidth = font.Measure(text).X; // Set up label widgets widget.RemoveChildren(); var bottom = 0; for (var i = 0; i < lines.Length; i++) { var line = (LabelWidget)label.Clone(); var lineText = lines[i]; line.Bounds.Y += spacing.Bounds.Y + i * spacing.Bounds.Height; line.Bounds.Width = textWidth; line.GetText = () => lineText; widget.AddChild(line); bottom = line.Bounds.Y + line.Bounds.Height; } widget.Bounds.Width = horizontalPadding + textWidth; widget.Bounds.Height = bottom + spacing.Bounds.Y; cachedText = text; }; } } }