diff --git a/Intersect.Client.Core/Interface/Game/Bag/BagItem.cs b/Intersect.Client.Core/Interface/Game/Bag/BagItem.cs index ec4631feb1..57bb708ab8 100644 --- a/Intersect.Client.Core/Interface/Game/Bag/BagItem.cs +++ b/Intersect.Client.Core/Interface/Game/Bag/BagItem.cs @@ -81,7 +81,10 @@ public override void OpenContextMenu() return; } + // Clear the context menu and add the withdraw item with updated item name + _contextMenu.ClearChildren(); _withdrawContextItem.SetText(Strings.BagContextMenu.Withdraw.ToString(item.Name)); + _contextMenu.AddChild(_withdrawContextItem); base.OpenContextMenu(); } diff --git a/Intersect.Client.Core/Interface/Game/Bank/BankItem.cs b/Intersect.Client.Core/Interface/Game/Bank/BankItem.cs index 7953e12fe1..fb4f9a4fb9 100644 --- a/Intersect.Client.Core/Interface/Game/Bank/BankItem.cs +++ b/Intersect.Client.Core/Interface/Game/Bank/BankItem.cs @@ -1,4 +1,7 @@ +using Intersect.Client.Core; +using Intersect.Client.Framework.File_Management; using Intersect.Client.Framework.GenericClasses; +using Intersect.Client.Framework.Gwen; using Intersect.Client.Framework.Gwen.Control; using Intersect.Client.Framework.Gwen.Control.EventArguments; using Intersect.Client.Framework.Gwen.Input; @@ -13,234 +16,291 @@ using Intersect.Enums; using Intersect.Framework.Core; using Intersect.Framework.Core.GameObjects.Items; -using Intersect.GameObjects; -using Intersect.Utilities; namespace Intersect.Client.Interface.Game.Bank; - -public partial class BankItem +public partial class BankItem : SlotItem { + // Controls + private readonly Label _quantityLabel; + private BankWindow _bankWindow; + private Draggable? _dragIcon; + private ItemDescriptionWindow? _descWindow; - private static int sItemXPadding = 4; - - private static int sItemYPadding = 4; - - public ImagePanel Container; - + // Drag Handling public bool IsDragging; + private bool _canDrag; + private long _clickTime; + private bool _mouseOver; + private int _mouseX = -1; + private int _mouseY = -1; - //Drag/Drop References - private BankWindow mBankWindow; + // Data control + private string? _textureLoaded; - //Dragging - private bool mCanDrag; + // Context Menu Handling + private MenuItem _withdrawContextItem; - private long mClickTime; + public BankItem(BankWindow bankWindow, Base parent, int index, ContextMenu contextMenu) : + base(parent, nameof(BankItem), index, contextMenu) + { + _bankWindow = bankWindow; + TextureFilename = "bankitem.png"; - private Guid mCurrentItemId; + _iconImage.HoverEnter += _iconImage_HoverEnter; + _iconImage.HoverLeave += _iconImage_HoverLeave; + _iconImage.Clicked += _iconImage_Clicked; + _iconImage.DoubleClicked += _iconImage_DoubleClicked; - private ItemDescriptionWindow mDescWindow; + _quantityLabel = new Label(this, "Quantity") + { + Alignment = [Alignments.Bottom, Alignments.Right], + BackgroundTemplateName = "quantity.png", + FontName = "sourcesansproblack", + FontSize = 8, + Padding = new Padding(2), + }; - private Draggable mDragIcon; + LoadJsonUi(GameContentManager.UI.InGame, Graphics.Renderer.GetResolutionString()); - //Mouse Event Variables - private bool mMouseOver; + _contextMenu.ClearChildren(); + _withdrawContextItem = _contextMenu.AddItem(Strings.BankContextMenu.Withdraw); + _withdrawContextItem.Clicked += _withdrawMenuItem_Clicked; + _contextMenu.LoadJsonUi(GameContentManager.UI.InGame, Graphics.Renderer.GetResolutionString()); + } - private int mMouseX = -1; + public void OpenContextMenu() + { + if (Globals.BankSlots is not { Length: > 0 } bankSlots) + { + return; + } - private int mMouseY = -1; + if (!ItemDescriptor.TryGet(bankSlots[SlotIndex].ItemId, out var item)) + { + return; + } - //Slot info - private int mMySlot; + // Clear the context menu and add the withdraw item with updated item name + _contextMenu.ClearChildren(); + _withdrawContextItem.SetText(Strings.BankContextMenu.Withdraw.ToString(item.Name)); + _contextMenu.AddChild(_withdrawContextItem); - public ImagePanel Pnl; + base.OpenContextMenu(); + } - public BankItem(BankWindow bankWindow, int index) + private void _withdrawMenuItem_Clicked(Base sender, MouseButtonState arguments) { - mBankWindow = bankWindow; - mMySlot = index; + Globals.Me?.TryRetrieveItemFromBank(SlotIndex); } - public void Setup() + #region Mouse Events + + private void _iconImage_HoverEnter(Base? sender, EventArgs? arguments) { - Pnl = new ImagePanel(Container, "BankItemIcon"); - Pnl.HoverEnter += pnl_HoverEnter; - Pnl.HoverLeave += pnl_HoverLeave; - Pnl.DoubleClicked += Pnl_DoubleClicked; - Pnl.Clicked += pnl_Clicked; + if (InputHandler.MouseFocus != null) + { + return; + } + + _mouseOver = true; + _canDrag = true; + + if (Globals.InputManager.IsMouseButtonDown(MouseButton.Left)) + { + _canDrag = false; + return; + } + + if (_descWindow != null) + { + _descWindow.Dispose(); + _descWindow = null; + } + + if (Globals.BankSlots is not { Length: > 0 } bankSlots) + { + return; + } + + if (bankSlots[SlotIndex] is not { Descriptor: not null } or { Quantity: <= 0 }) + { + return; + } + + var item = bankSlots[SlotIndex]; + _descWindow = new ItemDescriptionWindow( + item.Descriptor, + item.Quantity, + _bankWindow.X, + _bankWindow.Y, + item.ItemProperties + ); } - private void Pnl_DoubleClicked(Base sender, MouseButtonState arguments) + private void _iconImage_HoverLeave(Base sender, EventArgs arguments) { - if (Globals.InBank) + _mouseOver = false; + _mouseX = -1; + _mouseY = -1; + + if (_descWindow != null) { - if (Globals.InputManager.IsKeyDown(Keys.Shift)) - { - Globals.Me.TryRetrieveItemFromBank( - mMySlot, - skipPrompt: true - ); - } - else - { - var slot = Globals.BankSlots[mMySlot]; - Globals.Me.TryRetrieveItemFromBank( - mMySlot, - slot, - quantityHint: slot.Quantity, - skipPrompt: false - ); - } + _descWindow.Dispose(); + _descWindow = null; } } - void pnl_Clicked(Base sender, MouseButtonState arguments) + private void _iconImage_Clicked(Base sender, MouseButtonState arguments) { switch (arguments.MouseButton) { case MouseButton.Left: - mClickTime = Timing.Global.MillisecondsUtc + 500; + _clickTime = Timing.Global.MillisecondsUtc + 500; break; case MouseButton.Right: if (ClientConfiguration.Instance.EnableContextMenus) { - mBankWindow.OpenContextMenu(mMySlot); + OpenContextMenu(); } else { - Pnl_DoubleClicked(sender, arguments); + _iconImage_DoubleClicked(sender, arguments); } break; } } - void pnl_HoverLeave(Base sender, EventArgs arguments) + private void _iconImage_DoubleClicked(Base sender, MouseButtonState arguments) { - mMouseOver = false; - mMouseX = -1; - mMouseY = -1; - if (mDescWindow != null) + if (!Globals.InBank) { - mDescWindow.Dispose(); - mDescWindow = null; + return; } - } - void pnl_HoverEnter(Base sender, EventArgs arguments) - { - if (InputHandler.MouseFocus != null) + if (Globals.BankSlots is not { Length: > 0 } bankSlots) { return; } - mMouseOver = true; - mCanDrag = true; - if (Globals.InputManager.IsMouseButtonDown(MouseButton.Left)) + if (bankSlots[SlotIndex] is not { Quantity: > 0 } slot) { - mCanDrag = false; - return; } - if (mDescWindow != null) + if (Globals.InputManager.IsKeyDown(Keys.Shift)) { - mDescWindow.Dispose(); - mDescWindow = null; + Globals.Me?.TryRetrieveItemFromBank(SlotIndex, skipPrompt: true); } - - if (Globals.BankSlots[mMySlot]?.Descriptor != null) + else { - mDescWindow = new ItemDescriptionWindow( - Globals.BankSlots[mMySlot].Descriptor, Globals.BankSlots[mMySlot].Quantity, mBankWindow.X, mBankWindow.Y, - Globals.BankSlots[mMySlot].ItemProperties + Globals.Me?.TryRetrieveItemFromBank( + SlotIndex, + slot, + quantityHint: slot.Quantity, + skipPrompt: false ); } } - public FloatRect RenderBounds() + #endregion + + public new void Update() { - var rect = new FloatRect() + if (Globals.Me == default) { - X = Pnl.ToCanvas(new Point(0, 0)).X, - Y = Pnl.ToCanvas(new Point(0, 0)).Y, - Width = Pnl.Width, - Height = Pnl.Height - }; + return; + } - return rect; - } + if (Globals.BankSlots is not { Length: > 0 } bankSlots) + { + return; + } - public void Update() - { - if (Globals.BankSlots[mMySlot].ItemId != mCurrentItemId) + if (bankSlots[SlotIndex] is not { Descriptor: not null } or { Quantity: <= 0 }) + { + _quantityLabel.IsVisibleInParent = false; + _iconImage.Texture = default; + _textureLoaded = default; + return; + } + + var bankSlot = bankSlots[SlotIndex]; + var descriptor = bankSlot.Descriptor; + + _quantityLabel.IsVisibleInParent = !IsDragging && descriptor.IsStackable && bankSlot.Quantity > 1; + if (_quantityLabel.IsVisibleInParent) + { + _quantityLabel.Text = Strings.FormatQuantityAbbreviated(bankSlot.Quantity); + } + + if (_textureLoaded != descriptor.Icon) { - mCurrentItemId = Globals.BankSlots[mMySlot].ItemId; - var item = ItemDescriptor.Get(Globals.BankSlots[mMySlot].ItemId); - if (item != null) + var itemTex = Globals.ContentManager?.GetTexture(Framework.Content.TextureType.Item, descriptor.Icon); + if (itemTex != default) { - var itemTex = Globals.ContentManager.GetTexture(Framework.Content.TextureType.Item, item.Icon); - if (itemTex != null) - { - Pnl.Texture = itemTex; - Pnl.RenderColor = item.Color; - } - else - { - if (Pnl.Texture != null) - { - Pnl.Texture = null; - } - } + _iconImage.Texture = itemTex; + _iconImage.RenderColor = descriptor.Color; + _iconImage.IsVisibleInParent = true; } else { - if (Pnl.Texture != null) + if (_iconImage.Texture != default) { - Pnl.Texture = null; + _iconImage.Texture = default; + _iconImage.IsVisibleInParent = false; } } + + _textureLoaded = descriptor.Icon; + + if (_descWindow != default) + { + _descWindow.Dispose(); + _descWindow = default; + _iconImage_HoverEnter(default, default); + } } if (!IsDragging) { - if (mMouseOver) + if (_mouseOver) { if (!Globals.InputManager.IsMouseButtonDown(MouseButton.Left)) { - mCanDrag = true; - mMouseX = -1; - mMouseY = -1; - if (Timing.Global.MillisecondsUtc < mClickTime) + _canDrag = true; + _mouseX = -1; + _mouseY = -1; + if (Timing.Global.MillisecondsUtc < _clickTime) { //Globals.Me.TryUseItem(_mySlot); - mClickTime = 0; + _clickTime = 0; } } else { - if (mCanDrag && Draggable.Active == null) + if (_canDrag && Draggable.Active == null) { - if (mMouseX == -1 || mMouseY == -1) + if (_mouseX == -1 || _mouseY == -1) { - mMouseX = InputHandler.MousePosition.X - Pnl.ToCanvas(new Point(0, 0)).X; - mMouseY = InputHandler.MousePosition.Y - Pnl.ToCanvas(new Point(0, 0)).Y; + _mouseX = InputHandler.MousePosition.X - _iconImage.ToCanvas(new Point(0, 0)).X; + _mouseY = InputHandler.MousePosition.Y - _iconImage.ToCanvas(new Point(0, 0)).Y; } else { - var xdiff = mMouseX - - (InputHandler.MousePosition.X - Pnl.ToCanvas(new Point(0, 0)).X); + var xdiff = _mouseX - + (InputHandler.MousePosition.X - _iconImage.ToCanvas(new Point(0, 0)).X); - var ydiff = mMouseY - - (InputHandler.MousePosition.Y - Pnl.ToCanvas(new Point(0, 0)).Y); + var ydiff = _mouseY - + (InputHandler.MousePosition.Y - _iconImage.ToCanvas(new Point(0, 0)).Y); if (Math.Sqrt(Math.Pow(xdiff, 2) + Math.Pow(ydiff, 2)) > 5) { IsDragging = true; - mDragIcon = new Draggable( - Pnl.ToCanvas(new Point(0, 0)).X + mMouseX, - Pnl.ToCanvas(new Point(0, 0)).X + mMouseY, Pnl.Texture, Pnl.RenderColor + _dragIcon = new Draggable( + _iconImage.ToCanvas(new Point(0, 0)).X + _mouseX, + _iconImage.ToCanvas(new Point(0, 0)).X + _mouseY, _iconImage.Texture, _iconImage.RenderColor ); } } @@ -248,28 +308,32 @@ public void Update() } } } - else if (mDragIcon.Update()) + else if (_dragIcon?.Update() == true) { //Drug the item and now we stopped IsDragging = false; var dragRect = new FloatRect( - mDragIcon.X - sItemXPadding / 2, - mDragIcon.Y - sItemYPadding / 2, - sItemXPadding / 2 + 32, - sItemYPadding / 2 + 32 + _dragIcon.X - (Padding.Left + Padding.Right) / 2f, + _dragIcon.Y - (Padding.Top + Padding.Bottom) / 2f, + (Padding.Left + Padding.Right) / 2f + _iconImage.Width, + (Padding.Top + Padding.Bottom) / 2f + _iconImage.Height ); float bestIntersect = 0; var bestIntersectIndex = -1; // So we picked up an item and then dropped it. Lets see where we dropped it to. - if (mBankWindow.RenderBounds().IntersectsWith(dragRect)) + if (_bankWindow.RenderBounds().IntersectsWith(dragRect)) { - var bankSlotComponents = mBankWindow.Items.ToArray(); + var bankSlotComponents = _bankWindow.Items.ToArray(); var bankSlotLimit = Math.Min(Globals.BankSlotCount, bankSlotComponents.Length); for (var bankSlotIndex = 0; bankSlotIndex < bankSlotLimit; bankSlotIndex++) { - var bankSlotComponent = bankSlotComponents[bankSlotIndex]; + if (bankSlotComponents[bankSlotIndex] is not BankItem bankSlotComponent) + { + continue; + } + var bankSlotRenderBounds = bankSlotComponent.RenderBounds(); if (!bankSlotRenderBounds.IntersectsWith(dragRect)) { @@ -288,7 +352,7 @@ public void Update() if (bestIntersectIndex > -1) { - if (mMySlot != bestIntersectIndex) + if (SlotIndex != bestIntersectIndex) { var allowed = true; @@ -297,7 +361,7 @@ public void Update() { var rank = Globals.Me.GuildRank; if (string.IsNullOrWhiteSpace(Globals.Me.Guild) || - (!rank.Permissions.BankDeposit && Globals.Me.Rank != 0)) + (rank?.Permissions.BankDeposit == false && Globals.Me.Rank != 0)) { ChatboxMsg.AddMessage( new ChatboxMsg( @@ -312,10 +376,8 @@ public void Update() if (allowed) { - PacketSender.SendMoveBankItems(mMySlot, bestIntersectIndex); + PacketSender.SendMoveBankItems(SlotIndex, bestIntersectIndex); } - - //Globals.Me.SwapItems(bestIntersectIndex, _mySlot); } } } @@ -354,9 +416,9 @@ public void Update() if (bestIntersectIndex > -1) { - var slot = Globals.BankSlots[mMySlot]; - Globals.Me.TryRetrieveItemFromBank( - mMySlot, + var slot = Globals.BankSlots[SlotIndex]; + Globals.Me?.TryRetrieveItemFromBank( + SlotIndex, inventorySlotIndex: bestIntersectIndex, quantityHint: slot.Quantity, skipPrompt: true @@ -365,8 +427,20 @@ public void Update() } } - mDragIcon.Dispose(); + _dragIcon.Dispose(); } } + public FloatRect RenderBounds() + { + var rect = new FloatRect() + { + X = _iconImage.ToCanvas(new Point(0, 0)).X, + Y = _iconImage.ToCanvas(new Point(0, 0)).Y, + Width = _iconImage.Width, + Height = _iconImage.Height + }; + + return rect; + } } diff --git a/Intersect.Client.Core/Interface/Game/Bank/BankWindow.cs b/Intersect.Client.Core/Interface/Game/Bank/BankWindow.cs index 16b0b6bf24..8b77f1add4 100644 --- a/Intersect.Client.Core/Interface/Game/Bank/BankWindow.cs +++ b/Intersect.Client.Core/Interface/Game/Bank/BankWindow.cs @@ -1,253 +1,105 @@ using Intersect.Client.Core; using Intersect.Client.Framework.File_Management; using Intersect.Client.Framework.GenericClasses; +using Intersect.Client.Framework.Gwen; using Intersect.Client.Framework.Gwen.Control; using Intersect.Client.General; using Intersect.Client.Localization; -using Intersect.Framework.Core.GameObjects.Items; -using Intersect.GameObjects; +using Intersect.Client.Utilities; namespace Intersect.Client.Interface.Game.Bank; - -public partial class BankWindow +public partial class BankWindow : Window { - - private static int sItemXPadding = 4; - - private static int sItemYPadding = 4; - - public List Items = new List(); - - //Controls - private WindowControl mBankWindow; - - private ScrollControl mItemContainer; - - private List