Ghost UI to XAML and minor cleanup (#4637)
* Remove unused class, clean up XAML * Move GhostGui.cs into UI folder and namespace * GhostTargetWindow to seperate file * GhostTargetWindow to XAML * Center request button * Improve UI, localisation
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
|
using Content.Client.Ghost.UI;
|
||||||
using Content.Shared.Ghost;
|
using Content.Shared.Ghost;
|
||||||
using Robust.Client.Player;
|
using Robust.Client.Player;
|
||||||
using Robust.Shared.GameObjects;
|
using Robust.Shared.GameObjects;
|
||||||
|
|||||||
@@ -1,170 +0,0 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
using Content.Shared.Ghost;
|
|
||||||
using Robust.Client.Console;
|
|
||||||
using Robust.Client.UserInterface;
|
|
||||||
using Robust.Client.UserInterface.Controls;
|
|
||||||
using Robust.Client.UserInterface.CustomControls;
|
|
||||||
using Robust.Shared.GameObjects;
|
|
||||||
using Robust.Shared.IoC;
|
|
||||||
using Robust.Shared.Localization;
|
|
||||||
using static Robust.Client.UserInterface.Controls.BoxContainer;
|
|
||||||
|
|
||||||
namespace Content.Client.Ghost
|
|
||||||
{
|
|
||||||
public class GhostGui : Control
|
|
||||||
{
|
|
||||||
private readonly Button _returnToBody = new() {Text = Loc.GetString("ghost-gui-return-to-body-button") };
|
|
||||||
private readonly Button _ghostWarp = new() {Text = Loc.GetString("ghost-gui-ghost-warp-button") };
|
|
||||||
private readonly Button _ghostRoles = new() {Text = Loc.GetString("ghost-gui-ghost-roles-button") };
|
|
||||||
private readonly GhostComponent _owner;
|
|
||||||
|
|
||||||
public GhostTargetWindow? TargetWindow { get; }
|
|
||||||
|
|
||||||
public GhostGui(GhostComponent owner, IEntityNetworkManager eventBus)
|
|
||||||
{
|
|
||||||
IoCManager.InjectDependencies(this);
|
|
||||||
|
|
||||||
_owner = owner;
|
|
||||||
|
|
||||||
TargetWindow = new GhostTargetWindow(owner, eventBus);
|
|
||||||
|
|
||||||
MouseFilter = MouseFilterMode.Ignore;
|
|
||||||
|
|
||||||
_ghostWarp.OnPressed += _ =>
|
|
||||||
{
|
|
||||||
eventBus.SendSystemNetworkMessage(new GhostWarpsRequestEvent());
|
|
||||||
TargetWindow.Populate();
|
|
||||||
TargetWindow.OpenCentered();
|
|
||||||
};
|
|
||||||
_returnToBody.OnPressed += _ =>
|
|
||||||
{
|
|
||||||
var msg = new GhostReturnToBodyRequest();
|
|
||||||
eventBus.SendSystemNetworkMessage(msg);
|
|
||||||
};
|
|
||||||
_ghostRoles.OnPressed += _ => IoCManager.Resolve<IClientConsoleHost>()
|
|
||||||
.RemoteExecuteCommand(null, "ghostroles");
|
|
||||||
|
|
||||||
AddChild(new BoxContainer
|
|
||||||
{
|
|
||||||
Orientation = LayoutOrientation.Horizontal,
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
_returnToBody,
|
|
||||||
_ghostWarp,
|
|
||||||
_ghostRoles,
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Update()
|
|
||||||
{
|
|
||||||
_returnToBody.Disabled = !_owner.CanReturnToBody;
|
|
||||||
TargetWindow?.Populate();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void Dispose(bool disposing)
|
|
||||||
{
|
|
||||||
base.Dispose(disposing);
|
|
||||||
|
|
||||||
if (disposing)
|
|
||||||
{
|
|
||||||
TargetWindow?.Dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class GhostTargetWindow : SS14Window
|
|
||||||
{
|
|
||||||
private readonly GhostComponent _owner;
|
|
||||||
private readonly IEntityNetworkManager _netManager;
|
|
||||||
|
|
||||||
private readonly BoxContainer _buttonContainer;
|
|
||||||
|
|
||||||
public List<string> Locations { get; set; } = new();
|
|
||||||
|
|
||||||
public Dictionary<EntityUid, string> Players { get; set; } = new();
|
|
||||||
|
|
||||||
public GhostTargetWindow(GhostComponent owner, IEntityNetworkManager netManager)
|
|
||||||
{
|
|
||||||
MinSize = SetSize = (300, 450);
|
|
||||||
Title = Loc.GetString("ghost-target-window-title");
|
|
||||||
_owner = owner;
|
|
||||||
_netManager = netManager;
|
|
||||||
|
|
||||||
_buttonContainer = new BoxContainer
|
|
||||||
{
|
|
||||||
Orientation = LayoutOrientation.Vertical,
|
|
||||||
VerticalExpand = true,
|
|
||||||
SeparationOverride = 5,
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
var scrollBarContainer = new ScrollContainer()
|
|
||||||
{
|
|
||||||
VerticalExpand = true,
|
|
||||||
HorizontalExpand = true
|
|
||||||
};
|
|
||||||
|
|
||||||
scrollBarContainer.AddChild(_buttonContainer);
|
|
||||||
|
|
||||||
Contents.AddChild(scrollBarContainer);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Populate()
|
|
||||||
{
|
|
||||||
_buttonContainer.DisposeAllChildren();
|
|
||||||
AddButtonPlayers();
|
|
||||||
AddButtonLocations();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void AddButtonPlayers()
|
|
||||||
{
|
|
||||||
foreach (var (key, value) in Players)
|
|
||||||
{
|
|
||||||
var currentButtonRef = new Button
|
|
||||||
{
|
|
||||||
Text = value,
|
|
||||||
TextAlign = Label.AlignMode.Right,
|
|
||||||
HorizontalAlignment = HAlignment.Center,
|
|
||||||
VerticalAlignment = VAlignment.Center,
|
|
||||||
SizeFlagsStretchRatio = 1,
|
|
||||||
MinSize = (230, 20),
|
|
||||||
ClipText = true,
|
|
||||||
};
|
|
||||||
|
|
||||||
currentButtonRef.OnPressed += (_) =>
|
|
||||||
{
|
|
||||||
var msg = new GhostWarpToTargetRequestEvent(key);
|
|
||||||
_netManager.SendSystemNetworkMessage(msg);
|
|
||||||
};
|
|
||||||
|
|
||||||
_buttonContainer.AddChild(currentButtonRef);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void AddButtonLocations()
|
|
||||||
{
|
|
||||||
foreach (var name in Locations)
|
|
||||||
{
|
|
||||||
var currentButtonRef = new Button
|
|
||||||
{
|
|
||||||
Text = Loc.GetString("ghost-target-window-current-button", ("name", name)),
|
|
||||||
TextAlign = Label.AlignMode.Right,
|
|
||||||
HorizontalAlignment = HAlignment.Center,
|
|
||||||
VerticalAlignment = VAlignment.Center,
|
|
||||||
SizeFlagsStretchRatio = 1,
|
|
||||||
MinSize = (230,20),
|
|
||||||
ClipText = true,
|
|
||||||
};
|
|
||||||
|
|
||||||
currentButtonRef.OnPressed += (_) =>
|
|
||||||
{
|
|
||||||
var msg = new GhostWarpToLocationRequestEvent(name);
|
|
||||||
_netManager.SendSystemNetworkMessage(msg);
|
|
||||||
};
|
|
||||||
|
|
||||||
_buttonContainer.AddChild(currentButtonRef);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using Content.Client.HUD;
|
using Content.Client.Ghost.UI;
|
||||||
|
using Content.Client.HUD;
|
||||||
using Content.Shared.Ghost;
|
using Content.Shared.Ghost;
|
||||||
using JetBrains.Annotations;
|
using JetBrains.Annotations;
|
||||||
using Robust.Client.GameObjects;
|
using Robust.Client.GameObjects;
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
using Robust.Client.UserInterface.CustomControls;
|
|
||||||
|
|
||||||
namespace Content.Client.Ghost.Roles.UI
|
|
||||||
{
|
|
||||||
public class GhostRoleWindow : SS14Window
|
|
||||||
{
|
|
||||||
protected override void Opened()
|
|
||||||
{
|
|
||||||
base.Opened();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,8 +1,15 @@
|
|||||||
<BoxContainer xmlns="https://spacestation14.io"
|
<BoxContainer xmlns="https://spacestation14.io"
|
||||||
Orientation="Vertical">
|
Orientation="Horizontal"
|
||||||
|
SeparationOverride="10"
|
||||||
|
HorizontalExpand="True">
|
||||||
|
<BoxContainer Orientation="Vertical"
|
||||||
|
HorizontalExpand="True">
|
||||||
<RichTextLabel Name="Title" />
|
<RichTextLabel Name="Title" />
|
||||||
<BoxContainer Orientation="Horizontal" SeparationOverride="10">
|
<RichTextLabel Name="Description" />
|
||||||
<RichTextLabel Name="Description" HorizontalExpand="True" />
|
|
||||||
<Button Name="RequestButton" Text="Request" TextAlign="Center" SizeFlagsHorizontal="ShrinkEnd" />
|
|
||||||
</BoxContainer>
|
</BoxContainer>
|
||||||
|
<Button Name="RequestButton"
|
||||||
|
Text="{Loc 'ghost-roles-window-request-role-button'}"
|
||||||
|
TextAlign="Center"
|
||||||
|
HorizontalAlignment="Right"
|
||||||
|
VerticalAlignment="Center" />
|
||||||
</BoxContainer>
|
</BoxContainer>
|
||||||
|
|||||||
@@ -1,10 +1,16 @@
|
|||||||
<SS14Window Title="Ghost Roles"
|
<SS14Window xmlns="https://spacestation14.io"
|
||||||
xmlns="https://spacestation14.io" MinSize="350 275">
|
Title="{Loc 'ghost-roles-window-title'}"
|
||||||
<CenterContainer Name="NoRolesMessage" VerticalExpand="True" HorizontalExpand="True">
|
MinSize="375 275">
|
||||||
<Label Text="There are currently no available ghost roles." />
|
<Label Name="NoRolesMessage"
|
||||||
</CenterContainer>
|
Text="{Loc 'ghost-roles-window-no-roles-available-label'}"
|
||||||
<ScrollContainer HorizontalExpand="True" VerticalExpand="True">
|
VerticalAlignment="Top" />
|
||||||
<BoxContainer Orientation="Vertical" Name="EntryContainer" HorizontalExpand="True" VerticalExpand="True" />
|
<ScrollContainer HorizontalExpand="True"
|
||||||
|
VerticalExpand="True">
|
||||||
|
<BoxContainer Orientation="Vertical"
|
||||||
|
Name="EntryContainer"
|
||||||
|
HorizontalExpand="True"
|
||||||
|
VerticalExpand="True">
|
||||||
|
<!-- Ghost role entries are added here by code -->
|
||||||
|
</BoxContainer>
|
||||||
</ScrollContainer>
|
</ScrollContainer>
|
||||||
|
|
||||||
</SS14Window>
|
</SS14Window>
|
||||||
|
|||||||
@@ -12,8 +12,8 @@ namespace Content.Client.Ghost.Roles.UI
|
|||||||
|
|
||||||
public void ClearEntries()
|
public void ClearEntries()
|
||||||
{
|
{
|
||||||
EntryContainer.DisposeAllChildren();
|
|
||||||
NoRolesMessage.Visible = true;
|
NoRolesMessage.Visible = true;
|
||||||
|
EntryContainer.DisposeAllChildren();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddEntry(GhostRoleInfo info)
|
public void AddEntry(GhostRoleInfo info)
|
||||||
|
|||||||
73
Content.Client/Ghost/UI/GhostGui.cs
Normal file
73
Content.Client/Ghost/UI/GhostGui.cs
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
using Content.Shared.Ghost;
|
||||||
|
using Robust.Client.Console;
|
||||||
|
using Robust.Client.UserInterface;
|
||||||
|
using Robust.Client.UserInterface.Controls;
|
||||||
|
using Robust.Shared.GameObjects;
|
||||||
|
using Robust.Shared.IoC;
|
||||||
|
using Robust.Shared.Localization;
|
||||||
|
using static Robust.Client.UserInterface.Controls.BoxContainer;
|
||||||
|
|
||||||
|
namespace Content.Client.Ghost.UI
|
||||||
|
{
|
||||||
|
public class GhostGui : Control
|
||||||
|
{
|
||||||
|
private readonly Button _returnToBody = new() {Text = Loc.GetString("ghost-gui-return-to-body-button") };
|
||||||
|
private readonly Button _ghostWarp = new() {Text = Loc.GetString("ghost-gui-ghost-warp-button") };
|
||||||
|
private readonly Button _ghostRoles = new() {Text = Loc.GetString("ghost-gui-ghost-roles-button") };
|
||||||
|
private readonly GhostComponent _owner;
|
||||||
|
|
||||||
|
public GhostTargetWindow? TargetWindow { get; }
|
||||||
|
|
||||||
|
public GhostGui(GhostComponent owner, IEntityNetworkManager eventBus)
|
||||||
|
{
|
||||||
|
IoCManager.InjectDependencies(this);
|
||||||
|
|
||||||
|
_owner = owner;
|
||||||
|
|
||||||
|
TargetWindow = new GhostTargetWindow(eventBus);
|
||||||
|
|
||||||
|
MouseFilter = MouseFilterMode.Ignore;
|
||||||
|
|
||||||
|
_ghostWarp.OnPressed += _ =>
|
||||||
|
{
|
||||||
|
eventBus.SendSystemNetworkMessage(new GhostWarpsRequestEvent());
|
||||||
|
TargetWindow.Populate();
|
||||||
|
TargetWindow.OpenCentered();
|
||||||
|
};
|
||||||
|
_returnToBody.OnPressed += _ =>
|
||||||
|
{
|
||||||
|
var msg = new GhostReturnToBodyRequest();
|
||||||
|
eventBus.SendSystemNetworkMessage(msg);
|
||||||
|
};
|
||||||
|
_ghostRoles.OnPressed += _ => IoCManager.Resolve<IClientConsoleHost>()
|
||||||
|
.RemoteExecuteCommand(null, "ghostroles");
|
||||||
|
|
||||||
|
AddChild(new BoxContainer
|
||||||
|
{
|
||||||
|
Orientation = LayoutOrientation.Horizontal,
|
||||||
|
Children =
|
||||||
|
{
|
||||||
|
_returnToBody,
|
||||||
|
_ghostWarp,
|
||||||
|
_ghostRoles,
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Update()
|
||||||
|
{
|
||||||
|
_returnToBody.Disabled = !_owner.CanReturnToBody;
|
||||||
|
TargetWindow?.Populate();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
base.Dispose(disposing);
|
||||||
|
|
||||||
|
if (disposing)
|
||||||
|
{
|
||||||
|
TargetWindow?.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
14
Content.Client/Ghost/UI/GhostTargetWindow.xaml
Normal file
14
Content.Client/Ghost/UI/GhostTargetWindow.xaml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<SS14Window xmlns="https://spacestation14.io"
|
||||||
|
Title="{Loc 'ghost-target-window-title'}"
|
||||||
|
MinSize="300 450"
|
||||||
|
SetSize="300 450">
|
||||||
|
<ScrollContainer VerticalExpand="True"
|
||||||
|
HorizontalExpand="True">
|
||||||
|
<BoxContainer Name="ButtonContainer"
|
||||||
|
Orientation="Vertical"
|
||||||
|
VerticalExpand="True"
|
||||||
|
SeparationOverride="5">
|
||||||
|
<!-- Target buttons get added here by code -->
|
||||||
|
</BoxContainer>
|
||||||
|
</ScrollContainer>
|
||||||
|
</SS14Window>
|
||||||
85
Content.Client/Ghost/UI/GhostTargetWindow.xaml.cs
Normal file
85
Content.Client/Ghost/UI/GhostTargetWindow.xaml.cs
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using Content.Shared.Ghost;
|
||||||
|
using Robust.Client.AutoGenerated;
|
||||||
|
using Robust.Client.UserInterface.Controls;
|
||||||
|
using Robust.Client.UserInterface.CustomControls;
|
||||||
|
using Robust.Client.UserInterface.XAML;
|
||||||
|
using Robust.Shared.GameObjects;
|
||||||
|
using Robust.Shared.Localization;
|
||||||
|
|
||||||
|
namespace Content.Client.Ghost.UI
|
||||||
|
{
|
||||||
|
[GenerateTypedNameReferences]
|
||||||
|
public partial class GhostTargetWindow : SS14Window
|
||||||
|
{
|
||||||
|
private readonly IEntityNetworkManager _netManager;
|
||||||
|
|
||||||
|
public List<string> Locations { get; set; } = new();
|
||||||
|
|
||||||
|
public Dictionary<EntityUid, string> Players { get; set; } = new();
|
||||||
|
|
||||||
|
public GhostTargetWindow(IEntityNetworkManager netManager)
|
||||||
|
{
|
||||||
|
RobustXamlLoader.Load(this);
|
||||||
|
|
||||||
|
_netManager = netManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Populate()
|
||||||
|
{
|
||||||
|
ButtonContainer.DisposeAllChildren();
|
||||||
|
AddButtonPlayers();
|
||||||
|
AddButtonLocations();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AddButtonPlayers()
|
||||||
|
{
|
||||||
|
foreach (var (key, value) in Players)
|
||||||
|
{
|
||||||
|
var currentButtonRef = new Button
|
||||||
|
{
|
||||||
|
Text = value,
|
||||||
|
TextAlign = Label.AlignMode.Right,
|
||||||
|
HorizontalAlignment = HAlignment.Center,
|
||||||
|
VerticalAlignment = VAlignment.Center,
|
||||||
|
SizeFlagsStretchRatio = 1,
|
||||||
|
MinSize = (230, 20),
|
||||||
|
ClipText = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
currentButtonRef.OnPressed += (_) =>
|
||||||
|
{
|
||||||
|
var msg = new GhostWarpToTargetRequestEvent(key);
|
||||||
|
_netManager.SendSystemNetworkMessage(msg);
|
||||||
|
};
|
||||||
|
|
||||||
|
ButtonContainer.AddChild(currentButtonRef);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AddButtonLocations()
|
||||||
|
{
|
||||||
|
foreach (var name in Locations)
|
||||||
|
{
|
||||||
|
var currentButtonRef = new Button
|
||||||
|
{
|
||||||
|
Text = Loc.GetString("ghost-target-window-current-button", ("name", name)),
|
||||||
|
TextAlign = Label.AlignMode.Right,
|
||||||
|
HorizontalAlignment = HAlignment.Center,
|
||||||
|
VerticalAlignment = VAlignment.Center,
|
||||||
|
SizeFlagsStretchRatio = 1,
|
||||||
|
MinSize = (230, 20),
|
||||||
|
ClipText = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
currentButtonRef.OnPressed += _ =>
|
||||||
|
{
|
||||||
|
var msg = new GhostWarpToLocationRequestEvent(name);
|
||||||
|
_netManager.SendSystemNetworkMessage(msg);
|
||||||
|
};
|
||||||
|
|
||||||
|
ButtonContainer.AddChild(currentButtonRef);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,3 +4,7 @@ ghost-gui-ghost-roles-button = Ghost Roles
|
|||||||
|
|
||||||
ghost-target-window-title = Ghost Warp
|
ghost-target-window-title = Ghost Warp
|
||||||
ghost-target-window-current-button = Warp: {$name}
|
ghost-target-window-current-button = Warp: {$name}
|
||||||
|
|
||||||
|
ghost-roles-window-title = Ghost Roles
|
||||||
|
ghost-roles-window-request-role-button = Request
|
||||||
|
ghost-roles-window-no-roles-available-label = There are currently no available ghost roles.
|
||||||
|
|||||||
Reference in New Issue
Block a user