Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
ad78dea
Implement DeviceList
juliangiebel Apr 21, 2022
c7259e7
Remove ApcNetworkComponent from vents, scrubbers anf firelocks
juliangiebel Apr 21, 2022
2d16e26
Change BeforeBroadcastAttemptEvent#Recepients to readonly IReadonlySe…
juliangiebel Apr 22, 2022
420236d
Address revievs in NetworkConfigurationSystem
juliangiebel Apr 22, 2022
d9a99e1
Fix red and green button styles
juliangiebel Apr 22, 2022
53bb5ac
Change NetworkConfiguratorSystem#UpdateState to remove saved entites …
juliangiebel Apr 22, 2022
0908969
Add AtmosDevices device net id
juliangiebel Apr 22, 2022
dfba8b5
Add const strings for style classes
juliangiebel Apr 22, 2022
cd3c3f5
Hello? Github?
juliangiebel Apr 22, 2022
762f485
Add access check before opening the configuration ui
juliangiebel Apr 23, 2022
7bc08ff
Merge branch 'master' into 2022.04.18-device-net-designation
juliangiebel May 25, 2022
176c98f
Address reviews
juliangiebel Jun 4, 2022
9e018ee
Merge branch 'master' into 2022.04.18-device-net-designation
juliangiebel Jun 4, 2022
735c0b8
Fix call to access reader
juliangiebel Jun 4, 2022
e8734b7
You shall not live again IgnoreComponent
wrexbe Jun 4, 2022
af8f5bb
Merge github.com:space-wizards/space-station-14 into 2022.04.18-devic…
juliangiebel Jun 5, 2022
404a4e1
Merge branch '2022.04.18-device-net-designation' of github.com:julian…
juliangiebel Jun 5, 2022
5f113cc
Fix interaction verb check
juliangiebel Jun 5, 2022
ef6317d
Fix configuration window not closing when target gets deleted / out o…
juliangiebel Jun 5, 2022
ac3023d
Change device is already saved message to say 'network device: ... is…
juliangiebel Jun 5, 2022
47e4a06
Apply suggestions from code review
juliangiebel Jun 6, 2022
6a6a9ef
Fix applied suggestion
juliangiebel Jun 6, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
using Content.Shared.DeviceNetwork;
using JetBrains.Annotations;
using Robust.Client.GameObjects;

namespace Content.Client.NetworkConfigurator;

public sealed class NetworkConfiguratorBoundUserInterface : BoundUserInterface
{
private NetworkConfiguratorListMenu? _listMenu;
private NetworkConfiguratorConfigurationMenu? _configurationMenu;

public NetworkConfiguratorBoundUserInterface(ClientUserInterfaceComponent owner, object uiKey) : base(owner, uiKey)
{
}

public void OnRemoveButtonPressed(string address)
{
SendMessage(new NetworkConfiguratorRemoveDeviceMessage(address));
}

protected override void Open()
{
base.Open();

switch (UiKey)
{
case NetworkConfiguratorUiKey.List:
_listMenu = new NetworkConfiguratorListMenu(this);
_listMenu.OnClose += Close;
_listMenu.ClearButton.OnPressed += _ => OnClearButtonPressed();
_listMenu.OpenCentered();
break;
case NetworkConfiguratorUiKey.Configure:
_configurationMenu = new NetworkConfiguratorConfigurationMenu();
_configurationMenu.OnClose += Close;
_configurationMenu.Set.OnPressed += _ => OnConfigButtonPressed(NetworkConfiguratorButtonKey.Set);
_configurationMenu.Add.OnPressed += _ => OnConfigButtonPressed(NetworkConfiguratorButtonKey.Add);
//_configurationMenu.Edit.OnPressed += _ => OnConfigButtonPressed(NetworkConfiguratorButtonKey.Edit);
_configurationMenu.Clear.OnPressed += _ => OnConfigButtonPressed(NetworkConfiguratorButtonKey.Clear);
_configurationMenu.Copy.OnPressed += _ => OnConfigButtonPressed(NetworkConfiguratorButtonKey.Copy);
_configurationMenu.Show.OnPressed += _ => OnConfigButtonPressed(NetworkConfiguratorButtonKey.Show);
_configurationMenu.OpenCentered();
break;
}
}

protected override void UpdateState(BoundUserInterfaceState state)
{
base.UpdateState(state);

var castState = (NetworkConfiguratorUserInterfaceState) state;
_listMenu?.UpdateState(castState);
}

protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (!disposing) return;

_listMenu?.Dispose();
_configurationMenu?.Dispose();
}

