copy-settings-to-all-similar for scrubbers and vents in air alarms (#18363)

This commit is contained in:
Ilya246
2023-08-09 22:20:19 +04:00
committed by GitHub
parent aee88e1721
commit d3244b6049
9 changed files with 71 additions and 2 deletions

View File

@@ -31,6 +31,7 @@ public sealed class AirAlarmBoundUserInterface : BoundUserInterface
_window.OnClose += Close; _window.OnClose += Close;
_window.AtmosDeviceDataChanged += OnDeviceDataChanged; _window.AtmosDeviceDataChanged += OnDeviceDataChanged;
_window.AtmosDeviceDataCopied += OnDeviceDataCopied;
_window.AtmosAlarmThresholdChanged += OnThresholdChanged; _window.AtmosAlarmThresholdChanged += OnThresholdChanged;
_window.AirAlarmModeChanged += OnAirAlarmModeChanged; _window.AirAlarmModeChanged += OnAirAlarmModeChanged;
_window.AutoModeChanged += OnAutoModeChanged; _window.AutoModeChanged += OnAutoModeChanged;
@@ -48,6 +49,11 @@ public sealed class AirAlarmBoundUserInterface : BoundUserInterface
SendMessage(new AirAlarmUpdateDeviceDataMessage(address, data)); SendMessage(new AirAlarmUpdateDeviceDataMessage(address, data));
} }
private void OnDeviceDataCopied(IAtmosDeviceData data)
{
SendMessage(new AirAlarmCopyDeviceDataMessage(data));
}
private void OnAirAlarmModeChanged(AirAlarmMode mode) private void OnAirAlarmModeChanged(AirAlarmMode mode)
{ {
SendMessage(new AirAlarmUpdateAlarmModeMessage(mode)); SendMessage(new AirAlarmUpdateAlarmModeMessage(mode));

View File

@@ -18,6 +18,7 @@ namespace Content.Client.Atmos.Monitor.UI;
public sealed partial class AirAlarmWindow : FancyWindow public sealed partial class AirAlarmWindow : FancyWindow
{ {
public event Action<string, IAtmosDeviceData>? AtmosDeviceDataChanged; public event Action<string, IAtmosDeviceData>? AtmosDeviceDataChanged;
public event Action<IAtmosDeviceData>? AtmosDeviceDataCopied;
public event Action<string, AtmosMonitorThresholdType, AtmosAlarmThreshold, Gas?>? AtmosAlarmThresholdChanged; public event Action<string, AtmosMonitorThresholdType, AtmosAlarmThreshold, Gas?>? AtmosAlarmThresholdChanged;
public event Action<AirAlarmMode>? AirAlarmModeChanged; public event Action<AirAlarmMode>? AirAlarmModeChanged;
public event Action<bool>? AutoModeChanged; public event Action<bool>? AutoModeChanged;
@@ -137,6 +138,7 @@ public sealed partial class AirAlarmWindow : FancyWindow
{ {
var control= new PumpControl(pump, addr); var control= new PumpControl(pump, addr);
control.PumpDataChanged += AtmosDeviceDataChanged!.Invoke; control.PumpDataChanged += AtmosDeviceDataChanged!.Invoke;
control.PumpDataCopied += AtmosDeviceDataCopied!.Invoke;
_pumps.Add(addr, control); _pumps.Add(addr, control);
CVentContainer.AddChild(control); CVentContainer.AddChild(control);
} }
@@ -151,6 +153,7 @@ public sealed partial class AirAlarmWindow : FancyWindow
{ {
var control = new ScrubberControl(scrubber, addr); var control = new ScrubberControl(scrubber, addr);
control.ScrubberDataChanged += AtmosDeviceDataChanged!.Invoke; control.ScrubberDataChanged += AtmosDeviceDataChanged!.Invoke;
control.ScrubberDataCopied += AtmosDeviceDataCopied!.Invoke;
_scrubbers.Add(addr, control); _scrubbers.Add(addr, control);
CScrubberContainer.AddChild(control); CScrubberContainer.AddChild(control);
} }

View File

@@ -19,7 +19,7 @@
<OptionButton Name="CPressureCheck" /> <OptionButton Name="CPressureCheck" />
</BoxContainer> </BoxContainer>
</BoxContainer> </BoxContainer>
<!-- Lower row: pressure bounds --> <!-- Lower row: pressure bounds, copy settings -->
<BoxContainer Orientation="Horizontal" HorizontalExpand="True"> <BoxContainer Orientation="Horizontal" HorizontalExpand="True">
<BoxContainer Orientation="Vertical" HorizontalExpand="True"> <BoxContainer Orientation="Vertical" HorizontalExpand="True">
<Label Text="{Loc 'air-alarm-ui-vent-external-bound-label'}" Margin="0 0 0 1" /> <Label Text="{Loc 'air-alarm-ui-vent-external-bound-label'}" Margin="0 0 0 1" />
@@ -30,6 +30,9 @@
<FloatSpinBox Name="CInternalBound" HorizontalExpand="True" /> <FloatSpinBox Name="CInternalBound" HorizontalExpand="True" />
</BoxContainer> </BoxContainer>
</BoxContainer> </BoxContainer>
<BoxContainer Orientation="Horizontal" Margin ="0 0 0 2">
<Button Name="CCopySettings" Text="{Loc 'air-alarm-ui-widget-copy'}" ToolTip="{Loc 'air-alarm-ui-widget-copy-tooltip'}" />
</BoxContainer>
</BoxContainer> </BoxContainer>
</CollapsibleBody> </CollapsibleBody>
</Collapsible> </Collapsible>

View File

@@ -17,6 +17,7 @@ public sealed partial class PumpControl : BoxContainer
private string _address; private string _address;
public event Action<string, IAtmosDeviceData>? PumpDataChanged; public event Action<string, IAtmosDeviceData>? PumpDataChanged;
public event Action<IAtmosDeviceData>? PumpDataCopied;
private CheckBox _enabled => CEnableDevice; private CheckBox _enabled => CEnableDevice;
private CollapsibleHeading _addressLabel => CAddress; private CollapsibleHeading _addressLabel => CAddress;
@@ -24,6 +25,7 @@ public sealed partial class PumpControl : BoxContainer
private OptionButton _pressureCheck => CPressureCheck; private OptionButton _pressureCheck => CPressureCheck;
private FloatSpinBox _externalBound => CExternalBound; private FloatSpinBox _externalBound => CExternalBound;
private FloatSpinBox _internalBound => CInternalBound; private FloatSpinBox _internalBound => CInternalBound;
private Button _copySettings => CCopySettings;
public PumpControl(GasVentPumpData data, string address) public PumpControl(GasVentPumpData data, string address)
{ {
@@ -84,6 +86,11 @@ public sealed partial class PumpControl : BoxContainer
_data.PressureChecks = (VentPressureBound) args.Id; _data.PressureChecks = (VentPressureBound) args.Id;
PumpDataChanged?.Invoke(_address, _data); PumpDataChanged?.Invoke(_address, _data);
}; };
_copySettings.OnPressed += _ =>
{
PumpDataCopied?.Invoke(_data);
};
} }
public void ChangeData(GasVentPumpData data) public void ChangeData(GasVentPumpData data)

View File

@@ -8,7 +8,7 @@
<BoxContainer Orientation="Horizontal" Margin="0 0 0 2"> <BoxContainer Orientation="Horizontal" Margin="0 0 0 2">
<CheckBox Name="CEnableDevice" Text="{Loc 'air-alarm-ui-widget-enable'}" /> <CheckBox Name="CEnableDevice" Text="{Loc 'air-alarm-ui-widget-enable'}" />
</BoxContainer> </BoxContainer>
<!-- Upper row: toggle, direction, volume rate, widenet --> <!-- Upper row: toggle, direction, volume rate, widenet, copy settings -->
<BoxContainer Orientation="Horizontal" Margin="0 0 0 2" HorizontalExpand="True"> <BoxContainer Orientation="Horizontal" Margin="0 0 0 2" HorizontalExpand="True">
<BoxContainer Orientation="Vertical" HorizontalExpand="True"> <BoxContainer Orientation="Vertical" HorizontalExpand="True">
<Label Text="{Loc 'air-alarm-ui-scrubber-pump-direction-label'}" Margin="0 0 0 1"/> <Label Text="{Loc 'air-alarm-ui-scrubber-pump-direction-label'}" Margin="0 0 0 1"/>
@@ -22,6 +22,9 @@
<BoxContainer> <BoxContainer>
<CheckBox Name="CWideNet" Text="{Loc 'air-alarm-ui-scrubber-wide-net-label'}" /> <CheckBox Name="CWideNet" Text="{Loc 'air-alarm-ui-scrubber-wide-net-label'}" />
</BoxContainer> </BoxContainer>
<BoxContainer Orientation="Horizontal" Margin ="0 0 0 2">
<Button Name="CCopySettings" Text="{Loc 'air-alarm-ui-widget-copy'}" ToolTip="{Loc 'air-alarm-ui-widget-copy-tooltip'}" />
</BoxContainer>
<!-- Lower row: every single gas --> <!-- Lower row: every single gas -->
<Collapsible Orientation="Vertical" Margin="2 2 2 2"> <Collapsible Orientation="Vertical" Margin="2 2 2 2">
<CollapsibleHeading Title="Gas filters" /> <CollapsibleHeading Title="Gas filters" />

View File

@@ -20,12 +20,14 @@ public sealed partial class ScrubberControl : BoxContainer
private string _address; private string _address;
public event Action<string, IAtmosDeviceData>? ScrubberDataChanged; public event Action<string, IAtmosDeviceData>? ScrubberDataChanged;
public event Action<IAtmosDeviceData>? ScrubberDataCopied;
private CheckBox _enabled => CEnableDevice; private CheckBox _enabled => CEnableDevice;
private CollapsibleHeading _addressLabel => CAddress; private CollapsibleHeading _addressLabel => CAddress;
private OptionButton _pumpDirection => CPumpDirection; private OptionButton _pumpDirection => CPumpDirection;
private FloatSpinBox _volumeRate => CVolumeRate; private FloatSpinBox _volumeRate => CVolumeRate;
private CheckBox _wideNet => CWideNet; private CheckBox _wideNet => CWideNet;
private Button _copySettings => CCopySettings;
private GridContainer _gases => CGasContainer; private GridContainer _gases => CGasContainer;
private Dictionary<Gas, Button> _gasControls = new(); private Dictionary<Gas, Button> _gasControls = new();
@@ -76,6 +78,11 @@ public sealed partial class ScrubberControl : BoxContainer
ScrubberDataChanged?.Invoke(_address, _data); ScrubberDataChanged?.Invoke(_address, _data);
}; };
_copySettings.OnPressed += _ =>
{
ScrubberDataCopied?.Invoke(_data);
};
foreach (var value in Enum.GetValues<Gas>()) foreach (var value in Enum.GetValues<Gas>())
{ {
var gasButton = new Button var gasButton = new Button

View File

@@ -161,6 +161,7 @@ public sealed class AirAlarmSystem : EntitySystem
SubscribeLocalEvent<AirAlarmComponent, AirAlarmUpdateAutoModeMessage>(OnUpdateAutoMode); SubscribeLocalEvent<AirAlarmComponent, AirAlarmUpdateAutoModeMessage>(OnUpdateAutoMode);
SubscribeLocalEvent<AirAlarmComponent, AirAlarmUpdateAlarmThresholdMessage>(OnUpdateThreshold); SubscribeLocalEvent<AirAlarmComponent, AirAlarmUpdateAlarmThresholdMessage>(OnUpdateThreshold);
SubscribeLocalEvent<AirAlarmComponent, AirAlarmUpdateDeviceDataMessage>(OnUpdateDeviceData); SubscribeLocalEvent<AirAlarmComponent, AirAlarmUpdateDeviceDataMessage>(OnUpdateDeviceData);
SubscribeLocalEvent<AirAlarmComponent, AirAlarmCopyDeviceDataMessage>(OnCopyDeviceData);
SubscribeLocalEvent<AirAlarmComponent, AirAlarmTabSetMessage>(OnTabChange); SubscribeLocalEvent<AirAlarmComponent, AirAlarmTabSetMessage>(OnTabChange);
SubscribeLocalEvent<AirAlarmComponent, DeviceListUpdateEvent>(OnDeviceListUpdate); SubscribeLocalEvent<AirAlarmComponent, DeviceListUpdateEvent>(OnDeviceListUpdate);
SubscribeLocalEvent<AirAlarmComponent, BoundUIClosedEvent>(OnClose); SubscribeLocalEvent<AirAlarmComponent, BoundUIClosedEvent>(OnClose);
@@ -302,6 +303,32 @@ public sealed class AirAlarmSystem : EntitySystem
} }
} }
private void OnCopyDeviceData(EntityUid uid, AirAlarmComponent component, AirAlarmCopyDeviceDataMessage args)
{
if (!AccessCheck(uid, args.Session.AttachedEntity, component))
{
UpdateUI(uid, component);
return;
}
switch (args.Data)
{
case GasVentPumpData ventData:
foreach (string addr in component.VentData.Keys)
{
SetData(uid, addr, args.Data);
}
break;
case GasVentScrubberData scrubberData:
foreach (string addr in component.ScrubberData.Keys)
{
SetData(uid, addr, args.Data);
}
break;
}
}
private bool AccessCheck(EntityUid uid, EntityUid? user, AirAlarmComponent? component = null) private bool AccessCheck(EntityUid uid, EntityUid? user, AirAlarmComponent? component = null)
{ {
if (!Resolve(uid, ref component)) if (!Resolve(uid, ref component))

View File

@@ -117,6 +117,17 @@ public sealed class AirAlarmUpdateDeviceDataMessage : BoundUserInterfaceMessage
} }
} }
[Serializable, NetSerializable]
public sealed class AirAlarmCopyDeviceDataMessage : BoundUserInterfaceMessage
{
public IAtmosDeviceData Data { get; }
public AirAlarmCopyDeviceDataMessage(IAtmosDeviceData data)
{
Data = data;
}
}
[Serializable, NetSerializable] [Serializable, NetSerializable]
public sealed class AirAlarmUpdateAlarmThresholdMessage : BoundUserInterfaceMessage public sealed class AirAlarmUpdateAlarmThresholdMessage : BoundUserInterfaceMessage
{ {

View File

@@ -40,6 +40,8 @@ air-alarm-ui-mode-none = None
### General ### General
air-alarm-ui-widget-enable = Enabled air-alarm-ui-widget-enable = Enabled
air-alarm-ui-widget-copy = Copy settings to similar devices
air-alarm-ui-widget-copy-tooltip = Copies the settings of this device to all devices in this air alarm tab.
air-alarm-ui-widget-ignore = Ignore air-alarm-ui-widget-ignore = Ignore
air-alarm-ui-atmos-net-device-label = Address: {$address} air-alarm-ui-atmos-net-device-label = Address: {$address}