using Content.Client.UserInterface.Controls; using Content.Shared.RCD; using Content.Shared.RCD.Components; using Robust.Client.AutoGenerated; using Robust.Client.GameObjects; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.XAML; using Robust.Shared.Prototypes; using System.Numerics; namespace Content.Client.RCD; [GenerateTypedNameReferences] public sealed partial class RCDMenu : RadialMenu { [Dependency] private readonly EntityManager _entManager = default!; [Dependency] private readonly IPrototypeManager _protoManager = default!; private readonly SpriteSystem _spriteSystem; public event Action>? SendRCDSystemMessageAction; public RCDMenu(EntityUid owner, RCDMenuBoundUserInterface bui) { IoCManager.InjectDependencies(this); RobustXamlLoader.Load(this); _spriteSystem = _entManager.System(); // Find the main radial container var main = FindControl("Main"); if (main == null) return; // Populate secondary radial containers if (!_entManager.TryGetComponent(owner, out var rcd)) return; foreach (var protoId in rcd.AvailablePrototypes) { if (!_protoManager.TryIndex(protoId, out var proto)) continue; if (proto.Mode == RcdMode.Invalid) continue; var parent = FindControl(proto.Category); if (parent == null) continue; var name = Loc.GetString(proto.SetName); name = char.ToUpper(name[0]) + name.Remove(0, 1); var button = new RCDMenuButton() { StyleClasses = { "RadialMenuButton" }, SetSize = new Vector2(64f, 64f), ToolTip = name, ProtoId = protoId, }; if (proto.Sprite != null) { var tex = new TextureRect() { VerticalAlignment = VAlignment.Center, HorizontalAlignment = HAlignment.Center, Texture = _spriteSystem.Frame0(proto.Sprite), TextureScale = new Vector2(2f, 2f), }; button.AddChild(tex); } parent.AddChild(button); // Ensure that the button that transitions the menu to the associated category layer // is visible in the main radial container (as these all start with Visible = false) foreach (var child in main.Children) { var castChild = child as RadialMenuTextureButton; if (castChild is not RadialMenuTextureButton) continue; if (castChild.TargetLayer == proto.Category) { castChild.Visible = true; break; } } } // Set up menu actions foreach (var child in Children) AddRCDMenuButtonOnClickActions(child); OnChildAdded += AddRCDMenuButtonOnClickActions; SendRCDSystemMessageAction += bui.SendRCDSystemMessage; } private void AddRCDMenuButtonOnClickActions(Control control) { var radialContainer = control as RadialContainer; if (radialContainer == null) return; foreach (var child in radialContainer.Children) { var castChild = child as RCDMenuButton; if (castChild == null) continue; castChild.OnButtonUp += _ => { SendRCDSystemMessageAction?.Invoke(castChild.ProtoId); Close(); }; } } } public sealed class RCDMenuButton : RadialMenuTextureButton { public ProtoId ProtoId { get; set; } public RCDMenuButton() { } }