private void OnClearButtonPressed()
{
SendMessage(new NetworkConfiguratorClearDevicesMessage());
}

private void OnConfigButtonPressed(NetworkConfiguratorButtonKey buttonKey)
{
SendMessage(new NetworkConfiguratorButtonPressedMessage(buttonKey));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<ui:FancyWindow xmlns="https://spacestation14.io"
xmlns:ui="clr-namespace:Content.Client.UserInterface"
Title="Network Configurator" MinSize="350 100">
<BoxContainer Orientation="Vertical" VerticalExpand="True" HorizontalExpand="True">
<BoxContainer Orientation="Horizontal" HorizontalExpand="True" Margin="8 8 8 1">
<Button Name="Set" Text="Set" Access="Public" ToolTip="{Loc 'network-configurator-tooltip-set'}" HorizontalExpand="True" StyleClasses="ButtonSquare"/>
<Button Name="Add" Text="Add" Access="Public" ToolTip="{Loc 'network-configurator-tooltip-add'}" HorizontalExpand="True" StyleClasses="ButtonSquare"/>
<!-- Edit might not be needed -->
<!--<Button Name="Edit" Text="Edit" Access="Public" ToolTip="{Loc 'network-configurator-tooltip-edit'}" HorizontalExpand="True" StyleClasses="ButtonSquare"/>-->
<Button Name="Clear" Text="Clear" Access="Public" ToolTip="{Loc 'network-configurator-tooltip-clear'}" HorizontalExpand="True"/>
</BoxContainer>
<BoxContainer Orientation="Horizontal" HorizontalExpand="True" Margin="8 0 8 8">
<Button Name="Copy" Text="Copy" Access="Public" ToolTip="{Loc 'network-configurator-tooltip-copy'}" HorizontalExpand="True" StyleClasses="OpenRight"/>
<Button Name="Show" Text="Show" Access="Public" Disabled="True" ToolTip="{Loc 'network-configurator-tooltip-show'}" HorizontalExpand="True" StyleClasses="ButtonSquare"/>
</BoxContainer>
</BoxContainer>
</ui:FancyWindow>
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using Content.Client.Stylesheets;
using Content.Client.UserInterface;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using Robust.Client.Graphics;

namespace Content.Client.NetworkConfigurator;

[GenerateTypedNameReferences]
public sealed partial class NetworkConfiguratorConfigurationMenu : FancyWindow
{

public NetworkConfiguratorConfigurationMenu()
{
RobustXamlLoader.Load(this);

Clear.StyleClasses.Add(StyleBase.ButtonOpenLeft);
Clear.StyleClasses.Add(StyleNano.StyleClassButtonColorRed);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<ui:FancyWindow xmlns="https://spacestation14.io"
xmlns:ui="clr-namespace:Content.Client.UserInterface"
Title="Network Configurator" MinSize="220 400">
<BoxContainer Orientation="Vertical" VerticalExpand="True">
<ScrollContainer HorizontalExpand="True" VerticalExpand="True">
<Control VerticalExpand="True">
<PanelContainer StyleClasses="PanelBackgroundBaseDark"></PanelContainer>
<BoxContainer Orientation="Vertical" Name="DeviceList" VerticalExpand="True" SeparationOverride="4">
</BoxContainer>
</Control>
</ScrollContainer>
<BoxContainer Orientation="Horizontal" Margin="8 8 8 8">
<Label Name="DeviceCountLabel" Margin="16 0 0 0" MaxWidth="64"></Label>
<Control HorizontalExpand="True" />
<Button Name="ClearButton" Access="Public" Text="{Loc 'network-configurator-ui-clear-button'}"></Button>
</BoxContainer>
</BoxContainer>
</ui:FancyWindow>
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
using Content.Client.UserInterface;
using Content.Shared.DeviceNetwork;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;

namespace Content.Client.NetworkConfigurator;

[GenerateTypedNameReferences]
public sealed partial class NetworkConfiguratorListMenu : FancyWindow
{
private readonly NetworkConfiguratorBoundUserInterface _ui;
public NetworkConfiguratorListMenu(NetworkConfiguratorBoundUserInterface ui)
{
RobustXamlLoader.Load(this);

_ui = ui;
}

public void UpdateState(NetworkConfiguratorUserInterfaceState state)
{
DeviceCountLabel.Text = Loc.GetString("network-configurator-ui-count-label", ("count", state.DeviceList.Count));
DeviceList.RemoveAllChildren();

foreach (var savedDevice in state.DeviceList)
{
DeviceList.AddChild(BuildDeviceListRow(savedDevice));
}
}

private BoxContainer BuildDeviceListRow((string address, string name) savedDevice)
{
var row = new BoxContainer()
{
Orientation = BoxContainer.LayoutOrientation.Horizontal,
Margin = new Thickness(8)
};

var name = new Label()
{
Text = savedDevice.name[..Math.Min(11, savedDevice.name.Length)],
SetWidth = 84
};

var address = new Label()
{
Text = savedDevice.address,
HorizontalExpand = true,
Align = Label.AlignMode.Center
};

var removeButton = new TextureButton()
{
StyleClasses = { "CrossButtonRed" },
VerticalAlignment = VAlignment.Center,
Scale = new Vector2(0.5f, 0.5f)
};

removeButton.OnPressed += _ => _ui.OnRemoveButtonPressed(savedDevice.address);

row.AddChild(name);
row.AddChild(address);
row.AddChild(removeButton);

return row;
}
}
57 changes: 54 additions & 3 deletions Content.Client/Stylesheets/StyleNano.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ public static Font NotoStack(this IResourceCache resCache, string variation = "R
}

}

public sealed class StyleNano : StyleBase
{
public const string StyleClassBorderedWindowPanel = "BorderedWindowPanel";
Expand Down Expand Up @@ -93,6 +94,9 @@ public sealed class StyleNano : StyleBase
public static readonly Color ButtonColorCautionPressed = Color.FromHex("#3e6c45");
public static readonly Color ButtonColorCautionDisabled = Color.FromHex("#602a2a");

public static readonly Color ButtonColorGoodDefault = Color.FromHex("#3E6C45");
public static readonly Color ButtonColorGoodHovered = Color.FromHex("#31843E");

// Context menu button colors
public static readonly Color ButtonColorContext = Color.FromHex("#1119");
public static readonly Color ButtonColorContextHover = Color.DarkSlateGray;
Expand All @@ -112,6 +116,14 @@ public sealed class StyleNano : StyleBase

public const string StyleClassItemStatus = "ItemStatus";

//Background
public const string StyleClassBackgroundBaseDark = "PanelBackgroundBaseDark";

//Buttons
public const string StyleClassCrossButtonRed = "CrossButtonRed";
public const string StyleClassButtonColorRed = "ButtonColorRed";
public const string StyleClassButtonColorGreen = "ButtonColorGreen";

public override Stylesheet Stylesheet { get; }

public StyleNano(IResourceCache resCache) : base(resCache)
Expand Down Expand Up @@ -461,7 +473,7 @@ public StyleNano(IResourceCache resCache) : base(resCache)
var directionIconArrowTex = resCache.GetTexture("/Textures/Interface/VerbIcons/drop.svg.192dpi.png");
var directionIconQuestionTex = resCache.GetTexture("/Textures/Interface/VerbIcons/information.svg.192dpi.png");
var directionIconHereTex = resCache.GetTexture("/Textures/Interface/VerbIcons/dot.svg.192dpi.png");

Stylesheet = new Stylesheet(BaseRules.Concat(new[]
{
// Window title.
Expand Down Expand Up @@ -1294,8 +1306,47 @@ public StyleNano(IResourceCache resCache) : base(resCache)
.Prop("panel", new StyleBoxTexture(BaseButtonOpenLeft) { Padding = default })
.Prop(Control.StylePropertyModulateSelf, Color.FromHex("#1F1F23")),

Element<PanelContainer>().Class("Inset")
.Prop("panel", insetBack),
Element<PanelContainer>().Class("WindowHeadingBackgroundLight")
.Prop("panel", new StyleBoxTexture(BaseButtonOpenLeft) { Padding = default }),

//The lengths you have to go through to change a background color smh
Element<PanelContainer>().Class("PanelBackgroundBaseDark")
.Prop("panel", new StyleBoxTexture(BaseButtonOpenBoth) { Padding = default })
.Prop(Control.StylePropertyModulateSelf, Color.FromHex("#1F1F23")),

// X Texture button ---
Element<TextureButton>().Class("CrossButtonRed")
.Prop(TextureButton.StylePropertyTexture, resCache.GetTexture("/Textures/Interface/Nano/cross.svg.png"))
.Prop(Control.StylePropertyModulateSelf, DangerousRedFore),

Element<TextureButton>().Class("CrossButtonRed").Pseudo(TextureButton.StylePseudoClassHover)
.Prop(Control.StylePropertyModulateSelf, Color.FromHex("#7F3636")),

Element<TextureButton>().Class("CrossButtonRed").Pseudo(TextureButton.StylePseudoClassHover)
.Prop(Control.StylePropertyModulateSelf, Color.FromHex("#753131")),
// ---

// Red Button ---
Element<Button>().Class("ButtonColorRed")
.Prop(Control.StylePropertyModulateSelf, ButtonColorDefaultRed),

Element<Button>().Class("ButtonColorRed").Pseudo(ContainerButton.StylePseudoClassNormal)
.Prop(Control.StylePropertyModulateSelf, ButtonColorDefaultRed),

Element<Button>().Class("ButtonColorRed").Pseudo(ContainerButton.StylePseudoClassHover)
.Prop(Control.StylePropertyModulateSelf, ButtonColorHoveredRed),
// ---

// Green Button ---
Element<Button>().Class("ButtonColorGreen")
.Prop(Control.StylePropertyModulateSelf, ButtonColorGoodDefault),

Element<Button>().Class("ButtonColorGreen").Pseudo(ContainerButton.StylePseudoClassNormal)
.Prop(Control.StylePropertyModulateSelf, ButtonColorGoodDefault),

Element<Button>().Class("ButtonColorGreen").Pseudo(ContainerButton.StylePseudoClassHover)
.Prop(Control.StylePropertyModulateSelf, ButtonColorGoodHovered),
// ---

Element<Label>().Class("StatusFieldTitle")
.Prop("font-color", NanoGold),
Expand Down
28 changes: 28 additions & 0 deletions Content.Server/DeviceNetwork/Components/DeviceListComponent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using Content.Server.DeviceNetwork.Systems;

namespace Content.Server.DeviceNetwork.Components;

[RegisterComponent]
[Friend(typeof(DeviceListSystem))]
public sealed class DeviceListComponent : Component
{
/// <summary>
/// The list of devices can or can't connect to, depending on the <see cref="IsAllowList"/> field.
/// </summary>
[DataField("devices")]
public HashSet<EntityUid> Devices = new();

/// <summary>
/// Whether the device list is used as an allow or deny list
/// </summary>
[ViewVariables(VVAccess.ReadWrite)]
[DataField("isAllowList")]
public bool IsAllowList = true;

/// <summary>
/// Whether this device list also handles incoming device net packets
/// </summary>
[ViewVariables(VVAccess.ReadWrite)]
[DataField("handleIncoming")]
public bool HandleIncomingPackets = false;
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public enum DeviceNetIdDefaults
Wired,
Wireless,
Apc,
AtmosDevices,
Reserved = 100,
// Ids outside this enum may exist
// This exists to let yml use nice names instead of numbers
Expand Down Expand Up @@ -85,5 +86,13 @@ public enum DeviceNetIdDefaults
[ViewVariables(VVAccess.ReadWrite)]
[DataField("autoConnect")]
public bool AutoConnect = true;

/// <summary>
/// Whether to send the broadcast recipients list to the sender so it can be filtered.
/// <see cref="DeviceListSystem"/>
/// </summary>
[ViewVariables(VVAccess.ReadWrite)]
[DataField("sendBroadcastAttemptEvent")]
public bool SendBroadcastAttemptEvent = false;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using Content.Server.DeviceNetwork.Systems;
using Content.Shared.Sound;

namespace Content.Server.DeviceNetwork.Components;

[RegisterComponent]
[Friend(typeof(NetworkConfiguratorSystem))]
public sealed class NetworkConfiguratorComponent : Component
{
/// <summary>
/// The list of devices stored in the configurator-
/// </summary>
[DataField("devices")]
public Dictionary<string, EntityUid> Devices = new();

/// <summary>
/// The entity containing a <see cref="DeviceListComponent"/> this configurator is currently interacting with
/// </summary>
[DataField("activeDeviceList")]
public EntityUid? ActiveDeviceList = null;

[DataField("soundNoAccess")]
public SoundSpecifier SoundNoAccess = new SoundPathSpecifier("/Audio/Machines/custom_deny.ogg");
}
Loading