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