Added a directory to station maps (#31156)
* Added directory to station maps * Add null checks to map directory sorting/filtering * Reworked station map directory to be more readable and responsive
This commit is contained in:
19
Content.Client/Pinpointer/UI/StationMapBeaconControl.xaml
Normal file
19
Content.Client/Pinpointer/UI/StationMapBeaconControl.xaml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<Control xmlns="https://spacestation14.io" HorizontalExpand="True">
|
||||||
|
<BoxContainer Name="MainContainer"
|
||||||
|
Orientation="Horizontal"
|
||||||
|
HorizontalExpand="True">
|
||||||
|
<PanelContainer Name="ColorPanel"
|
||||||
|
VerticalExpand="True"
|
||||||
|
SetWidth="7"
|
||||||
|
Margin="0 1 0 0" />
|
||||||
|
<Button Name="MainButton"
|
||||||
|
HorizontalExpand="True"
|
||||||
|
VerticalExpand="True"
|
||||||
|
StyleClasses="ButtonSquare"
|
||||||
|
Margin="-1 0 0 0">
|
||||||
|
<BoxContainer Orientation="Horizontal" HorizontalExpand="True">
|
||||||
|
<Label Name="BeaconNameLabel" />
|
||||||
|
</BoxContainer>
|
||||||
|
</Button>
|
||||||
|
</BoxContainer>
|
||||||
|
</Control>
|
||||||
50
Content.Client/Pinpointer/UI/StationMapBeaconControl.xaml.cs
Normal file
50
Content.Client/Pinpointer/UI/StationMapBeaconControl.xaml.cs
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
using Content.Shared.Pinpointer;
|
||||||
|
using Robust.Client.AutoGenerated;
|
||||||
|
using Robust.Client.Graphics;
|
||||||
|
using Robust.Client.UserInterface;
|
||||||
|
using Robust.Client.UserInterface.XAML;
|
||||||
|
using Robust.Shared.Map;
|
||||||
|
|
||||||
|
namespace Content.Client.Pinpointer.UI;
|
||||||
|
|
||||||
|
[GenerateTypedNameReferences]
|
||||||
|
public sealed partial class StationMapBeaconControl : Control, IComparable<StationMapBeaconControl>
|
||||||
|
{
|
||||||
|
[Dependency] private readonly IEntityManager _entMan = default!;
|
||||||
|
|
||||||
|
public readonly EntityCoordinates BeaconPosition;
|
||||||
|
public Action<EntityCoordinates>? OnPressed;
|
||||||
|
public string? Label => BeaconNameLabel.Text;
|
||||||
|
private StyleBoxFlat _styleBox;
|
||||||
|
public Color Color => _styleBox.BackgroundColor;
|
||||||
|
|
||||||
|
public StationMapBeaconControl(EntityUid mapUid, SharedNavMapSystem.NavMapBeacon beacon)
|
||||||
|
{
|
||||||
|
RobustXamlLoader.Load(this);
|
||||||
|
IoCManager.InjectDependencies(this);
|
||||||
|
|
||||||
|
BeaconPosition = new EntityCoordinates(mapUid, beacon.Position);
|
||||||
|
|
||||||
|
_styleBox = new StyleBoxFlat { BackgroundColor = beacon.Color };
|
||||||
|
ColorPanel.PanelOverride = _styleBox;
|
||||||
|
BeaconNameLabel.Text = beacon.Text;
|
||||||
|
|
||||||
|
MainButton.OnPressed += args => OnPressed?.Invoke(BeaconPosition);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int CompareTo(StationMapBeaconControl? other)
|
||||||
|
{
|
||||||
|
if (other == null)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
// Group by color
|
||||||
|
var colorCompare = Color.ToArgb().CompareTo(other.Color.ToArgb());
|
||||||
|
if (colorCompare != 0)
|
||||||
|
{
|
||||||
|
return colorCompare;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If same color, sort by text
|
||||||
|
return string.Compare(Label, other.Label);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -24,9 +24,16 @@ public sealed class StationMapBoundUserInterface : BoundUserInterface
|
|||||||
|
|
||||||
_window = this.CreateWindow<StationMapWindow>();
|
_window = this.CreateWindow<StationMapWindow>();
|
||||||
_window.Title = EntMan.GetComponent<MetaDataComponent>(Owner).EntityName;
|
_window.Title = EntMan.GetComponent<MetaDataComponent>(Owner).EntityName;
|
||||||
|
|
||||||
|
string stationName = string.Empty;
|
||||||
|
if(EntMan.TryGetComponent<MetaDataComponent>(gridUid, out var gridMetaData))
|
||||||
|
{
|
||||||
|
stationName = gridMetaData.EntityName;
|
||||||
|
}
|
||||||
|
|
||||||
if (EntMan.TryGetComponent<StationMapComponent>(Owner, out var comp) && comp.ShowLocation)
|
if (EntMan.TryGetComponent<StationMapComponent>(Owner, out var comp) && comp.ShowLocation)
|
||||||
_window.Set(gridUid, Owner);
|
_window.Set(stationName, gridUid, Owner);
|
||||||
else
|
else
|
||||||
_window.Set(gridUid, null);
|
_window.Set(stationName, gridUid, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,11 +3,28 @@
|
|||||||
xmlns:ui="clr-namespace:Content.Client.Pinpointer.UI"
|
xmlns:ui="clr-namespace:Content.Client.Pinpointer.UI"
|
||||||
Title="{Loc 'station-map-window-title'}"
|
Title="{Loc 'station-map-window-title'}"
|
||||||
Resizable="False"
|
Resizable="False"
|
||||||
SetSize="668 713"
|
SetSize="868 748"
|
||||||
MinSize="668 713">
|
MinSize="868 748">
|
||||||
<BoxContainer Orientation="Vertical">
|
<BoxContainer Orientation="Vertical">
|
||||||
<BoxContainer Orientation="Horizontal" HorizontalExpand="True" Margin="0 8 0 10" VerticalAlignment="Top">
|
<!-- Station name -->
|
||||||
|
<controls:StripeBack>
|
||||||
|
<PanelContainer>
|
||||||
|
<Label Name="StationName" Text="Unknown station" StyleClasses="LabelBig" Align="Center"/>
|
||||||
|
</PanelContainer>
|
||||||
|
</controls:StripeBack>
|
||||||
|
|
||||||
|
<BoxContainer Orientation="Horizontal" HorizontalExpand="True" VerticalAlignment="Top">
|
||||||
<ui:NavMapControl Name="NavMapScreen"/>
|
<ui:NavMapControl Name="NavMapScreen"/>
|
||||||
|
|
||||||
|
<BoxContainer Orientation="Vertical" SetWidth="200">
|
||||||
|
<!-- Search bar -->
|
||||||
|
<LineEdit Name="FilterBar" PlaceHolder="{Loc 'station-map-filter-placeholder'}" Margin="0 0 10 10" HorizontalExpand="True"/>
|
||||||
|
|
||||||
|
<ScrollContainer HorizontalExpand="True" VerticalExpand="True">
|
||||||
|
<!-- Beacon Buttons (filled by code) -->
|
||||||
|
<BoxContainer Name="BeaconButtons" Orientation="Vertical" HorizontalExpand="True" />
|
||||||
|
</ScrollContainer>
|
||||||
|
</BoxContainer>
|
||||||
</BoxContainer>
|
</BoxContainer>
|
||||||
|
|
||||||
<!-- Footer -->
|
<!-- Footer -->
|
||||||
|
|||||||
@@ -3,24 +3,75 @@ using Content.Client.UserInterface.Controls;
|
|||||||
using Robust.Client.AutoGenerated;
|
using Robust.Client.AutoGenerated;
|
||||||
using Robust.Client.UserInterface.XAML;
|
using Robust.Client.UserInterface.XAML;
|
||||||
using Robust.Shared.Map;
|
using Robust.Shared.Map;
|
||||||
|
using Content.Shared.Pinpointer;
|
||||||
|
|
||||||
namespace Content.Client.Pinpointer.UI;
|
namespace Content.Client.Pinpointer.UI;
|
||||||
|
|
||||||
[GenerateTypedNameReferences]
|
[GenerateTypedNameReferences]
|
||||||
public sealed partial class StationMapWindow : FancyWindow
|
public sealed partial class StationMapWindow : FancyWindow
|
||||||
{
|
{
|
||||||
|
[Dependency] private readonly IEntityManager _entMan = default!;
|
||||||
|
|
||||||
|
private readonly List<StationMapBeaconControl> _buttons = new();
|
||||||
|
|
||||||
public StationMapWindow()
|
public StationMapWindow()
|
||||||
{
|
{
|
||||||
RobustXamlLoader.Load(this);
|
RobustXamlLoader.Load(this);
|
||||||
|
IoCManager.InjectDependencies(this);
|
||||||
|
|
||||||
|
FilterBar.OnTextChanged += (bar) => OnFilterChanged(bar.Text);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Set(EntityUid? mapUid, EntityUid? trackedEntity)
|
public void Set(string stationName, EntityUid? mapUid, EntityUid? trackedEntity)
|
||||||
{
|
{
|
||||||
NavMapScreen.MapUid = mapUid;
|
NavMapScreen.MapUid = mapUid;
|
||||||
|
|
||||||
if (trackedEntity != null)
|
if (trackedEntity != null)
|
||||||
NavMapScreen.TrackedCoordinates.Add(new EntityCoordinates(trackedEntity.Value, Vector2.Zero), (true, Color.Cyan));
|
NavMapScreen.TrackedCoordinates.Add(new EntityCoordinates(trackedEntity.Value, Vector2.Zero), (true, Color.Cyan));
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(stationName))
|
||||||
|
{
|
||||||
|
StationName.Text = stationName;
|
||||||
|
}
|
||||||
|
|
||||||
NavMapScreen.ForceNavMapUpdate();
|
NavMapScreen.ForceNavMapUpdate();
|
||||||
|
UpdateBeaconList(mapUid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnFilterChanged(string newFilter)
|
||||||
|
{
|
||||||
|
foreach (var button in _buttons)
|
||||||
|
{
|
||||||
|
button.Visible = string.IsNullOrEmpty(newFilter) || (
|
||||||
|
!string.IsNullOrEmpty(button.Label) &&
|
||||||
|
button.Label.Contains(newFilter, StringComparison.OrdinalIgnoreCase)
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateBeaconList(EntityUid? mapUid)
|
||||||
|
{
|
||||||
|
BeaconButtons.Children.Clear();
|
||||||
|
_buttons.Clear();
|
||||||
|
|
||||||
|
if (!mapUid.HasValue)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!_entMan.TryGetComponent<NavMapComponent>(mapUid, out var navMap))
|
||||||
|
return;
|
||||||
|
|
||||||
|
foreach (var beacon in navMap.Beacons.Values)
|
||||||
|
{
|
||||||
|
var button = new StationMapBeaconControl(mapUid.Value, beacon);
|
||||||
|
|
||||||
|
button.OnPressed += NavMapScreen.CenterToCoordinates;
|
||||||
|
|
||||||
|
_buttons.Add(button);
|
||||||
|
}
|
||||||
|
|
||||||
|
_buttons.Sort();
|
||||||
|
|
||||||
|
foreach (var button in _buttons)
|
||||||
|
BeaconButtons.AddChild(button);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
station-map-window-title = Station map
|
station-map-window-title = Station map
|
||||||
station-map-user-interface-flavor-left = Don't panic
|
station-map-user-interface-flavor-left = Don't panic
|
||||||
station-map-user-interface-flavor-right = v1.42
|
station-map-user-interface-flavor-right = v1.42
|
||||||
|
station-map-filter-placeholder = Search by name
|
||||||
|
|
||||||
nav-beacon-window-title = Station Beacon
|
nav-beacon-window-title = Station Beacon
|
||||||
nav-beacon-toggle-visible = Visible
|
nav-beacon-toggle-visible = Visible
|
||||||
|
|||||||
Reference in New Issue
Block a user