private void CreateMenu()
{
- _menu = this.CreateWindow<PdaMenu>();
- _menu.OpenCenteredLeft();
+ _menu = this.CreateWindowCenteredLeft<PdaMenu>();
_menu.FlashLightToggleButton.OnToggled += _ =>
{
+using System.Numerics;
using Content.Client.UserInterface.Systems.Storage;
using Content.Client.UserInterface.Systems.Storage.Controls;
using Content.Shared.Storage;
using JetBrains.Annotations;
using Robust.Client.UserInterface;
+using Robust.Client.UserInterface.Controls;
namespace Content.Client.Storage;
{
private StorageWindow? _window;
+ public Vector2? Position => _window?.Position;
+
public StorageBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
{
}
_window = IoCManager.Resolve<IUserInterfaceManager>()
.GetUIController<StorageUIController>()
- .CreateStorageWindow(Owner);
+ .CreateStorageWindow(this);
if (EntMan.TryGetComponent(Owner, out StorageComponent? storage))
{
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
-
Reclaim();
}
+ public void CloseWindow(Vector2 position)
+ {
+ if (_window == null)
+ return;
+
+ // Update its position before potentially saving.
+ // Listen it makes sense okay.
+ LayoutContainer.SetPosition(_window, position);
+ _window?.Close();
+ }
+
public void Hide()
{
if (_window == null)
_window.Visible = true;
}
+ public void Show(Vector2 position)
+ {
+ if (_window == null)
+ return;
+
+ Show();
+ LayoutContainer.SetPosition(_window, position);
+ }
+
public void ReOpen()
{
_window?.Orphan();
private Dictionary<EntityUid, ItemStorageLocation> _oldStoredItems = new();
+ private List<(StorageBoundUserInterface Bui, bool Value)> _queuedBuis = new();
+
public override void Initialize()
{
base.Initialize();
if (NestedStorage && player != null && ContainerSystem.TryGetContainingContainer((uid, null, null), out var container) &&
UI.TryGetOpenUi<StorageBoundUserInterface>(container.Owner, StorageComponent.StorageUiKey.Key, out var containerBui))
{
- containerBui.Hide();
+ _queuedBuis.Add((containerBui, false));
}
}
}
{
if (UI.TryGetOpenUi<StorageBoundUserInterface>(uid, StorageComponent.StorageUiKey.Key, out var storageBui))
{
- storageBui.Hide();
+ _queuedBuis.Add((storageBui, false));
}
}
{
if (UI.TryGetOpenUi<StorageBoundUserInterface>(uid, StorageComponent.StorageUiKey.Key, out var storageBui))
{
- storageBui.Show();
+ _queuedBuis.Add((storageBui, true));
}
}
}
}
}
+
+ public override void Update(float frameTime)
+ {
+ base.Update(frameTime);
+
+ if (!_timing.IsFirstTimePredicted)
+ {
+ return;
+ }
+
+ // This update loop exists just to synchronize with UISystem and avoid 1-tick delays.
+ // If deferred opens / closes ever get removed you can dump this.
+ foreach (var (bui, open) in _queuedBuis)
+ {
+ if (open)
+ {
+ bui.Show();
+ }
+ else
+ {
+ bui.Hide();
+ }
+ }
+
+ _queuedBuis.Clear();
+ }
}
using Content.Shared.Input;
using Content.Shared.Item;
using Content.Shared.Storage;
+using Robust.Client.GameObjects;
using Robust.Client.Graphics;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls;
BuildGridRepresentation();
}
+ private void CloseParent()
+ {
+ if (StorageEntity == null)
+ return;
+
+ var containerSystem = _entity.System<SharedContainerSystem>();
+ var uiSystem = _entity.System<UserInterfaceSystem>();
+
+ if (containerSystem.TryGetContainingContainer(StorageEntity.Value, out var container) &&
+ _entity.TryGetComponent(container.Owner, out StorageComponent? storage) &&
+ storage.Container.Contains(StorageEntity.Value) &&
+ uiSystem
+ .TryGetOpenUi<StorageBoundUserInterface>(container.Owner,
+ StorageComponent.StorageUiKey.Key,
+ out var parentBui))
+ {
+ parentBui.CloseWindow(Position);
+ }
+ }
+
private void BuildGridRepresentation()
{
if (!_entity.TryGetComponent<StorageComponent>(StorageEntity, out var comp) || comp.Grid.Count == 0)
};
exitButton.OnPressed += _ =>
{
+ // Close ourselves and all parent BUIs.
Close();
+ CloseParent();
};
exitButton.OnKeyBindDown += args =>
{
if (!args.Handled && args.Function == ContentKeyFunctions.ActivateItemInWorld)
{
Close();
+ CloseParent();
args.Handle();
}
};
var containerSystem = _entity.System<SharedContainerSystem>();
if (containerSystem.TryGetContainingContainer(StorageEntity.Value, out var container) &&
- _entity.TryGetComponent(container.Owner, out StorageComponent? storage))
+ _entity.TryGetComponent(container.Owner, out StorageComponent? storage) &&
+ storage.Container.Contains(StorageEntity.Value))
{
Close();
StorageComponent.StorageUiKey.Key,
out var parentBui))
{
- parentBui.Show();
+ parentBui.Show(Position);
}
}
};
{
if (storageComp.StoredItems.TryGetValue(ent, out var updated))
{
+ data.Control.Marked = IsMarked(ent);
+
if (data.Loc.Equals(updated))
{
DebugTools.Assert(data.Control.Location == updated);
var gridPiece = new ItemGridPiece((ent, itemEntComponent), loc, _entity)
{
MinSize = size,
- Marked = _contained.IndexOf(ent) switch
- {
- 0 => ItemGridPieceMarks.First,
- 1 => ItemGridPieceMarks.Second,
- _ => null,
- }
+ Marked = IsMarked(ent),
};
gridPiece.OnPiecePressed += OnPiecePressed;
gridPiece.OnPieceUnpressed += OnPieceUnpressed;
}
}
+ private ItemGridPieceMarks? IsMarked(EntityUid uid)
+ {
+ return _contained.IndexOf(uid) switch
+ {
+ 0 => ItemGridPieceMarks.First,
+ 1 => ItemGridPieceMarks.Second,
+ _ => null,
+ };
+ }
+
protected override void FrameUpdate(FrameEventArgs args)
{
base.FrameUpdate(args);
{
if (StorageEntity != null && _entity.System<StorageSystem>().NestedStorage)
{
+ // If parent container nests us then show back button
if (containerSystem.TryGetContainingContainer(StorageEntity.Value, out var container) &&
- _entity.HasComponent<StorageComponent>(container.Owner))
+ _entity.TryGetComponent(container.Owner, out StorageComponent? storageComp) && storageComp.Container.Contains(StorageEntity.Value))
{
_backButton.Visible = true;
}
using Content.Shared.Input;
using Content.Shared.Interaction;
using Content.Shared.Storage;
+using Robust.Client.GameObjects;
using Robust.Client.Input;
using Robust.Client.Player;
using Robust.Client.UserInterface;
[Dependency] private readonly IInputManager _input = default!;
[Dependency] private readonly IPlayerManager _player = default!;
[UISystemDependency] private readonly StorageSystem _storage = default!;
+ [UISystemDependency] private readonly UserInterfaceSystem _ui = default!;
private readonly DragDropHelper<ItemGridPiece> _menuDragHelper;
StaticStorageUIEnabled = obj;
}
- public StorageWindow CreateStorageWindow(EntityUid uid)
+ public StorageWindow CreateStorageWindow(StorageBoundUserInterface sBui)
{
var window = new StorageWindow();
window.MouseFilter = Control.MouseFilterMode.Pass;
}
else
{
- window.OpenCenteredLeft();
+ // Open at parent position if it's open.
+ if (_ui.TryGetOpenUi<StorageBoundUserInterface>(EntityManager.GetComponent<TransformComponent>(sBui.Owner).ParentUid,
+ StorageComponent.StorageUiKey.Key, out var bui) && bui.Position != null)
+ {
+ window.Open(bui.Position.Value);
+ }
+ // Open at the saved position if it exists.
+ else if (_ui.TryGetPosition(sBui.Owner, StorageComponent.StorageUiKey.Key, out var pos))
+ {
+ window.Open(pos);
+ }
+ // Open at the default position.
+ else
+ {
+ window.OpenCenteredLeft();
+ }
}
+ _ui.RegisterControl(sBui, window);
return window;
}
args.Verbs.Add(verb);
}
+ public void OpenStorageUI(EntityUid uid, EntityUid actor, StorageComponent? storageComp = null, bool silent = true)
+ {
+ // Handle recursively opening nested storages.
+ if (ContainerSystem.TryGetContainingContainer(uid, out var container) &&
+ UI.IsUiOpen(container.Owner, StorageComponent.StorageUiKey.Key, actor))
+ {
+ _nestedCheck = true;
+ HideStorageWindow(container.Owner, actor);
+ OpenStorageUIInternal(uid, actor, storageComp, silent: true);
+ _nestedCheck = false;
+ }
+ else
+ {
+ // If you need something more sophisticated for multi-UI you'll need to code some smarter
+ // interactions.
+ if (_openStorageLimit == 1)
+ UI.CloseUserUis<StorageComponent.StorageUiKey>(actor);
+
+ OpenStorageUIInternal(uid, actor, storageComp, silent: silent);
+ }
+ }
+
/// <summary>
/// Opens the storage UI for an entity
/// </summary>
/// <param name="entity">The entity to open the UI for</param>
- public void OpenStorageUI(EntityUid uid, EntityUid entity, StorageComponent? storageComp = null, bool silent = true)
+ private void OpenStorageUIInternal(EntityUid uid, EntityUid entity, StorageComponent? storageComp = null, bool silent = true)
{
if (!Resolve(uid, ref storageComp, false))
return;
}
else
{
- // Handle recursively opening nested storages.
- if (ContainerSystem.TryGetContainingContainer((args.Target, null, null), out var container) &&
- UI.IsUiOpen(container.Owner, StorageComponent.StorageUiKey.Key, args.User))
- {
- _nestedCheck = true;
- HideStorageWindow(container.Owner, args.User);
- OpenStorageUI(uid, args.User, storageComp, silent: true);
- _nestedCheck = false;
- }
- else
- {
- // If you need something more sophisticated for multi-UI you'll need to code some smarter
- // interactions.
- if (_openStorageLimit == 1)
- UI.CloseUserUis<StorageComponent.StorageUiKey>(args.User);
-
- OpenStorageUI(uid, args.User, storageComp, silent: false);
- }
+ OpenStorageUI(uid, args.User, storageComp);
}
args.Handled = true;