Replace VerbTypes with verb classes (#6525)
This commit is contained in:
@@ -16,10 +16,10 @@ namespace Content.Client.Verbs
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
SubscribeLocalEvent<GetOtherVerbsEvent>(AddAdminVerbs);
|
||||
SubscribeLocalEvent<GetVerbsEvent<Verb>>(AddAdminVerbs);
|
||||
}
|
||||
|
||||
private void AddAdminVerbs(GetOtherVerbsEvent args)
|
||||
private void AddAdminVerbs(GetVerbsEvent<Verb> args)
|
||||
{
|
||||
// Currently this is only the ViewVariables verb, but more admin-UI related verbs can be added here.
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ namespace Content.Client.Examine
|
||||
{
|
||||
UpdatesOutsidePrediction = true;
|
||||
|
||||
SubscribeLocalEvent<GetOtherVerbsEvent>(AddExamineVerb);
|
||||
SubscribeLocalEvent<GetVerbsEvent<Verb>>(AddExamineVerb);
|
||||
|
||||
CommandBinds.Builder
|
||||
.Bind(ContentKeyFunctions.ExamineEntity, new PointerInputCmdHandler(HandleExamine, outsidePrediction: true))
|
||||
@@ -90,7 +90,7 @@ namespace Content.Client.Examine
|
||||
return true;
|
||||
}
|
||||
|
||||
private void AddExamineVerb(GetOtherVerbsEvent args)
|
||||
private void AddExamineVerb(GetVerbsEvent<Verb> args)
|
||||
{
|
||||
if (!CanExamine(args.User, args.Target))
|
||||
return;
|
||||
|
||||
@@ -7,6 +7,7 @@ using Content.Client.Resources;
|
||||
using Content.Client.Targeting;
|
||||
using Content.Client.UserInterface.Controls;
|
||||
using Content.Client.Verbs.UI;
|
||||
using Content.Shared.Verbs;
|
||||
using Robust.Client.Graphics;
|
||||
using Robust.Client.ResourceManagement;
|
||||
using Robust.Client.UserInterface;
|
||||
@@ -615,16 +616,16 @@ namespace Content.Client.Stylesheets
|
||||
.Prop(Control.StylePropertyModulateSelf, ButtonColorContextDisabled),
|
||||
|
||||
// Context Menu Labels
|
||||
Element<RichTextLabel>().Class(VerbMenuElement.StyleClassVerbInteractionText)
|
||||
Element<RichTextLabel>().Class(InteractionVerb.DefaultTextStyleClass)
|
||||
.Prop(Label.StylePropertyFont, notoSansBoldItalic12),
|
||||
|
||||
Element<RichTextLabel>().Class(VerbMenuElement.StyleClassVerbActivationText)
|
||||
Element<RichTextLabel>().Class(ActivationVerb.DefaultTextStyleClass)
|
||||
.Prop(Label.StylePropertyFont, notoSansBold12),
|
||||
|
||||
Element<RichTextLabel>().Class(VerbMenuElement.StyleClassVerbAlternativeText)
|
||||
Element<RichTextLabel>().Class(AlternativeVerb.DefaultTextStyleClass)
|
||||
.Prop(Label.StylePropertyFont, notoSansItalic12),
|
||||
|
||||
Element<RichTextLabel>().Class(VerbMenuElement.StyleClassVerbOtherText)
|
||||
Element<RichTextLabel>().Class(Verb.DefaultTextStyleClass)
|
||||
.Prop(Label.StylePropertyFont, notoSans12),
|
||||
|
||||
Element<TextureRect>().Class(ContextMenuElement.StyleClassContextMenuExpansionTexture)
|
||||
|
||||
@@ -10,7 +10,6 @@ public partial class ConfirmationMenuElement : ContextMenuElement
|
||||
public const string StyleClassConfirmationContextMenuButton = "confirmationContextMenuButton";
|
||||
|
||||
public readonly Verb Verb;
|
||||
public readonly VerbType Type;
|
||||
|
||||
public override string Text
|
||||
{
|
||||
@@ -23,10 +22,9 @@ public partial class ConfirmationMenuElement : ContextMenuElement
|
||||
}
|
||||
}
|
||||
|
||||
public ConfirmationMenuElement(Verb verb, string? text, VerbType type) : base(text)
|
||||
public ConfirmationMenuElement(Verb verb, string? text) : base(text)
|
||||
{
|
||||
Verb = verb;
|
||||
Type = type;
|
||||
Icon.Visible = false;
|
||||
|
||||
SetOnlyStyleClass(StyleClassConfirmationContextMenuButton);
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
using Content.Client.ContextMenu.UI;
|
||||
using Content.Shared.Verbs;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface.Controls;
|
||||
using Robust.Client.Utility;
|
||||
using Robust.Shared.Utility;
|
||||
using Robust.Shared.GameObjects;
|
||||
using Robust.Shared.IoC;
|
||||
using Robust.Shared.Maths;
|
||||
|
||||
namespace Content.Client.Verbs.UI
|
||||
{
|
||||
@@ -12,10 +15,6 @@ namespace Content.Client.Verbs.UI
|
||||
/// </summary>
|
||||
public partial class VerbMenuElement : ContextMenuElement
|
||||
{
|
||||
public const string StyleClassVerbInteractionText = "InteractionVerb";
|
||||
public const string StyleClassVerbActivationText = "ActivationVerb";
|
||||
public const string StyleClassVerbAlternativeText = "AlternativeVerb";
|
||||
public const string StyleClassVerbOtherText = "OtherVerb";
|
||||
public const string StyleClassVerbMenuConfirmationTexture = "verbMenuConfirmationTexture";
|
||||
|
||||
public const float VerbTooltipDelay = 0.5f;
|
||||
@@ -27,50 +26,37 @@ namespace Content.Client.Verbs.UI
|
||||
// Top quality variable naming
|
||||
public Verb? Verb;
|
||||
|
||||
public VerbType Type;
|
||||
|
||||
public VerbMenuElement(string? text, SpriteSpecifier? icon, VerbType verbType) : base(text)
|
||||
{
|
||||
Icon.AddChild(new TextureRect()
|
||||
{
|
||||
Texture = icon?.Frame0(),
|
||||
Stretch = TextureRect.StretchMode.KeepAspectCentered
|
||||
});
|
||||
|
||||
Type = verbType;
|
||||
|
||||
// Set text font style based on verb type
|
||||
switch (verbType)
|
||||
{
|
||||
case VerbType.Interaction:
|
||||
Label.SetOnlyStyleClass(StyleClassVerbInteractionText);
|
||||
break;
|
||||
case VerbType.Activation:
|
||||
Label.SetOnlyStyleClass(StyleClassVerbActivationText);
|
||||
break;
|
||||
case VerbType.Alternative:
|
||||
Label.SetOnlyStyleClass(StyleClassVerbAlternativeText);
|
||||
break;
|
||||
default:
|
||||
Label.SetOnlyStyleClass(StyleClassVerbOtherText);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public VerbMenuElement(Verb verb, VerbType verbType) : this(verb.Text, verb.Icon, verbType)
|
||||
public VerbMenuElement(Verb verb) : base(verb.Text)
|
||||
{
|
||||
ToolTip = verb.Message;
|
||||
TooltipDelay = VerbTooltipDelay;
|
||||
Disabled = verb.Disabled;
|
||||
Verb = verb;
|
||||
|
||||
Label.SetOnlyStyleClass(verb.TextStyleClass);
|
||||
|
||||
if (verb.ConfirmationPopup)
|
||||
{
|
||||
ExpansionIndicator.SetOnlyStyleClass(StyleClassVerbMenuConfirmationTexture);
|
||||
ExpansionIndicator.Visible = true;
|
||||
}
|
||||
|
||||
Icon.AddChild(new TextureRect()
|
||||
{
|
||||
Texture = verb.Icon?.Frame0(),
|
||||
Stretch = TextureRect.StretchMode.KeepAspectCentered
|
||||
});
|
||||
}
|
||||
|
||||
public VerbMenuElement(VerbCategory category, VerbType verbType) : this(category.Text, category.Icon, verbType) { }
|
||||
public VerbMenuElement(VerbCategory category, string styleClass) : base(category.Text)
|
||||
{
|
||||
Label.SetOnlyStyleClass(styleClass);
|
||||
|
||||
Icon.AddChild(new TextureRect()
|
||||
{
|
||||
Texture = category.Icon?.Frame0(),
|
||||
Stretch = TextureRect.StretchMode.KeepAspectCentered
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Content.Client.ContextMenu.UI;
|
||||
@@ -30,7 +31,7 @@ namespace Content.Client.Verbs.UI
|
||||
private readonly VerbSystem _verbSystem;
|
||||
|
||||
public EntityUid CurrentTarget;
|
||||
public Dictionary<VerbType, SortedSet<Verb>> CurrentVerbs = new();
|
||||
public SortedSet<Verb> CurrentVerbs = new();
|
||||
|
||||
public VerbMenuPresenter(VerbSystem verbSystem)
|
||||
{
|
||||
@@ -51,7 +52,7 @@ namespace Content.Client.Verbs.UI
|
||||
Close();
|
||||
|
||||
CurrentTarget = target;
|
||||
CurrentVerbs = _verbSystem.GetVerbs(target, user, VerbType.All, force);
|
||||
CurrentVerbs = _verbSystem.GetVerbs(target, user, Verb.VerbTypes, force);
|
||||
|
||||
if (!target.IsClientSide())
|
||||
{
|
||||
@@ -73,26 +74,17 @@ namespace Content.Client.Verbs.UI
|
||||
if (RootMenu == null)
|
||||
return;
|
||||
|
||||
// Add verbs to pop-up, grouped by type. Order determined by how types are defined VerbTypes
|
||||
var types = CurrentVerbs.Keys.ToList();
|
||||
types.Sort();
|
||||
foreach (var type in types)
|
||||
HashSet<string> listedCategories = new();
|
||||
foreach (var verb in CurrentVerbs)
|
||||
{
|
||||
if (!CurrentVerbs.TryGetValue(type, out var verbs))
|
||||
continue;
|
||||
|
||||
HashSet<string> listedCategories = new();
|
||||
foreach (var verb in verbs)
|
||||
if (verb.Category == null)
|
||||
{
|
||||
if (verb.Category == null)
|
||||
{
|
||||
var element = new VerbMenuElement(verb, type);
|
||||
AddElement(RootMenu, element);
|
||||
}
|
||||
|
||||
else if (listedCategories.Add(verb.Category.Text))
|
||||
AddVerbCategory(verb.Category, verbs, type);
|
||||
var element = new VerbMenuElement(verb);
|
||||
AddElement(RootMenu, element);
|
||||
}
|
||||
|
||||
else if (listedCategories.Add(verb.Category.Text))
|
||||
AddVerbCategory(verb.Category);
|
||||
}
|
||||
|
||||
RootMenu.InvalidateMeasure();
|
||||
@@ -101,12 +93,12 @@ namespace Content.Client.Verbs.UI
|
||||
/// <summary>
|
||||
/// Add a verb category button to the pop-up
|
||||
/// </summary>
|
||||
public void AddVerbCategory(VerbCategory category, SortedSet<Verb> verbs, VerbType type)
|
||||
public void AddVerbCategory(VerbCategory category)
|
||||
{
|
||||
// Get a list of the verbs in this category
|
||||
List<Verb> verbsInCategory = new();
|
||||
var drawIcons = false;
|
||||
foreach (var verb in verbs)
|
||||
foreach (var verb in CurrentVerbs)
|
||||
{
|
||||
if (verb.Category?.Text == category.Text)
|
||||
{
|
||||
@@ -118,14 +110,14 @@ namespace Content.Client.Verbs.UI
|
||||
if (verbsInCategory.Count == 0)
|
||||
return;
|
||||
|
||||
var element = new VerbMenuElement(category, type);
|
||||
var element = new VerbMenuElement(category, verbsInCategory[0].TextStyleClass);
|
||||
AddElement(RootMenu, element);
|
||||
|
||||
// Create the pop-up that appears when hovering over this element
|
||||
element.SubMenu = new ContextMenuPopup(this, element);
|
||||
foreach (var verb in verbsInCategory)
|
||||
{
|
||||
var subElement = new VerbMenuElement(verb, type)
|
||||
var subElement = new VerbMenuElement(verb)
|
||||
{
|
||||
IconVisible = drawIcons,
|
||||
TextVisible = !category.IconsOnly
|
||||
@@ -140,7 +132,7 @@ namespace Content.Client.Verbs.UI
|
||||
/// <summary>
|
||||
/// Add verbs from the server to <see cref="CurrentVerbs"/> and update the verb menu.
|
||||
/// </summary>
|
||||
public void AddServerVerbs(Dictionary<VerbType, List<Verb>>? verbs)
|
||||
public void AddServerVerbs(List<Verb>? verbs)
|
||||
{
|
||||
RootMenu.MenuBody.DisposeAllChildren();
|
||||
|
||||
@@ -152,15 +144,7 @@ namespace Content.Client.Verbs.UI
|
||||
return;
|
||||
}
|
||||
|
||||
// Add the new server-side verbs.
|
||||
foreach (var (verbType, verbSet) in verbs)
|
||||
{
|
||||
if (!CurrentVerbs.TryAdd(verbType, new SortedSet<Verb>(verbSet)))
|
||||
{
|
||||
CurrentVerbs[verbType].UnionWith(verbSet);
|
||||
}
|
||||
}
|
||||
|
||||
CurrentVerbs.UnionWith(verbs);
|
||||
FillVerbPopup();
|
||||
}
|
||||
|
||||
@@ -175,7 +159,7 @@ namespace Content.Client.Verbs.UI
|
||||
return;
|
||||
|
||||
args.Handle();
|
||||
ExecuteVerb(confElement.Verb, confElement.Type);
|
||||
ExecuteVerb(confElement.Verb);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -208,7 +192,7 @@ namespace Content.Client.Verbs.UI
|
||||
{
|
||||
if (verbElement.SubMenu == null)
|
||||
{
|
||||
var popupElement = new ConfirmationMenuElement(verb, "Confirm", verbElement.Type);
|
||||
var popupElement = new ConfirmationMenuElement(verb, "Confirm");
|
||||
verbElement.SubMenu = new ContextMenuPopup(this, verbElement);
|
||||
AddElement(verbElement.SubMenu, popupElement);
|
||||
}
|
||||
@@ -217,13 +201,13 @@ namespace Content.Client.Verbs.UI
|
||||
}
|
||||
else
|
||||
{
|
||||
ExecuteVerb(verb, verbElement.Type);
|
||||
ExecuteVerb(verb);
|
||||
}
|
||||
}
|
||||
|
||||
private void ExecuteVerb(Verb verb, VerbType verbType)
|
||||
private void ExecuteVerb(Verb verb)
|
||||
{
|
||||
_verbSystem.ExecuteVerb(CurrentTarget, verb, verbType);
|
||||
_verbSystem.ExecuteVerb(CurrentTarget, verb);
|
||||
if (verb.CloseMenu)
|
||||
_verbSystem.CloseAllMenus();
|
||||
}
|
||||
|
||||
@@ -181,7 +181,7 @@ namespace Content.Client.Verbs
|
||||
/// Ask the server to send back a list of server-side verbs, and for now return an incomplete list of verbs
|
||||
/// (only those defined locally).
|
||||
/// </summary>
|
||||
public Dictionary<VerbType, SortedSet<Verb>> GetVerbs(EntityUid target, EntityUid user, VerbType verbTypes,
|
||||
public SortedSet<Verb> GetVerbs(EntityUid target, EntityUid user, List<Type> verbTypes,
|
||||
bool force = false)
|
||||
{
|
||||
if (!target.IsClientSide())
|
||||
@@ -198,7 +198,7 @@ namespace Content.Client.Verbs
|
||||
/// <remarks>
|
||||
/// Unless this is a client-exclusive verb, this will also tell the server to run the same verb.
|
||||
/// </remarks>
|
||||
public void ExecuteVerb(EntityUid target, Verb verb, VerbType verbType)
|
||||
public void ExecuteVerb(EntityUid target, Verb verb)
|
||||
{
|
||||
var user = _playerManager.LocalPlayer?.ControlledEntity;
|
||||
if (user == null)
|
||||
@@ -218,10 +218,10 @@ namespace Content.Client.Verbs
|
||||
// is this a client exclusive (gui) verb?
|
||||
ExecuteVerb(verb, user.Value, target);
|
||||
else
|
||||
EntityManager.RaisePredictiveEvent(new ExecuteVerbEvent(target, verb, verbType));
|
||||
EntityManager.RaisePredictiveEvent(new ExecuteVerbEvent(target, verb));
|
||||
}
|
||||
|
||||
public override void ExecuteVerb(Verb verb, EntityUid user, EntityUid target, bool forced = false)
|
||||
public override void ExecuteVerb(Verb verb, EntityUid user, EntityUid target, bool forced = false)
|
||||
{
|
||||
// invoke any relevant actions
|
||||
verb.Act?.Invoke();
|
||||
|
||||
Reference in New Issue
Block a user