UX improvements to Air Alarm UI (#12681)

Co-authored-by: Eoin Mcloughlin <helloworld@eoinrul.es>
This commit is contained in:
eoineoineoin
2022-12-06 23:46:07 +00:00
committed by GitHub
parent dadd34286e
commit ff9cf108b6
16 changed files with 649 additions and 495 deletions

View File

@@ -0,0 +1,95 @@
using Content.Client.Message;
using Content.Shared.Atmos;
using Content.Shared.Atmos.Monitor;
using Content.Shared.Temperature;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
namespace Content.Client.Atmos.Monitor.UI.Widgets;
[GenerateTypedNameReferences]
public sealed partial class ThresholdBoundControl : BoxContainer
{
// raw values to use in thresholds, prefer these
// over directly setting Modified(Value/LastValue)
// when working with the FloatSpinBox
private float _value;
// convenience thing for getting multiplied values
// and also setting value to a usable value
private float ScaledValue
{
get => _value * _uiValueScale;
set => _value = value / _uiValueScale;
}
private float _uiValueScale;
public event Action? OnValidBoundChanged;
public Action<float>? OnBoundChanged;
public Action<bool>? OnBoundEnabled;
public void SetValue(float value)
{
_value = value;
CSpinner.Value = (float) ScaledValue!;
}
public void SetEnabled(bool enabled)
{
CBoundEnabled.Pressed = enabled;
if (enabled)
{
CBoundLabel.RemoveStyleClass("Disabled");
}
else
{
CBoundLabel.SetOnlyStyleClass("Disabled");
}
}
public void SetWarningState(AtmosAlarmType alarm)
{
if(alarm == AtmosAlarmType.Normal)
{
CBoundLabel.FontColorOverride = null;
}
else
{
CBoundLabel.FontColorOverride = AirAlarmWindow.ColorForAlarm(alarm);
}
}
public ThresholdBoundControl(string controlLabel, float value, float uiValueScale = 1)
{
RobustXamlLoader.Load(this);
_uiValueScale = uiValueScale > 0 ? uiValueScale : 1;
_value = value;
CBoundLabel.Text = controlLabel;
CSpinner.Value = ScaledValue;
CBoundEnabled.Pressed = _value != null;
CSpinner.OnValueChanged += SpinnerValueChanged;
CBoundEnabled.OnToggled += CheckboxToggled;
}
private void SpinnerValueChanged(FloatSpinBox.FloatSpinBoxEventArgs args)
{
// ensure that the value in the spinbox is transformed
ScaledValue = args.Value;
// set the value in the scope above
OnBoundChanged!(_value);
OnValidBoundChanged!.Invoke();
}
private void CheckboxToggled(BaseButton.ButtonToggledEventArgs args)
{
OnBoundEnabled!(args.Pressed);
OnValidBoundChanged!.Invoke();
}
}