diff --git a/Content.Client/Inventory/StrippableBoundUserInterface.cs b/Content.Client/Inventory/StrippableBoundUserInterface.cs index 295d4848e5..a9a937d5d8 100644 --- a/Content.Client/Inventory/StrippableBoundUserInterface.cs +++ b/Content.Client/Inventory/StrippableBoundUserInterface.cs @@ -50,6 +50,18 @@ namespace Content.Client.Inventory [ViewVariables] private readonly EntityUid _virtualHiddenEntity; + /// + /// The current amount of added hand buttons. + /// + [ViewVariables] + private int _handCount; + + /// + /// The current shape of the inventory, needed to calculate the window size. + /// + [ViewVariables] + private Vector2i _inventoryDimensions; + public StrippableBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) { _examine = EntMan.System(); @@ -93,6 +105,8 @@ namespace Content.Client.Inventory return; _strippingMenu.ClearButtons(); + _handCount = 0; + _inventoryDimensions = Vector2i.Zero; if (EntMan.TryGetComponent(Owner, out var inv)) { @@ -152,9 +166,15 @@ namespace Content.Client.Inventory // TODO allow windows to resize based on content's desired size // for now: shit-code - // this breaks for drones (too many hands, lots of empty vertical space), and looks shit for monkeys and the like. - // but the window is realizable, so eh. - _strippingMenu.SetSize = new Vector2(220, snare?.IsEnsnared == true ? 550 : 530); + // calculate the window size manually + // +20 horizontally and vertically from the ContentsContainer margin + // +16 vertically from the BoxContainer margin + // +27 vertically from the window header + var horizontalMenuSize = Math.Max(200, Math.Max(_handCount, _inventoryDimensions.X + 1) * (SlotControl.DefaultButtonSize + ButtonSeparation) + 20); + var verticalMenuSize = Math.Max(200, (_inventoryDimensions.Y + (_handCount > 0 ? 2 : 1)) * (SlotControl.DefaultButtonSize + ButtonSeparation) + 53); + if (snare?.IsEnsnared == true) + verticalMenuSize += 20; + _strippingMenu.SetSize = new Vector2(horizontalMenuSize, verticalMenuSize); } private void AddHandButton(Hand hand) @@ -172,6 +192,8 @@ namespace Content.Client.Inventory UpdateEntityIcon(button, hand.HeldEntity); _strippingMenu!.HandsContainer.AddChild(button); + LayoutContainer.SetPosition(button, new Vector2i(_handCount, 0) * (SlotControl.DefaultButtonSize + ButtonSeparation)); + _handCount++; } private void SlotPressed(GUIBoundKeyEventArgs ev, SlotControl slot) @@ -220,6 +242,10 @@ namespace Content.Client.Inventory UpdateEntityIcon(button, entity); LayoutContainer.SetPosition(button, slotDef.StrippingWindowPos * (SlotControl.DefaultButtonSize + ButtonSeparation)); + if (slotDef.StrippingWindowPos.X > _inventoryDimensions.X) + _inventoryDimensions = new Vector2i(slotDef.StrippingWindowPos.X, _inventoryDimensions.Y); + if (slotDef.StrippingWindowPos.Y > _inventoryDimensions.Y) + _inventoryDimensions = new Vector2i(_inventoryDimensions.X, slotDef.StrippingWindowPos.Y); } private void UpdateEntityIcon(SlotControl button, EntityUid? entity) diff --git a/Content.Client/Strip/StrippingMenu.cs b/Content.Client/Strip/StrippingMenu.cs index 1c46b4be35..531e5fb44d 100644 --- a/Content.Client/Strip/StrippingMenu.cs +++ b/Content.Client/Strip/StrippingMenu.cs @@ -8,7 +8,7 @@ namespace Content.Client.Strip public sealed class StrippingMenu : DefaultWindow { public LayoutContainer InventoryContainer = new(); - public BoxContainer HandsContainer = new() { Orientation = LayoutOrientation.Horizontal }; + public LayoutContainer HandsContainer = new(); public BoxContainer SnareContainer = new(); public bool Dirty = true;