Machine Linking Overhaul (#7160)

This commit is contained in:
Jack Fox
2022-04-04 01:13:03 -05:00
committed by GitHub
parent fd7ea3f1e7
commit f957c58906
40 changed files with 605 additions and 696 deletions

View File

@@ -9,9 +9,10 @@ namespace Content.Client.MachineLinking.UI
{
private SignalPortSelectorMenu? _menu;
public SignalPortSelectorBoundUserInterface([NotNull] ClientUserInterfaceComponent owner, [NotNull] object uiKey) : base(owner, uiKey)
{
}
private string? _selectedTransmitterPort;
private string? _selectedReceiverPort;
public SignalPortSelectorBoundUserInterface([NotNull] ClientUserInterfaceComponent owner, [NotNull] object uiKey) : base(owner, uiKey) { }
protected override void Open()
{
@@ -29,13 +30,46 @@ namespace Content.Client.MachineLinking.UI
{
case SignalPortsState data:
_menu?.UpdateState(data);
_selectedTransmitterPort = null;
_selectedReceiverPort = null;
break;
}
}
public void OnPortSelected(string port)
public void OnTransmitterPortSelected(string port)
{
SendMessage(new SignalPortSelected(port));
_selectedTransmitterPort = port;
if (_selectedReceiverPort != null)
{
SendMessage(new SignalPortSelected(_selectedTransmitterPort, _selectedReceiverPort));
_selectedTransmitterPort = null;
_selectedReceiverPort = null;
}
}
public void OnReceiverPortSelected(string port)
{
_selectedReceiverPort = port;
if (_selectedTransmitterPort != null)
{
SendMessage(new SignalPortSelected(_selectedTransmitterPort, _selectedReceiverPort));
_selectedTransmitterPort = null;
_selectedReceiverPort = null;
}
}
public void OnClearPressed()
{
_selectedTransmitterPort = null;
_selectedReceiverPort = null;
SendMessage(new LinkerClearSelected());
}
public void OnLinkDefaultPressed()
{
_selectedTransmitterPort = null;
_selectedReceiverPort = null;
SendMessage(new LinkerLinkDefaultSelected());
}
protected override void Dispose(bool disposing)

View File

@@ -1,4 +1,19 @@
<customControls:DefaultWindow xmlns:customControls="https://spacestation14.io"
Title="Port Selector" MinSize="200 200">
<customControls:ItemList Name="ButtonContainer" VerticalExpand="True" HorizontalExpand="True" SelectMode="Button"/>
</customControls:DefaultWindow>
<DefaultWindow xmlns="https://spacestation14.io" Title="Port Selector" MinSize="400 200">
<BoxContainer Orientation="Vertical" VerticalExpand="True">
<BoxContainer Orientation="Horizontal" HorizontalExpand="True" VerticalExpand="True">
<BoxContainer Orientation="Vertical" HorizontalExpand="True" SizeFlagsStretchRatio="0.3">
<RichTextLabel Name="HeaderLeft"/>
<BoxContainer Name="ButtonContainerLeft" Orientation="Vertical" VerticalExpand="True" HorizontalExpand="True"/>
</BoxContainer>
<BoxContainer Name="ContainerMiddle" Orientation="Vertical" HorizontalExpand="True" SizeFlagsStretchRatio="0.2"/>
<BoxContainer Orientation="Vertical" HorizontalExpand="True" SizeFlagsStretchRatio="0.3">
<RichTextLabel Name="HeaderRight"/>
<BoxContainer Name="ButtonContainerRight" Orientation="Vertical" VerticalExpand="True" HorizontalExpand="True"/>
</BoxContainer>
</BoxContainer>
<BoxContainer Orientation="Horizontal" HorizontalExpand="True">
<Button Name="ButtonClear" Text="Clear"/>
<Button Name="ButtonLinkDefault" Text="Link Defaults"/>
</BoxContainer>
</BoxContainer>
</DefaultWindow>

View File

@@ -1,9 +1,10 @@
using System.Collections.Generic;
using Content.Shared.MachineLinking;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using Robust.Client.Graphics;
namespace Content.Client.MachineLinking.UI
{
@@ -11,25 +12,67 @@ namespace Content.Client.MachineLinking.UI
public sealed partial class SignalPortSelectorMenu : DefaultWindow
{
private SignalPortSelectorBoundUserInterface _bui;
private LinksRender links;
private ButtonGroup buttonGroup = new();
public SignalPortSelectorMenu(SignalPortSelectorBoundUserInterface boundUserInterface)
{
RobustXamlLoader.Load(this);
_bui = boundUserInterface;
links = new(ButtonContainerLeft, ButtonContainerRight);
ContainerMiddle.AddChild(links);
ButtonClear.OnPressed += _ => _bui.OnClearPressed();
ButtonLinkDefault.OnPressed += _ => _bui.OnLinkDefaultPressed();
}
public void UpdateState(SignalPortsState state)
{
ButtonContainer.Clear();
foreach (var port in state.Ports)
HeaderLeft.SetMessage(state.TransmitterName);
ButtonContainerLeft.DisposeAllChildren();
foreach (var port in state.TransmitterPorts)
{
var portBtn = new ItemList.Item(ButtonContainer)
var portButton = new Button() { Text = port, ToggleMode = true, Group = buttonGroup };
portButton.OnPressed += _ => _bui.OnTransmitterPortSelected(port);
ButtonContainerLeft.AddChild(portButton);
}
HeaderRight.SetMessage(state.ReceiverName);
ButtonContainerRight.DisposeAllChildren();
foreach (var port in state.ReceiverPorts)
{
var portButton = new Button() { Text = port, ToggleMode = true, Group = buttonGroup };
portButton.OnPressed += _ => _bui.OnReceiverPortSelected(port);
ButtonContainerRight.AddChild(portButton);
}
links.Links = state.Links;
}
private sealed class LinksRender : Control
{
public List<(int, int)> Links = new();
public BoxContainer LeftButton;
public BoxContainer RightButton;
public LinksRender(BoxContainer leftButton, BoxContainer rightButton)
{
LeftButton = leftButton;
RightButton = rightButton;
}
protected override void Draw(DrawingHandleScreen handle)
{
var leftOffset = LeftButton.PixelPosition.Y;
var rightOffset = RightButton.PixelPosition.Y;
foreach (var (left, right) in Links)
{
Text = port.Key,
Disabled = !port.Value
};
portBtn.OnSelected += _ => _bui.OnPortSelected(port.Key);
ButtonContainer.Add(portBtn);
var leftChild = LeftButton.GetChild(left);
var rightChild = RightButton.GetChild(right);
var y1 = leftChild.PixelPosition.Y + leftChild.PixelHeight / 2 + leftOffset;
var y2 = rightChild.PixelPosition.Y + rightChild.PixelHeight / 2 + rightOffset;
handle.DrawLine((0, y1), (PixelWidth, y2), Color.Cyan);
}
}
}
}