diff --git a/Content.Client/Gravity/GravityGeneratorVisualizer.cs b/Content.Client/Gravity/GravityGeneratorVisualizer.cs
index 2dffc2826b..e9e5c0766e 100644
--- a/Content.Client/Gravity/GravityGeneratorVisualizer.cs
+++ b/Content.Client/Gravity/GravityGeneratorVisualizer.cs
@@ -63,10 +63,31 @@ namespace Content.Client.Gravity
}
}
- if (component.TryGetData(GravityGeneratorVisuals.CoreVisible, out bool visible))
+ if (component.TryGetData(GravityGeneratorVisuals.Charge, out float charge))
{
var layer = sprite.LayerMapGet(GravityGeneratorVisualLayers.Core);
- sprite.LayerSetVisible(layer, visible);
+ switch (charge)
+ {
+ case < 0.2f:
+ sprite.LayerSetVisible(layer, false);
+ break;
+ case >= 0.2f and < 0.4f:
+ sprite.LayerSetVisible(layer, true);
+ sprite.LayerSetState(layer, "startup");
+ break;
+ case >= 0.4f and < 0.6f:
+ sprite.LayerSetVisible(layer, true);
+ sprite.LayerSetState(layer, "idle");
+ break;
+ case >= 0.6f and < 0.8f:
+ sprite.LayerSetVisible(layer, true);
+ sprite.LayerSetState(layer, "activating");
+ break;
+ default:
+ sprite.LayerSetVisible(layer, true);
+ sprite.LayerSetState(layer, "activated");
+ break;
+ }
}
}
diff --git a/Content.Client/Gravity/UI/GravityGeneratorBoundUserInterface.cs b/Content.Client/Gravity/UI/GravityGeneratorBoundUserInterface.cs
index 0cf77a4fc5..efef226b61 100644
--- a/Content.Client/Gravity/UI/GravityGeneratorBoundUserInterface.cs
+++ b/Content.Client/Gravity/UI/GravityGeneratorBoundUserInterface.cs
@@ -10,28 +10,25 @@ namespace Content.Client.Gravity.UI
{
private GravityGeneratorWindow? _window;
- public bool IsOn;
-
public GravityGeneratorBoundUserInterface(ClientUserInterfaceComponent owner, object uiKey) : base (owner, uiKey)
{
- SendMessage(new SharedGravityGeneratorComponent.GeneratorStatusRequestMessage());
}
protected override void Open()
{
base.Open();
- IsOn = false;
-
- _window = new GravityGeneratorWindow(this);
+ _window = new GravityGeneratorWindow(this, Owner);
+ /*
_window.Switch.OnPressed += _ =>
{
SendMessage(new SharedGravityGeneratorComponent.SwitchGeneratorMessage(!IsOn));
- SendMessage(new SharedGravityGeneratorComponent.GeneratorStatusRequestMessage());
};
+ */
_window.OpenCentered();
+ _window.OnClose += Close;
}
protected override void UpdateState(BoundUserInterfaceState state)
@@ -39,8 +36,7 @@ namespace Content.Client.Gravity.UI
base.UpdateState(state);
var castState = (SharedGravityGeneratorComponent.GeneratorState) state;
- IsOn = castState.On;
- _window?.UpdateButton();
+ _window?.UpdateState(castState);
}
protected override void Dispose(bool disposing)
@@ -50,5 +46,10 @@ namespace Content.Client.Gravity.UI
_window?.Dispose();
}
+
+ public void SetPowerSwitch(bool on)
+ {
+ SendMessage(new SharedGravityGeneratorComponent.SwitchGeneratorMessage(on));
+ }
}
}
diff --git a/Content.Client/Gravity/UI/GravityGeneratorWindow.xaml b/Content.Client/Gravity/UI/GravityGeneratorWindow.xaml
index 29100d72a9..2b789f3be7 100644
--- a/Content.Client/Gravity/UI/GravityGeneratorWindow.xaml
+++ b/Content.Client/Gravity/UI/GravityGeneratorWindow.xaml
@@ -1,14 +1,35 @@
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
-
+
+
diff --git a/Content.Client/Gravity/UI/GravityGeneratorWindow.xaml.cs b/Content.Client/Gravity/UI/GravityGeneratorWindow.xaml.cs
index c092e4ddde..730b3dc678 100644
--- a/Content.Client/Gravity/UI/GravityGeneratorWindow.xaml.cs
+++ b/Content.Client/Gravity/UI/GravityGeneratorWindow.xaml.cs
@@ -1,39 +1,80 @@
-using Content.Client.Message;
+using System;
+using Content.Client.Message;
+using Content.Client.UserInterface;
+using Content.Shared.Gravity;
using Robust.Client.AutoGenerated;
+using Robust.Client.GameObjects;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.IoC;
using Robust.Shared.Localization;
+using Robust.Shared.Maths;
namespace Content.Client.Gravity.UI
{
[GenerateTypedNameReferences]
- public partial class GravityGeneratorWindow : SS14Window
+ public partial class GravityGeneratorWindow : FancyWindow
{
+ private readonly ButtonGroup _buttonGroup = new();
+
private readonly GravityGeneratorBoundUserInterface _owner;
- public GravityGeneratorWindow(GravityGeneratorBoundUserInterface ui)
+ public GravityGeneratorWindow(GravityGeneratorBoundUserInterface ui, ClientUserInterfaceComponent component)
{
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
_owner = ui;
- UpdateButton();
+ OnButton.Group = _buttonGroup;
+ OffButton.Group = _buttonGroup;
+
+ OnButton.OnPressed += _ => _owner.SetPowerSwitch(true);
+ OffButton.OnPressed += _ => _owner.SetPowerSwitch(false);
+
+ EntityView.Sprite = component.Owner.GetComponent();
}
- public void UpdateButton()
+ public void UpdateState(SharedGravityGeneratorComponent.GeneratorState state)
{
- string status = Loc.GetString(_owner.IsOn
- ? "gravity-generator-window-is-on"
- : "gravity-generator-window-is-off");
+ if (state.On)
+ OnButton.Pressed = true;
+ else
+ OffButton.Pressed = true;
- Status.SetMarkup(Loc.GetString("gravity-generator-window-status-label", ("status", status)));
+ PowerLabel.Text = Loc.GetString(
+ "gravity-generator-window-power-label",
+ ("draw", state.PowerDraw),
+ ("max", state.PowerDrawMax));
- Switch.Text = Loc.GetString(_owner.IsOn
- ? "gravity-generator-window-turn-off-button"
- : "gravity-generator-window-turn-on-button");
+ PowerLabel.SetOnlyStyleClass(MathHelper.CloseTo(state.PowerDraw, state.PowerDrawMax) ? "Good" : "Caution");
+
+ ChargeBar.Value = state.Charge;
+ ChargeText.Text = (state.Charge / 255f).ToString("P0");
+ StatusLabel.Text = Loc.GetString(state.PowerStatus switch
+ {
+ GravityGeneratorPowerStatus.Off => "gravity-generator-window-status-off",
+ GravityGeneratorPowerStatus.Discharging => "gravity-generator-window-status-discharging",
+ GravityGeneratorPowerStatus.Charging => "gravity-generator-window-status-charging",
+ GravityGeneratorPowerStatus.FullyCharged => "gravity-generator-window-status-fully-charged",
+ _ => throw new ArgumentOutOfRangeException()
+ });
+
+ StatusLabel.SetOnlyStyleClass(state.PowerStatus switch
+ {
+ GravityGeneratorPowerStatus.Off => "Danger",
+ GravityGeneratorPowerStatus.Discharging => "Caution",
+ GravityGeneratorPowerStatus.Charging => "Caution",
+ GravityGeneratorPowerStatus.FullyCharged => "Good",
+ _ => throw new ArgumentOutOfRangeException()
+ });
+
+ EtaLabel.Text = state.EtaSeconds >= 0
+ ? Loc.GetString("gravity-generator-window-eta-value", ("left", TimeSpan.FromSeconds(state.EtaSeconds)))
+ : Loc.GetString("gravity-generator-window-eta-none");
+
+ EtaLabel.SetOnlyStyleClass(state.EtaSeconds >= 0 ? "Caution" : "Disabled");
}
}
}
diff --git a/Content.Client/Stylesheets/StyleNano.cs b/Content.Client/Stylesheets/StyleNano.cs
index 673f82fe67..e9131c96d0 100644
--- a/Content.Client/Stylesheets/StyleNano.cs
+++ b/Content.Client/Stylesheets/StyleNano.cs
@@ -54,6 +54,10 @@ namespace Content.Client.Stylesheets
public const string StyleClassPopupMessage = "PopupMessage";
public static readonly Color NanoGold = Color.FromHex("#A88B5E");
+ public static readonly Color GoodGreenFore = Color.FromHex("#31843E");
+ public static readonly Color ConcerningOrangeFore = Color.FromHex("#A5762F");
+ public static readonly Color DangerousRedFore = Color.FromHex("#BB3232");
+ public static readonly Color DisabledFore = Color.FromHex("#5A5A5A");
public static readonly Color ButtonColorDefault = Color.FromHex("#464966");
public static readonly Color ButtonColorDefaultRed = Color.FromHex("#D43B3B");
@@ -395,6 +399,15 @@ namespace Content.Client.Stylesheets
var sliderFillRed = new StyleBoxTexture(sliderFillBox) {Modulate = Color.Red};
var sliderFillBlue = new StyleBoxTexture(sliderFillBox) {Modulate = Color.Blue};
+ var boxFont13 = resCache.GetFont("/Fonts/Boxfont-round/Boxfont Round.ttf", 13);
+
+ var insetBack = new StyleBoxTexture
+ {
+ Texture = buttonTex,
+ Modulate = Color.FromHex("#202023"),
+ };
+ insetBack.SetPatchMargin(StyleBox.Margin.All, 10);
+
Stylesheet = new Stylesheet(BaseRules.Concat(new[]
{
// Window title.
@@ -1124,6 +1137,40 @@ namespace Content.Client.Stylesheets
.Prop(PanelContainer.StylePropertyPanel, BaseAngleRect)
.Prop(Control.StylePropertyModulateSelf, Color.FromHex("#25252A")),
+ Element().Class(ClassLowDivider)
+ .Prop(PanelContainer.StylePropertyPanel, new StyleBoxFlat
+ {
+ BackgroundColor = Color.FromHex("#444"),
+ ContentMarginLeftOverride = 2,
+ ContentMarginBottomOverride = 2
+ }),
+
+ Element