using Robust.Client.UserInterface;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Map.Components;
+using Robust.Shared.Timing;
namespace Content.Client.Administration.UI.Tabs.ObjectsTab;
public sealed partial class ObjectsTab : Control
{
[Dependency] private readonly EntityManager _entityManager = default!;
+ [Dependency] private readonly IGameTiming _timing = default!;
private readonly List<ObjectsTabEntry> _objects = new();
private List<ObjectsTabSelection> _selections = new();
public event Action<ObjectsTabEntry, GUIBoundKeyEventArgs>? OnEntryKeyBindDown;
+ // Listen I could either have like 4 different event subscribers (for map / grid / station changes) and manage their lifetimes in AdminUIController
+ // OR
+ // I can do this.
+ private TimeSpan _updateFrequency = TimeSpan.FromSeconds(2);
+
+ private TimeSpan _nextUpdate = TimeSpan.FromSeconds(2);
+
public ObjectsTab()
{
RobustXamlLoader.Load(this);
ObjectTypeOptions.AddItem(Enum.GetName((ObjectsTabSelection)type)!);
}
+ RefreshObjectList();
+ }
+
+ private void RefreshObjectList()
+ {
RefreshObjectList(_selections[ObjectTypeOptions.SelectedId]);
}
private void RefreshObjectList(ObjectsTabSelection selection)
{
- var entities = new List<EntityUid>();
+ var entities = new List<(string Name, NetEntity Entity)>();
switch (selection)
{
case ObjectsTabSelection.Stations:
break;
case ObjectsTabSelection.Grids:
{
- var query = _entityManager.AllEntityQueryEnumerator<MapGridComponent>();
- while (query.MoveNext(out var uid, out _))
+ var query = _entityManager.AllEntityQueryEnumerator<MapGridComponent, MetaDataComponent>();
+ while (query.MoveNext(out var uid, out _, out var metadata))
{
- entities.Add(uid);
+ entities.Add((metadata.EntityName, _entityManager.GetNetEntity(uid)));
}
break;
}
case ObjectsTabSelection.Maps:
{
- var query = _entityManager.AllEntityQueryEnumerator<MapComponent>();
- while (query.MoveNext(out var uid, out _))
+ var query = _entityManager.AllEntityQueryEnumerator<MapComponent, MetaDataComponent>();
+ while (query.MoveNext(out var uid, out _, out var metadata))
{
- entities.Add(uid);
+ entities.Add((metadata.EntityName, _entityManager.GetNetEntity(uid)));
}
break;
}
_objects.Clear();
- foreach (var entity in entities)
+ foreach (var (name, nent) in entities)
{
- // TODO the server eitehr needs to send the entity's name, or it needs to ensure the client knows about the entity.
- var name = _entityManager.GetComponentOrNull<MetaDataComponent>(entity)?.EntityName ?? "Unknown Entity"; // this should be fixed, so I CBF localizing.
- var ctrl = new ObjectsTabEntry(name, entity);
+ var ctrl = new ObjectsTabEntry(name, nent);
_objects.Add(ctrl);
ObjectList.AddChild(ctrl);
ctrl.OnKeyBindDown += args => OnEntryKeyBindDown?.Invoke(ctrl, args);
}
}
+ protected override void FrameUpdate(FrameEventArgs args)
+ {
+ base.FrameUpdate(args);
+
+ if (_timing.CurTime < _nextUpdate)
+ return;
+
+ // I do not care for precision.
+ _nextUpdate = _timing.CurTime + _updateFrequency;
+
+ RefreshObjectList();
+ }
+
private enum ObjectsTabSelection
{
Grids,
[GenerateTypedNameReferences]
public sealed partial class ObjectsTabEntry : ContainerButton
{
- public EntityUid AssocEntity;
+ public NetEntity AssocEntity;
- public ObjectsTabEntry(string name, EntityUid euid)
+ public ObjectsTabEntry(string name, NetEntity nent)
{
RobustXamlLoader.Load(this);
- AssocEntity = euid;
- EIDLabel.Text = euid.ToString();
+ AssocEntity = nent;
+ EIDLabel.Text = nent.ToString();
NameLabel.Text = name;
}
}
/// </summary>
public sealed class StationSystem : EntitySystem
{
-
- private readonly HashSet<EntityUid> _stations = new();
+ private readonly List<(string Name, NetEntity Entity)> _stations = new();
/// <summary>
/// All stations that currently exist.
/// <remarks>
/// I'd have this just invoke an entity query, but we're on the client and the client barely knows about stations.
/// </remarks>
- public IReadOnlySet<EntityUid> Stations => _stations;
+ public IReadOnlyList<(string Name, NetEntity Entity)> Stations => _stations;
/// <inheritdoc/>
public override void Initialize()
private void StationsUpdated(StationsUpdatedEvent ev)
{
_stations.Clear();
- // TODO this needs to be dona in component states and with the Ensure() methods
- _stations.UnionWith(GetEntitySet(ev.Stations));
+ // TODO this needs to be done in component states and with the Ensure() methods
+ _stations.AddRange(ev.Stations);
}
}
namespace Content.Client.UserInterface.Systems.Admin;
[UsedImplicitly]
-public sealed class AdminUIController : UIController, IOnStateEntered<GameplayState>, IOnStateEntered<LobbyState>, IOnSystemChanged<AdminSystem>
+public sealed class AdminUIController : UIController,
+ IOnStateEntered<GameplayState>,
+ IOnStateEntered<LobbyState>,
+ IOnSystemChanged<AdminSystem>
{
[Dependency] private readonly IClientAdminManager _admin = default!;
[Dependency] private readonly IClientConGroupController _conGroups = default!;
{
if (e.NewStatus == SessionStatus.Connected)
{
- RaiseNetworkEvent(new StationsUpdatedEvent(GetNetEntitySet(GetStationsSet())), e.Session);
+ RaiseNetworkEvent(new StationsUpdatedEvent(GetStationNames()), e.Session);
}
}
private void OnStationAdd(EntityUid uid, StationDataComponent component, ComponentStartup args)
{
- RaiseNetworkEvent(new StationsUpdatedEvent(GetNetEntitySet(GetStationsSet())), Filter.Broadcast());
+ RaiseNetworkEvent(new StationsUpdatedEvent(GetStationNames()), Filter.Broadcast());
var metaData = MetaData(uid);
RaiseLocalEvent(new StationInitializedEvent(uid));
RemComp<StationMemberComponent>(grid);
}
- RaiseNetworkEvent(new StationsUpdatedEvent(GetNetEntitySet(GetStationsSet())), Filter.Broadcast());
+ RaiseNetworkEvent(new StationsUpdatedEvent(GetStationNames()), Filter.Broadcast());
}
private void OnPreGameMapLoad(PreGameMapLoad ev)
return stations;
}
+ public List<(string Name, NetEntity Entity)> GetStationNames()
+ {
+ var stations = GetStationsSet();
+ var stats = new List<(string Name, NetEntity Station)>();
+
+ foreach (var weh in stations)
+ {
+ stats.Add((MetaData(weh).EntityName, GetNetEntity(weh)));
+ }
+
+ return stats;
+ }
+
/// <summary>
/// Returns the first station that has a grid in a certain map.
/// If the map has no stations, null is returned instead.
[NetSerializable, Serializable]
public sealed class StationsUpdatedEvent : EntityEventArgs
{
- public readonly HashSet<NetEntity> Stations;
+ public readonly List<(string Name, NetEntity Entity)> Stations;
- public StationsUpdatedEvent(HashSet<NetEntity> stations)
+ public StationsUpdatedEvent(List<(string Name, NetEntity Entity)> stations)
{
Stations = stations;
}