using System.Numerics; using Content.Client.Cooldown; using Content.Client.UserInterface.Systems.Inventory.Controls; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Shared.Input; namespace Content.Client.UserInterface.Controls { [Virtual] public abstract class SlotControl : Control, IEntityControl { public static int DefaultButtonSize = 64; public TextureRect ButtonRect { get; } public TextureRect BlockedRect { get; } public TextureRect HighlightRect { get; } public SpriteView SpriteView { get; } public SpriteView HoverSpriteView { get; } public TextureButton StorageButton { get; } public CooldownGraphic CooldownDisplay { get; } public EntityUid? Entity => SpriteView.Entity; private bool _slotNameSet; private string _slotName = ""; public string SlotName { get => _slotName; set { //this auto registers the button with it's parent container when it's set if (_slotNameSet) { Logger.Warning("Tried to set slotName after init for:" + Name); return; } _slotNameSet = true; if (Parent is IItemslotUIContainer container) { container.TryRegisterButton(this, value); } Name = "SlotButton_" + value; _slotName = value; } } public bool Highlight { get => HighlightRect.Visible; set => HighlightRect.Visible = value;} public bool Blocked { get => BlockedRect.Visible; set => BlockedRect.Visible = value;} private string? _blockedTexturePath; public string? BlockedTexturePath { get => _blockedTexturePath; set { _blockedTexturePath = value; BlockedRect.Texture = Theme.ResolveTextureOrNull(_blockedTexturePath)?.Texture; } } private string? _buttonTexturePath; public string? ButtonTexturePath { get => _buttonTexturePath; set { _buttonTexturePath = value; ButtonRect.Texture = Theme.ResolveTextureOrNull(_buttonTexturePath)?.Texture; } } private string? _storageTexturePath; public string? StorageTexturePath { get => _buttonTexturePath; set { _storageTexturePath = value; StorageButton.TextureNormal = Theme.ResolveTextureOrNull(_storageTexturePath)?.Texture; } } private string? _highlightTexturePath; public string? HighlightTexturePath { get => _highlightTexturePath; set { _highlightTexturePath = value; HighlightRect.Texture = Theme.ResolveTextureOrNull(_highlightTexturePath)?.Texture; } } public event Action? Pressed; public event Action? Unpressed; public event Action? StoragePressed; public event Action? Hover; public bool EntityHover => HoverSpriteView.Sprite != null; public bool MouseIsHovering; public SlotControl() { IoCManager.InjectDependencies(this); Name = "SlotButton_null"; MinSize = new Vector2(DefaultButtonSize, DefaultButtonSize); AddChild(ButtonRect = new TextureRect { TextureScale = new Vector2(2, 2), MouseFilter = MouseFilterMode.Stop }); AddChild(HighlightRect = new TextureRect { Visible = false, TextureScale = new Vector2(2, 2), MouseFilter = MouseFilterMode.Ignore }); ButtonRect.OnKeyBindDown += OnButtonPressed; ButtonRect.OnKeyBindUp += OnButtonUnpressed; AddChild(SpriteView = new SpriteView { Scale = new Vector2(2, 2), SetSize = new Vector2(DefaultButtonSize, DefaultButtonSize), OverrideDirection = Direction.South }); AddChild(HoverSpriteView = new SpriteView { Scale = new Vector2(2, 2), SetSize = new Vector2(DefaultButtonSize, DefaultButtonSize), OverrideDirection = Direction.South }); AddChild(StorageButton = new TextureButton { Scale = new Vector2(0.75f, 0.75f), HorizontalAlignment = HAlignment.Right, VerticalAlignment = VAlignment.Bottom, Visible = false, }); StorageButton.OnKeyBindDown += args => { if (args.Function != EngineKeyFunctions.UIClick) { OnButtonPressed(args); } }; StorageButton.OnPressed += OnStorageButtonPressed; ButtonRect.OnMouseEntered += _ => { MouseIsHovering = true; }; ButtonRect.OnMouseEntered += OnButtonHover; ButtonRect.OnMouseExited += _ => { MouseIsHovering = false; ClearHover(); }; AddChild(CooldownDisplay = new CooldownGraphic { Visible = false, }); AddChild(BlockedRect = new TextureRect { TextureScale = new Vector2(2, 2), MouseFilter = MouseFilterMode.Stop, Visible = false }); HighlightTexturePath = "slot_highlight"; BlockedTexturePath = "blocked"; } public void ClearHover() { if (!EntityHover) return; var tempQualifier = HoverSpriteView.Entity; if (tempQualifier != null) { IoCManager.Resolve().QueueDeleteEntity(tempQualifier); } HoverSpriteView.SetEntity(null); } private void OnButtonPressed(GUIBoundKeyEventArgs args) { Pressed?.Invoke(args, this); } private void OnButtonUnpressed(GUIBoundKeyEventArgs args) { Unpressed?.Invoke(args, this); } private void OnStorageButtonPressed(BaseButton.ButtonEventArgs args) { if (args.Event.Function == EngineKeyFunctions.UIClick) { StoragePressed?.Invoke(args.Event, this); } else { Pressed?.Invoke(args.Event, this); } } private void OnButtonHover(GUIMouseHoverEventArgs args) { Hover?.Invoke(args, this); } protected override void OnThemeUpdated() { base.OnThemeUpdated(); StorageButton.TextureNormal = Theme.ResolveTextureOrNull(_storageTexturePath)?.Texture; ButtonRect.Texture = Theme.ResolveTextureOrNull(_buttonTexturePath)?.Texture; HighlightRect.Texture = Theme.ResolveTextureOrNull(_highlightTexturePath)?.Texture; } EntityUid? IEntityControl.UiEntity => Entity; } }