From dacf0d915c4caeec2141406cf5bcf878a85bb910 Mon Sep 17 00:00:00 2001 From: Killerqu00 <47712032+Killerqu00@users.noreply.github.com> Date: Sat, 22 Mar 2025 03:22:01 +0100 Subject: [PATCH] Hover examine buttons (#35206) * hover examine verbs (not aligned to the left yet) * handle click hovers and align them to the left * revert contrabandsystem changes (this is for another PR) * add support for markup tags --- Content.Client/Examine/ExamineButton.cs | 13 +++++++- Content.Client/Examine/ExamineSystem.cs | 33 +++++++++++++++++-- Content.Client/Verbs/UI/VerbMenuElement.cs | 14 +++++++- Content.Client/Verbs/VerbSystem.cs | 2 +- Content.Server/Verbs/VerbSystem.cs | 3 +- .../Examine/ExamineSystemShared.Group.cs | 32 +++++++++++++----- Content.Shared/Verbs/Verb.cs | 1 + 7 files changed, 82 insertions(+), 16 deletions(-) diff --git a/Content.Client/Examine/ExamineButton.cs b/Content.Client/Examine/ExamineButton.cs index 52ff7a972e..839e08f3d4 100644 --- a/Content.Client/Examine/ExamineButton.cs +++ b/Content.Client/Examine/ExamineButton.cs @@ -4,6 +4,7 @@ using Content.Shared.Verbs; using Robust.Client.AutoGenerated; using Robust.Client.Graphics; using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.XAML; using Robust.Client.Utility; using Robust.Shared.Utility; @@ -40,7 +41,17 @@ public sealed class ExamineButton : ContainerButton Disabled = true; } - ToolTip = verb.Message ?? verb.Text; + TooltipSupplier = sender => + { + var label = new RichTextLabel(); + label.SetMessage(FormattedMessage.FromMarkupOrThrow(verb.Message ?? verb.Text)); + + var tooltip = new Tooltip(); + tooltip.GetChild(0).Children.Clear(); + tooltip.GetChild(0).Children.Add(label); + + return tooltip; + }; Icon = new TextureRect { diff --git a/Content.Client/Examine/ExamineSystem.cs b/Content.Client/Examine/ExamineSystem.cs index 1c1f1984de..07694ac24a 100644 --- a/Content.Client/Examine/ExamineSystem.cs +++ b/Content.Client/Examine/ExamineSystem.cs @@ -298,10 +298,28 @@ namespace Content.Client.Examine { Name = "ExamineButtonsHBox", Orientation = LayoutOrientation.Horizontal, - HorizontalAlignment = Control.HAlignment.Right, + HorizontalAlignment = Control.HAlignment.Stretch, VerticalAlignment = Control.VAlignment.Bottom, }; + var hoverExamineBox = new BoxContainer + { + Name = "HoverExamineHBox", + Orientation = LayoutOrientation.Horizontal, + HorizontalAlignment = Control.HAlignment.Left, + VerticalAlignment = Control.VAlignment.Center, + HorizontalExpand = true + }; + + var clickExamineBox = new BoxContainer + { + Name = "ClickExamineHBox", + Orientation = LayoutOrientation.Horizontal, + HorizontalAlignment = Control.HAlignment.Right, + VerticalAlignment = Control.VAlignment.Center, + HorizontalExpand = true + }; + // Examine button time foreach (var verb in verbs) { @@ -316,8 +334,15 @@ namespace Content.Client.Examine var button = new ExamineButton(examine); - button.OnPressed += VerbButtonPressed; - buttonsHBox.AddChild(button); + if (examine.HoverVerb) + { + hoverExamineBox.AddChild(button); + } + else + { + button.OnPressed += VerbButtonPressed; + clickExamineBox.AddChild(button); + } } var vbox = _examineTooltipOpen?.GetChild(0).GetChild(0); @@ -334,6 +359,8 @@ namespace Content.Client.Examine { vbox.Children.Remove(hbox.First()); } + buttonsHBox.AddChild(hoverExamineBox); + buttonsHBox.AddChild(clickExamineBox); vbox.AddChild(buttonsHBox); } diff --git a/Content.Client/Verbs/UI/VerbMenuElement.cs b/Content.Client/Verbs/UI/VerbMenuElement.cs index 1815144f7d..f1f8972c45 100644 --- a/Content.Client/Verbs/UI/VerbMenuElement.cs +++ b/Content.Client/Verbs/UI/VerbMenuElement.cs @@ -3,10 +3,12 @@ using Content.Client.ContextMenu.UI; using Content.Shared.Verbs; using Robust.Client.GameObjects; using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.CustomControls; using Robust.Client.Utility; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Maths; +using Robust.Shared.Utility; namespace Content.Client.Verbs.UI { @@ -27,7 +29,17 @@ namespace Content.Client.Verbs.UI public VerbMenuElement(Verb verb) : base(verb.Text) { - ToolTip = verb.Message; + TooltipSupplier = sender => + { + var label = new RichTextLabel(); + label.SetMessage(FormattedMessage.FromMarkupOrThrow(verb.Message ?? verb.Text)); + + var tooltip = new Tooltip(); + tooltip.GetChild(0).Children.Clear(); + tooltip.GetChild(0).Children.Add(label); + + return tooltip; + }; Disabled = verb.Disabled; Verb = verb; diff --git a/Content.Client/Verbs/VerbSystem.cs b/Content.Client/Verbs/VerbSystem.cs index f592303d28..d6513c0a78 100644 --- a/Content.Client/Verbs/VerbSystem.cs +++ b/Content.Client/Verbs/VerbSystem.cs @@ -213,7 +213,7 @@ namespace Content.Client.Verbs { // maybe send an informative pop-up message. if (!string.IsNullOrWhiteSpace(verb.Message)) - _popupSystem.PopupEntity(verb.Message, user); + _popupSystem.PopupEntity(FormattedMessage.RemoveMarkupOrThrow(verb.Message), user); return; } diff --git a/Content.Server/Verbs/VerbSystem.cs b/Content.Server/Verbs/VerbSystem.cs index ebb3bb1df3..a0ca0a80df 100644 --- a/Content.Server/Verbs/VerbSystem.cs +++ b/Content.Server/Verbs/VerbSystem.cs @@ -7,6 +7,7 @@ using Content.Shared.Database; using Content.Shared.Hands.Components; using Content.Shared.Inventory.VirtualItem; using Content.Shared.Verbs; +using Robust.Shared.Utility; namespace Content.Server.Verbs { @@ -75,7 +76,7 @@ namespace Content.Server.Verbs { // Send an informative pop-up message if (!string.IsNullOrWhiteSpace(verb.Message)) - _popupSystem.PopupEntity(verb.Message, user, user); + _popupSystem.PopupEntity(FormattedMessage.RemoveMarkupOrThrow(verb.Message), user, user); return; } diff --git a/Content.Shared/Examine/ExamineSystemShared.Group.cs b/Content.Shared/Examine/ExamineSystemShared.Group.cs index aaf850a5d3..299d3c4af2 100644 --- a/Content.Shared/Examine/ExamineSystemShared.Group.cs +++ b/Content.Shared/Examine/ExamineSystemShared.Group.cs @@ -111,7 +111,7 @@ namespace Content.Shared.Examine /// /// Either sends the details to a GroupExamineComponent if it finds one, or adds a details examine verb itself. /// - public void AddDetailedExamineVerb(GetVerbsEvent verbsEvent, Component component, List entries, string verbText, string iconTexture = DefaultIconTexture, string hoverMessage = "") + public void AddDetailedExamineVerb(GetVerbsEvent verbsEvent, Component component, List entries, string verbText, string iconTexture = DefaultIconTexture, string hoverMessage = "", bool isHoverExamine = false) { // If the entity has the GroupExamineComponent if (TryComp(verbsEvent.Target, out var groupExamine)) @@ -142,17 +142,23 @@ namespace Content.Shared.Examine } var formattedMessage = GetFormattedMessageFromExamineEntries(entries); + var act = () => + { + SendExamineTooltip(verbsEvent.User, verbsEvent.Target, formattedMessage, false, false); + }; + if (isHoverExamine) + { + act = () => { }; + } var examineVerb = new ExamineVerb() { - Act = () => - { - SendExamineTooltip(verbsEvent.User, verbsEvent.Target, formattedMessage, false, false); - }, + Act = act, Text = verbText, Message = hoverMessage, Category = VerbCategory.Examine, Icon = new SpriteSpecifier.Texture(new(iconTexture)), + HoverVerb = isHoverExamine }; verbsEvent.Verbs.Add(examineVerb); @@ -161,18 +167,26 @@ namespace Content.Shared.Examine /// /// Either adds a details examine verb, or sends the details to a GroupExamineComponent if it finds one. /// - public void AddDetailedExamineVerb(GetVerbsEvent verbsEvent, Component component, ExamineEntry entry, string verbText, string iconTexture = DefaultIconTexture, string hoverMessage = "") + public void AddDetailedExamineVerb(GetVerbsEvent verbsEvent, Component component, ExamineEntry entry, string verbText, string iconTexture = DefaultIconTexture, string hoverMessage = "", bool isHoverExamine = false) { - AddDetailedExamineVerb(verbsEvent, component, new List { entry }, verbText, iconTexture, hoverMessage); + AddDetailedExamineVerb(verbsEvent, component, new List { entry }, verbText, iconTexture, hoverMessage, isHoverExamine); } /// /// Either adds a details examine verb, or sends the details to a GroupExamineComponent if it finds one. /// - public void AddDetailedExamineVerb(GetVerbsEvent verbsEvent, Component component, FormattedMessage message, string verbText, string iconTexture = DefaultIconTexture, string hoverMessage = "") + public void AddDetailedExamineVerb(GetVerbsEvent verbsEvent, Component component, FormattedMessage message, string verbText, string iconTexture = DefaultIconTexture, string hoverMessage = "", bool isHoverExamine = false) { var componentName = _componentFactory.GetComponentName(component.GetType()); - AddDetailedExamineVerb(verbsEvent, component, new ExamineEntry(componentName, 0f, message), verbText, iconTexture, hoverMessage); + AddDetailedExamineVerb(verbsEvent, component, new ExamineEntry(componentName, 0f, message), verbText, iconTexture, hoverMessage, isHoverExamine); + } + + /// + /// Adds an icon aligned to the left of examine window that gives you info on hover. + /// + public void AddHoverExamineVerb(GetVerbsEvent verbsEvent, Component component, string hoverMessage, string iconTexture = DefaultIconTexture) + { + AddDetailedExamineVerb(verbsEvent, component, FormattedMessage.Empty, "", iconTexture, hoverMessage, true); } } } diff --git a/Content.Shared/Verbs/Verb.cs b/Content.Shared/Verbs/Verb.cs index 660a3bdf94..5faca9bb06 100644 --- a/Content.Shared/Verbs/Verb.cs +++ b/Content.Shared/Verbs/Verb.cs @@ -347,6 +347,7 @@ namespace Content.Shared.Verbs public override bool CloseMenuDefault => false; // for examine verbs, this will close the examine tooltip. public bool ShowOnExamineTooltip = true; + public bool HoverVerb = false; // aligned to the left, gives text on hover } /// -- 2.51.2