XAMLify ID card computer, Alerts and AME window (#4322)
* Refactor ID card computer to XAML UI * Alerts * XAMLify AME window * Use Control.SetButtonDisabledRecursive() instead
This commit is contained in:
@@ -19,14 +19,9 @@ namespace Content.Client.AME.UI
|
|||||||
{
|
{
|
||||||
base.Open();
|
base.Open();
|
||||||
|
|
||||||
_window = new AMEWindow();
|
_window = new AMEWindow(this);
|
||||||
_window.OnClose += Close;
|
_window.OnClose += Close;
|
||||||
_window.OpenCentered();
|
_window.OpenCentered();
|
||||||
|
|
||||||
_window.EjectButton.OnPressed += _ => ButtonPressed(UiButton.Eject);
|
|
||||||
_window.ToggleInjection.OnPressed += _ => ButtonPressed(UiButton.ToggleInjection);
|
|
||||||
_window.IncreaseFuelButton.OnPressed += _ => ButtonPressed(UiButton.IncreaseFuel);
|
|
||||||
_window.DecreaseFuelButton.OnPressed += _ => ButtonPressed(UiButton.DecreaseFuel);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -44,7 +39,7 @@ namespace Content.Client.AME.UI
|
|||||||
_window?.UpdateState(castState); //Update window state
|
_window?.UpdateState(castState); //Update window state
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ButtonPressed(UiButton button, int dispenseIndex = -1)
|
public void ButtonPressed(UiButton button, int dispenseIndex = -1)
|
||||||
{
|
{
|
||||||
SendMessage(new UiButtonPressedMessage(button));
|
SendMessage(new UiButtonPressedMessage(button));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,173 +0,0 @@
|
|||||||
using Content.Client.Stylesheets;
|
|
||||||
using Robust.Client.UserInterface;
|
|
||||||
using Robust.Client.UserInterface.Controls;
|
|
||||||
using Robust.Client.UserInterface.CustomControls;
|
|
||||||
using Robust.Shared.GameObjects;
|
|
||||||
using Robust.Shared.IoC;
|
|
||||||
using Robust.Shared.Localization;
|
|
||||||
using static Content.Shared.AME.SharedAMEControllerComponent;
|
|
||||||
using static Robust.Client.UserInterface.Controls.BoxContainer;
|
|
||||||
|
|
||||||
namespace Content.Client.AME.UI
|
|
||||||
{
|
|
||||||
public class AMEWindow : SS14Window
|
|
||||||
{
|
|
||||||
public Label InjectionStatus { get; set; }
|
|
||||||
public Button EjectButton { get; set; }
|
|
||||||
public Button ToggleInjection { get; set; }
|
|
||||||
public Button IncreaseFuelButton { get; set; }
|
|
||||||
public Button DecreaseFuelButton { get; set; }
|
|
||||||
public ProgressBar? FuelMeter { get; set; }
|
|
||||||
public Label FuelAmount { get; set; }
|
|
||||||
public Label InjectionAmount { get; set; }
|
|
||||||
public Label CoreCount { get; set; }
|
|
||||||
|
|
||||||
|
|
||||||
public AMEWindow()
|
|
||||||
{
|
|
||||||
IoCManager.InjectDependencies(this);
|
|
||||||
|
|
||||||
Title = Loc.GetString("ame-window-title");
|
|
||||||
|
|
||||||
MinSize = SetSize = (250, 250);
|
|
||||||
|
|
||||||
Contents.AddChild(new BoxContainer
|
|
||||||
{
|
|
||||||
Orientation = LayoutOrientation.Vertical,
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
new BoxContainer
|
|
||||||
{
|
|
||||||
Orientation = LayoutOrientation.Horizontal,
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
new Label {Text = Loc.GetString("ame-window-engine-status-label") + " "},
|
|
||||||
(InjectionStatus = new Label {Text = Loc.GetString("ame-window-engine-injection-status-not-injecting-label")})
|
|
||||||
}
|
|
||||||
},
|
|
||||||
new BoxContainer
|
|
||||||
{
|
|
||||||
Orientation = LayoutOrientation.Horizontal,
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
(ToggleInjection = new Button {Text = Loc.GetString("ame-window-toggle-injection-button"), StyleClasses = {StyleBase.ButtonOpenBoth}, Disabled = true}),
|
|
||||||
}
|
|
||||||
},
|
|
||||||
new BoxContainer
|
|
||||||
{
|
|
||||||
Orientation = LayoutOrientation.Horizontal,
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
new Label {Text = Loc.GetString("ame-window-fuel-status-label") + " "},
|
|
||||||
(FuelAmount = new Label {Text = Loc.GetString("ame-window-fuel-not-inserted-text")})
|
|
||||||
}
|
|
||||||
},
|
|
||||||
new BoxContainer
|
|
||||||
{
|
|
||||||
Orientation = LayoutOrientation.Horizontal,
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
(EjectButton = new Button {Text = Loc.GetString("ame-window-eject-button"), StyleClasses = {StyleBase.ButtonOpenBoth}, Disabled = true}),
|
|
||||||
}
|
|
||||||
},
|
|
||||||
new BoxContainer
|
|
||||||
{
|
|
||||||
Orientation = LayoutOrientation.Horizontal,
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
new Label {Text = Loc.GetString("ame-window-injection-amount-label") + " "},
|
|
||||||
(InjectionAmount = new Label {Text = "0"})
|
|
||||||
}
|
|
||||||
},
|
|
||||||
new BoxContainer
|
|
||||||
{
|
|
||||||
Orientation = LayoutOrientation.Horizontal,
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
(IncreaseFuelButton = new Button {Text = Loc.GetString("ame-window-increase-fuel-button"), StyleClasses = {StyleBase.ButtonOpenRight}}),
|
|
||||||
(DecreaseFuelButton = new Button {Text = Loc.GetString("ame-window-decrease-fuel-button"), StyleClasses = {StyleBase.ButtonOpenLeft}}),
|
|
||||||
}
|
|
||||||
},
|
|
||||||
new BoxContainer
|
|
||||||
{
|
|
||||||
Orientation = LayoutOrientation.Horizontal,
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
new Label { Text = Loc.GetString("ame-window-core-count-label") + " "},
|
|
||||||
(CoreCount = new Label { Text = "0"}),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// This searches recursively through all the children of "parent"
|
|
||||||
/// and sets the Disabled value of any buttons found to "val"
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="parent">The control which childrens get searched</param>
|
|
||||||
/// <param name="val">The value to which disabled gets set</param>
|
|
||||||
private void SetButtonDisabledRecursive(Control parent, bool val)
|
|
||||||
{
|
|
||||||
foreach (var child in parent.Children)
|
|
||||||
{
|
|
||||||
if (child is Button but)
|
|
||||||
{
|
|
||||||
but.Disabled = val;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (child.Children != null)
|
|
||||||
{
|
|
||||||
SetButtonDisabledRecursive(child, val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Update the UI state when new state data is received from the server.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="state">State data sent by the server.</param>
|
|
||||||
public void UpdateState(BoundUserInterfaceState state)
|
|
||||||
{
|
|
||||||
var castState = (AMEControllerBoundUserInterfaceState) state;
|
|
||||||
|
|
||||||
// Disable all buttons if not powered
|
|
||||||
if (Contents.Children != null)
|
|
||||||
{
|
|
||||||
SetButtonDisabledRecursive(Contents, !castState.HasPower);
|
|
||||||
EjectButton.Disabled = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!castState.HasFuelJar)
|
|
||||||
{
|
|
||||||
EjectButton.Disabled = true;
|
|
||||||
ToggleInjection.Disabled = true;
|
|
||||||
FuelAmount.Text = Loc.GetString("ame-window-fuel-not-inserted-text");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
EjectButton.Disabled = false;
|
|
||||||
ToggleInjection.Disabled = false;
|
|
||||||
FuelAmount.Text = $"{castState.FuelAmount}";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!castState.IsMaster)
|
|
||||||
{
|
|
||||||
ToggleInjection.Disabled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!castState.Injecting)
|
|
||||||
{
|
|
||||||
InjectionStatus.Text = Loc.GetString("ame-window-engine-injection-status-not-injecting-label") + " ";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
InjectionStatus.Text = Loc.GetString("ame-window-engine-injection-status-injecting-label") + " ";
|
|
||||||
}
|
|
||||||
|
|
||||||
CoreCount.Text = $"{castState.CoreCount}";
|
|
||||||
InjectionAmount.Text = $"{castState.InjectionAmount}";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
46
Content.Client/AME/UI/AMEWindow.xaml
Normal file
46
Content.Client/AME/UI/AMEWindow.xaml
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
<SS14Window xmlns="https://spacestation14.io"
|
||||||
|
Title="{Loc 'ame-window-title'}"
|
||||||
|
MinSize="250 250">
|
||||||
|
<BoxContainer Orientation="Vertical">
|
||||||
|
<BoxContainer Orientation="Horizontal">
|
||||||
|
<Label Text="{Loc 'ame-window-engine-status-label'}" />
|
||||||
|
<Label Text=" " />
|
||||||
|
<Label Name="InjectionStatus" Text="{Loc 'ame-window-engine-injection-status-not-injecting-label'}" />
|
||||||
|
</BoxContainer>
|
||||||
|
<BoxContainer Orientation="Horizontal">
|
||||||
|
<Button Name="ToggleInjection"
|
||||||
|
Text="{Loc 'ame-window-toggle-injection-button'}"
|
||||||
|
StyleClasses="OpenBoth"
|
||||||
|
Disabled="True" />
|
||||||
|
</BoxContainer>
|
||||||
|
<BoxContainer Orientation="Horizontal">
|
||||||
|
<Label Text="{Loc 'ame-window-fuel-status-label'}" />
|
||||||
|
<Label Text=" " />
|
||||||
|
<Label Name="FuelAmount" Text="{Loc 'ame-window-fuel-not-inserted-text'}" />
|
||||||
|
</BoxContainer>
|
||||||
|
<BoxContainer Orientation="Horizontal">
|
||||||
|
<Button Name="EjectButton"
|
||||||
|
Text="{Loc 'ame-window-eject-button'}"
|
||||||
|
StyleClasses="OpenBoth"
|
||||||
|
Disabled="True" />
|
||||||
|
</BoxContainer>
|
||||||
|
<BoxContainer Orientation="Horizontal">
|
||||||
|
<Label Text="{Loc 'ame-window-injection-amount-label'}" />
|
||||||
|
<Label Text=" " />
|
||||||
|
<Label Name="InjectionAmount" Text="0" />
|
||||||
|
</BoxContainer>
|
||||||
|
<BoxContainer Orientation="Horizontal">
|
||||||
|
<Button Name="IncreaseFuelButton"
|
||||||
|
Text="{Loc 'ame-window-increase-fuel-button'}"
|
||||||
|
StyleClasses="OpenRight" />
|
||||||
|
<Button Name="DecreaseFuelButton"
|
||||||
|
Text="{Loc 'ame-window-decrease-fuel-button'}"
|
||||||
|
StyleClasses="OpenLeft" />
|
||||||
|
</BoxContainer>
|
||||||
|
<BoxContainer Orientation="Horizontal">
|
||||||
|
<Label Text="{Loc 'ame-window-core-count-label'}" />
|
||||||
|
<Label Text=" " />
|
||||||
|
<Label Name="CoreCount" Text="0" />
|
||||||
|
</BoxContainer>
|
||||||
|
</BoxContainer>
|
||||||
|
</SS14Window>
|
||||||
73
Content.Client/AME/UI/AMEWindow.xaml.cs
Normal file
73
Content.Client/AME/UI/AMEWindow.xaml.cs
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
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.Shared.GameObjects;
|
||||||
|
using Robust.Shared.IoC;
|
||||||
|
using Robust.Shared.Localization;
|
||||||
|
using static Content.Shared.AME.SharedAMEControllerComponent;
|
||||||
|
|
||||||
|
namespace Content.Client.AME.UI
|
||||||
|
{
|
||||||
|
[GenerateTypedNameReferences]
|
||||||
|
public partial class AMEWindow : SS14Window
|
||||||
|
{
|
||||||
|
public AMEWindow(AMEControllerBoundUserInterface ui)
|
||||||
|
{
|
||||||
|
RobustXamlLoader.Load(this);
|
||||||
|
IoCManager.InjectDependencies(this);
|
||||||
|
|
||||||
|
EjectButton.OnPressed += _ => ui.ButtonPressed(UiButton.Eject);
|
||||||
|
ToggleInjection.OnPressed += _ => ui.ButtonPressed(UiButton.ToggleInjection);
|
||||||
|
IncreaseFuelButton.OnPressed += _ => ui.ButtonPressed(UiButton.IncreaseFuel);
|
||||||
|
DecreaseFuelButton.OnPressed += _ => ui.ButtonPressed(UiButton.DecreaseFuel);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Update the UI state when new state data is received from the server.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="state">State data sent by the server.</param>
|
||||||
|
public void UpdateState(BoundUserInterfaceState state)
|
||||||
|
{
|
||||||
|
var castState = (AMEControllerBoundUserInterfaceState) state;
|
||||||
|
|
||||||
|
// Disable all buttons if not powered
|
||||||
|
if (Contents.Children != null)
|
||||||
|
{
|
||||||
|
SetButtonDisabledRecursive(Contents, !castState.HasPower);
|
||||||
|
EjectButton.Disabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!castState.HasFuelJar)
|
||||||
|
{
|
||||||
|
EjectButton.Disabled = true;
|
||||||
|
ToggleInjection.Disabled = true;
|
||||||
|
FuelAmount.Text = Loc.GetString("ame-window-fuel-not-inserted-text");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
EjectButton.Disabled = false;
|
||||||
|
ToggleInjection.Disabled = false;
|
||||||
|
FuelAmount.Text = $"{castState.FuelAmount}";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!castState.IsMaster)
|
||||||
|
{
|
||||||
|
ToggleInjection.Disabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!castState.Injecting)
|
||||||
|
{
|
||||||
|
InjectionStatus.Text = Loc.GetString("ame-window-engine-injection-status-not-injecting-label") + " ";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
InjectionStatus.Text = Loc.GetString("ame-window-engine-injection-status-injecting-label") + " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
CoreCount.Text = $"{castState.CoreCount}";
|
||||||
|
InjectionAmount.Text = $"{castState.InjectionAmount}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,208 +0,0 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using Content.Shared.Access;
|
|
||||||
using Robust.Client.UserInterface;
|
|
||||||
using Robust.Client.UserInterface.Controls;
|
|
||||||
using Robust.Client.UserInterface.CustomControls;
|
|
||||||
using Robust.Shared.Localization;
|
|
||||||
using Robust.Shared.Maths;
|
|
||||||
using Robust.Shared.Prototypes;
|
|
||||||
using static Content.Shared.Access.SharedIdCardConsoleComponent;
|
|
||||||
using static Robust.Client.UserInterface.Controls.BoxContainer;
|
|
||||||
|
|
||||||
namespace Content.Client.Access.UI
|
|
||||||
{
|
|
||||||
public class IdCardConsoleWindow : SS14Window
|
|
||||||
{
|
|
||||||
private readonly Button _privilegedIdButton;
|
|
||||||
private readonly Button _targetIdButton;
|
|
||||||
|
|
||||||
private readonly Label _privilegedIdLabel;
|
|
||||||
private readonly Label _targetIdLabel;
|
|
||||||
|
|
||||||
private readonly Label _fullNameLabel;
|
|
||||||
private readonly LineEdit _fullNameLineEdit;
|
|
||||||
private readonly Label _jobTitleLabel;
|
|
||||||
private readonly LineEdit _jobTitleLineEdit;
|
|
||||||
|
|
||||||
private readonly Button _fullNameSaveButton;
|
|
||||||
private readonly Button _jobTitleSaveButton;
|
|
||||||
|
|
||||||
private readonly IdCardConsoleBoundUserInterface _owner;
|
|
||||||
|
|
||||||
private readonly Dictionary<string, Button> _accessButtons = new();
|
|
||||||
|
|
||||||
private string? _lastFullName;
|
|
||||||
private string? _lastJobTitle;
|
|
||||||
|
|
||||||
public IdCardConsoleWindow(IdCardConsoleBoundUserInterface owner, IPrototypeManager prototypeManager)
|
|
||||||
{
|
|
||||||
MinSize = SetSize = (650, 290);
|
|
||||||
_owner = owner;
|
|
||||||
var vBox = new BoxContainer
|
|
||||||
{
|
|
||||||
Orientation = LayoutOrientation.Vertical
|
|
||||||
};
|
|
||||||
|
|
||||||
vBox.AddChild(new GridContainer
|
|
||||||
{
|
|
||||||
Columns = 3,
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
new Label {Text = Loc.GetString("id-card-console-window-privileged-id")},
|
|
||||||
(_privilegedIdButton = new Button()),
|
|
||||||
(_privilegedIdLabel = new Label()),
|
|
||||||
|
|
||||||
new Label {Text = Loc.GetString("id-card-console-window-target-id")},
|
|
||||||
(_targetIdButton = new Button()),
|
|
||||||
(_targetIdLabel = new Label())
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
_privilegedIdButton.OnPressed += _ => _owner.ButtonPressed(UiButton.PrivilegedId);
|
|
||||||
_targetIdButton.OnPressed += _ => _owner.ButtonPressed(UiButton.TargetId);
|
|
||||||
|
|
||||||
// Separator
|
|
||||||
vBox.AddChild(new Control {MinSize = (0, 8)});
|
|
||||||
|
|
||||||
// Name and job title line edits.
|
|
||||||
vBox.AddChild(new GridContainer
|
|
||||||
{
|
|
||||||
Columns = 3,
|
|
||||||
HSeparationOverride = 4,
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
// Name
|
|
||||||
(_fullNameLabel = new Label
|
|
||||||
{
|
|
||||||
Text = Loc.GetString("id-card-console-window-full-name-label")
|
|
||||||
}),
|
|
||||||
(_fullNameLineEdit = new LineEdit
|
|
||||||
{
|
|
||||||
HorizontalExpand = true,
|
|
||||||
}),
|
|
||||||
(_fullNameSaveButton = new Button
|
|
||||||
{
|
|
||||||
Text = Loc.GetString("id-card-console-window-save-button"),
|
|
||||||
Disabled = true
|
|
||||||
}),
|
|
||||||
|
|
||||||
// Title
|
|
||||||
(_jobTitleLabel = new Label
|
|
||||||
{
|
|
||||||
Text = Loc.GetString("id-card-console-window-job-title-label")
|
|
||||||
}),
|
|
||||||
(_jobTitleLineEdit = new LineEdit
|
|
||||||
{
|
|
||||||
HorizontalExpand = true
|
|
||||||
}),
|
|
||||||
(_jobTitleSaveButton = new Button
|
|
||||||
{
|
|
||||||
Text = Loc.GetString("id-card-console-window-save-button"),
|
|
||||||
Disabled = true
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
_fullNameLineEdit.OnTextEntered += _ => SubmitData();
|
|
||||||
_fullNameLineEdit.OnTextChanged += _ =>
|
|
||||||
{
|
|
||||||
_fullNameSaveButton.Disabled = _fullNameSaveButton.Text == _lastFullName;
|
|
||||||
};
|
|
||||||
_fullNameSaveButton.OnPressed += _ => SubmitData();
|
|
||||||
|
|
||||||
_jobTitleLineEdit.OnTextEntered += _ => SubmitData();
|
|
||||||
_jobTitleLineEdit.OnTextChanged += _ =>
|
|
||||||
{
|
|
||||||
_jobTitleSaveButton.Disabled = _jobTitleLineEdit.Text == _lastJobTitle;
|
|
||||||
};
|
|
||||||
_jobTitleSaveButton.OnPressed += _ => SubmitData();
|
|
||||||
|
|
||||||
// Separator
|
|
||||||
vBox.AddChild(new Control {MinSize = (0, 8)});
|
|
||||||
|
|
||||||
{
|
|
||||||
var grid = new GridContainer
|
|
||||||
{
|
|
||||||
Columns = 5,
|
|
||||||
HorizontalAlignment = HAlignment.Center
|
|
||||||
};
|
|
||||||
vBox.AddChild(grid);
|
|
||||||
|
|
||||||
foreach (var accessLevel in prototypeManager.EnumeratePrototypes<AccessLevelPrototype>())
|
|
||||||
{
|
|
||||||
var newButton = new Button
|
|
||||||
{
|
|
||||||
Text = accessLevel.Name,
|
|
||||||
ToggleMode = true,
|
|
||||||
};
|
|
||||||
grid.AddChild(newButton);
|
|
||||||
_accessButtons.Add(accessLevel.ID, newButton);
|
|
||||||
newButton.OnPressed += _ => SubmitData();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Contents.AddChild(vBox);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void UpdateState(IdCardConsoleBoundUserInterfaceState state)
|
|
||||||
{
|
|
||||||
_privilegedIdButton.Text = state.IsPrivilegedIdPresent
|
|
||||||
? Loc.GetString("id-card-console-window-eject-button")
|
|
||||||
: Loc.GetString("id-card-console-window-insert-button");
|
|
||||||
|
|
||||||
_privilegedIdLabel.Text = state.PrivilegedIdName;
|
|
||||||
|
|
||||||
_targetIdButton.Text = state.IsTargetIdPresent
|
|
||||||
? Loc.GetString("id-card-console-window-eject-button")
|
|
||||||
: Loc.GetString("id-card-console-window-insert-button");
|
|
||||||
|
|
||||||
_targetIdLabel.Text = state.TargetIdName;
|
|
||||||
|
|
||||||
var interfaceEnabled =
|
|
||||||
state.IsPrivilegedIdPresent && state.IsPrivilegedIdAuthorized && state.IsTargetIdPresent;
|
|
||||||
|
|
||||||
var fullNameDirty = _lastFullName != null && _fullNameLineEdit.Text != state.TargetIdFullName;
|
|
||||||
var jobTitleDirty = _lastJobTitle != null && _jobTitleLineEdit.Text != state.TargetIdJobTitle;
|
|
||||||
|
|
||||||
_fullNameLabel.Modulate = interfaceEnabled ? Color.White : Color.Gray;
|
|
||||||
_fullNameLineEdit.Editable = interfaceEnabled;
|
|
||||||
if (!fullNameDirty)
|
|
||||||
{
|
|
||||||
_fullNameLineEdit.Text = state.TargetIdFullName ?? string.Empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
_fullNameSaveButton.Disabled = !interfaceEnabled || !fullNameDirty;
|
|
||||||
|
|
||||||
_jobTitleLabel.Modulate = interfaceEnabled ? Color.White : Color.Gray;
|
|
||||||
_jobTitleLineEdit.Editable = interfaceEnabled;
|
|
||||||
if (!jobTitleDirty)
|
|
||||||
{
|
|
||||||
_jobTitleLineEdit.Text = state.TargetIdJobTitle ?? string.Empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
_jobTitleSaveButton.Disabled = !interfaceEnabled || !jobTitleDirty;
|
|
||||||
|
|
||||||
foreach (var (accessName, button) in _accessButtons)
|
|
||||||
{
|
|
||||||
button.Disabled = !interfaceEnabled;
|
|
||||||
if (interfaceEnabled)
|
|
||||||
{
|
|
||||||
button.Pressed = state.TargetIdAccessList?.Contains(accessName) ?? false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_lastFullName = state.TargetIdFullName;
|
|
||||||
_lastJobTitle = state.TargetIdJobTitle;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SubmitData()
|
|
||||||
{
|
|
||||||
_owner.SubmitData(
|
|
||||||
_fullNameLineEdit.Text,
|
|
||||||
_jobTitleLineEdit.Text,
|
|
||||||
// Iterate over the buttons dictionary, filter by `Pressed`, only get key from the key/value pair
|
|
||||||
_accessButtons.Where(x => x.Value.Pressed).Select(x => x.Key).ToList());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
30
Content.Client/Access/UI/IdCardConsoleWindow.xaml
Normal file
30
Content.Client/Access/UI/IdCardConsoleWindow.xaml
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
<SS14Window xmlns="https://spacestation14.io"
|
||||||
|
MinSize="650 290">
|
||||||
|
<BoxContainer Orientation="Vertical">
|
||||||
|
<GridContainer Columns="3">
|
||||||
|
<Label Text="{Loc 'id-card-console-window-privileged-id'}" />
|
||||||
|
<Button Name="PrivilegedIdButton" />
|
||||||
|
<Label Name="PrivilegedIdLabel" />
|
||||||
|
|
||||||
|
<Label Text="{Loc 'id-card-console-window-target-id'}" />
|
||||||
|
<Button Name="TargetIdButton" />
|
||||||
|
<Label Name="TargetIdLabel" />
|
||||||
|
</GridContainer>
|
||||||
|
<Control MinSize="0 8" />
|
||||||
|
<GridContainer Columns="3" HSeparationOverride="4">
|
||||||
|
<Label Name="FullNameLabel" Text="{Loc 'id-card-console-window-full-name-label'}" />
|
||||||
|
<LineEdit Name="FullNameLineEdit" HorizontalExpand="True" />
|
||||||
|
<Button Name="FullNameSaveButton" Text="{Loc 'id-card-console-window-save-button'}" Disabled="True" />
|
||||||
|
|
||||||
|
<Label Name="JobTitleLabel" Text="{Loc 'id-card-console-window-job-title-label'}" />
|
||||||
|
<LineEdit Name="JobTitleLineEdit" HorizontalExpand="True" />
|
||||||
|
<Button Name="JobTitleSaveButton" Text="{Loc 'id-card-console-window-save-button'}" Disabled="True" />
|
||||||
|
</GridContainer>
|
||||||
|
<Control MinSize="0 8" />
|
||||||
|
<GridContainer Name="AccessLevelGrid" Columns="5" HorizontalAlignment="Center">
|
||||||
|
|
||||||
|
<!-- Access level buttons are added here by the C# code -->
|
||||||
|
|
||||||
|
</GridContainer>
|
||||||
|
</BoxContainer>
|
||||||
|
</SS14Window>
|
||||||
121
Content.Client/Access/UI/IdCardConsoleWindow.xaml.cs
Normal file
121
Content.Client/Access/UI/IdCardConsoleWindow.xaml.cs
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using Content.Shared.Access;
|
||||||
|
using Robust.Client.AutoGenerated;
|
||||||
|
using Robust.Client.UserInterface.Controls;
|
||||||
|
using Robust.Client.UserInterface.CustomControls;
|
||||||
|
using Robust.Client.UserInterface.XAML;
|
||||||
|
using Robust.Shared.Localization;
|
||||||
|
using Robust.Shared.Maths;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
using static Content.Shared.Access.SharedIdCardConsoleComponent;
|
||||||
|
|
||||||
|
namespace Content.Client.Access.UI
|
||||||
|
{
|
||||||
|
[GenerateTypedNameReferences]
|
||||||
|
public partial class IdCardConsoleWindow : SS14Window
|
||||||
|
{
|
||||||
|
private readonly IdCardConsoleBoundUserInterface _owner;
|
||||||
|
|
||||||
|
private readonly Dictionary<string, Button> _accessButtons = new();
|
||||||
|
|
||||||
|
private string? _lastFullName;
|
||||||
|
private string? _lastJobTitle;
|
||||||
|
|
||||||
|
public IdCardConsoleWindow(IdCardConsoleBoundUserInterface owner, IPrototypeManager prototypeManager)
|
||||||
|
{
|
||||||
|
RobustXamlLoader.Load(this);
|
||||||
|
|
||||||
|
_owner = owner;
|
||||||
|
|
||||||
|
PrivilegedIdButton.OnPressed += _ => _owner.ButtonPressed(UiButton.PrivilegedId);
|
||||||
|
TargetIdButton.OnPressed += _ => _owner.ButtonPressed(UiButton.TargetId);
|
||||||
|
|
||||||
|
FullNameLineEdit.OnTextEntered += _ => SubmitData();
|
||||||
|
FullNameLineEdit.OnTextChanged += _ =>
|
||||||
|
{
|
||||||
|
FullNameSaveButton.Disabled = FullNameSaveButton.Text == _lastFullName;
|
||||||
|
};
|
||||||
|
FullNameSaveButton.OnPressed += _ => SubmitData();
|
||||||
|
|
||||||
|
JobTitleLineEdit.OnTextEntered += _ => SubmitData();
|
||||||
|
JobTitleLineEdit.OnTextChanged += _ =>
|
||||||
|
{
|
||||||
|
JobTitleSaveButton.Disabled = JobTitleLineEdit.Text == _lastJobTitle;
|
||||||
|
};
|
||||||
|
JobTitleSaveButton.OnPressed += _ => SubmitData();
|
||||||
|
|
||||||
|
foreach (var accessLevel in prototypeManager.EnumeratePrototypes<AccessLevelPrototype>())
|
||||||
|
{
|
||||||
|
var newButton = new Button
|
||||||
|
{
|
||||||
|
Text = accessLevel.Name,
|
||||||
|
ToggleMode = true,
|
||||||
|
};
|
||||||
|
AccessLevelGrid.AddChild(newButton);
|
||||||
|
_accessButtons.Add(accessLevel.ID, newButton);
|
||||||
|
newButton.OnPressed += _ => SubmitData();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateState(IdCardConsoleBoundUserInterfaceState state)
|
||||||
|
{
|
||||||
|
PrivilegedIdButton.Text = state.IsPrivilegedIdPresent
|
||||||
|
? Loc.GetString("id-card-console-window-eject-button")
|
||||||
|
: Loc.GetString("id-card-console-window-insert-button");
|
||||||
|
|
||||||
|
PrivilegedIdLabel.Text = state.PrivilegedIdName;
|
||||||
|
|
||||||
|
TargetIdButton.Text = state.IsTargetIdPresent
|
||||||
|
? Loc.GetString("id-card-console-window-eject-button")
|
||||||
|
: Loc.GetString("id-card-console-window-insert-button");
|
||||||
|
|
||||||
|
TargetIdLabel.Text = state.TargetIdName;
|
||||||
|
|
||||||
|
var interfaceEnabled =
|
||||||
|
state.IsPrivilegedIdPresent && state.IsPrivilegedIdAuthorized && state.IsTargetIdPresent;
|
||||||
|
|
||||||
|
var fullNameDirty = _lastFullName != null && FullNameLineEdit.Text != state.TargetIdFullName;
|
||||||
|
var jobTitleDirty = _lastJobTitle != null && JobTitleLineEdit.Text != state.TargetIdJobTitle;
|
||||||
|
|
||||||
|
FullNameLabel.Modulate = interfaceEnabled ? Color.White : Color.Gray;
|
||||||
|
FullNameLineEdit.Editable = interfaceEnabled;
|
||||||
|
if (!fullNameDirty)
|
||||||
|
{
|
||||||
|
FullNameLineEdit.Text = state.TargetIdFullName ?? string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
FullNameSaveButton.Disabled = !interfaceEnabled || !fullNameDirty;
|
||||||
|
|
||||||
|
JobTitleLabel.Modulate = interfaceEnabled ? Color.White : Color.Gray;
|
||||||
|
JobTitleLineEdit.Editable = interfaceEnabled;
|
||||||
|
if (!jobTitleDirty)
|
||||||
|
{
|
||||||
|
JobTitleLineEdit.Text = state.TargetIdJobTitle ?? string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
JobTitleSaveButton.Disabled = !interfaceEnabled || !jobTitleDirty;
|
||||||
|
|
||||||
|
foreach (var (accessName, button) in _accessButtons)
|
||||||
|
{
|
||||||
|
button.Disabled = !interfaceEnabled;
|
||||||
|
if (interfaceEnabled)
|
||||||
|
{
|
||||||
|
button.Pressed = state.TargetIdAccessList?.Contains(accessName) ?? false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_lastFullName = state.TargetIdFullName;
|
||||||
|
_lastJobTitle = state.TargetIdJobTitle;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SubmitData()
|
||||||
|
{
|
||||||
|
_owner.SubmitData(
|
||||||
|
FullNameLineEdit.Text,
|
||||||
|
JobTitleLineEdit.Text,
|
||||||
|
// Iterate over the buttons dictionary, filter by `Pressed`, only get key from the key/value pair
|
||||||
|
_accessButtons.Where(x => x.Value.Pressed).Select(x => x.Key).ToList());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
10
Content.Client/Alerts/UI/AlertsUI.xaml
Normal file
10
Content.Client/Alerts/UI/AlertsUI.xaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<Control xmlns="https://spacestation14.io"
|
||||||
|
MinSize="64 64">
|
||||||
|
<PanelContainer StyleClasses="TransparentBorderedWindowPanel"
|
||||||
|
HorizontalAlignment="Right"
|
||||||
|
VerticalAlignment="Top">
|
||||||
|
<GridContainer Name="AlertContainer" MaxGridHeight="64" ExpandBackwards="True">
|
||||||
|
|
||||||
|
</GridContainer>
|
||||||
|
</PanelContainer>
|
||||||
|
</Control>
|
||||||
@@ -1,8 +1,9 @@
|
|||||||
using Content.Client.Chat.Managers;
|
using Content.Client.Chat.Managers;
|
||||||
using Content.Client.Chat.UI;
|
using Content.Client.Chat.UI;
|
||||||
using Content.Client.Stylesheets;
|
using Robust.Client.AutoGenerated;
|
||||||
using Robust.Client.UserInterface;
|
using Robust.Client.UserInterface;
|
||||||
using Robust.Client.UserInterface.Controls;
|
using Robust.Client.UserInterface.Controls;
|
||||||
|
using Robust.Client.UserInterface.XAML;
|
||||||
using Robust.Shared.IoC;
|
using Robust.Shared.IoC;
|
||||||
|
|
||||||
namespace Content.Client.Alerts.UI
|
namespace Content.Client.Alerts.UI
|
||||||
@@ -10,13 +11,20 @@ namespace Content.Client.Alerts.UI
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// The status effects display on the right side of the screen.
|
/// The status effects display on the right side of the screen.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public sealed class AlertsUI : Control
|
[GenerateTypedNameReferences]
|
||||||
|
public sealed partial class AlertsUI : Control
|
||||||
{
|
{
|
||||||
|
[Dependency] private readonly IChatManager _chatManager = default!;
|
||||||
|
|
||||||
public const float ChatSeparation = 38f;
|
public const float ChatSeparation = 38f;
|
||||||
public GridContainer Grid { get; }
|
|
||||||
|
public GridContainer Grid => AlertContainer;
|
||||||
|
|
||||||
public AlertsUI()
|
public AlertsUI()
|
||||||
{
|
{
|
||||||
|
IoCManager.InjectDependencies(this);
|
||||||
|
RobustXamlLoader.Load(this);
|
||||||
|
|
||||||
LayoutContainer.SetGrowHorizontal(this, LayoutContainer.GrowDirection.Begin);
|
LayoutContainer.SetGrowHorizontal(this, LayoutContainer.GrowDirection.Begin);
|
||||||
LayoutContainer.SetGrowVertical(this, LayoutContainer.GrowDirection.End);
|
LayoutContainer.SetGrowVertical(this, LayoutContainer.GrowDirection.End);
|
||||||
LayoutContainer.SetAnchorTop(this, 0f);
|
LayoutContainer.SetAnchorTop(this, 0f);
|
||||||
@@ -25,28 +33,11 @@ namespace Content.Client.Alerts.UI
|
|||||||
LayoutContainer.SetMarginBottom(this, -180);
|
LayoutContainer.SetMarginBottom(this, -180);
|
||||||
LayoutContainer.SetMarginTop(this, 250);
|
LayoutContainer.SetMarginTop(this, 250);
|
||||||
LayoutContainer.SetMarginRight(this, -10);
|
LayoutContainer.SetMarginRight(this, -10);
|
||||||
var panelContainer = new PanelContainer
|
|
||||||
{
|
|
||||||
StyleClasses = {StyleNano.StyleClassTransparentBorderedWindowPanel},
|
|
||||||
HorizontalAlignment = HAlignment.Right,
|
|
||||||
VerticalAlignment = VAlignment.Top
|
|
||||||
};
|
|
||||||
AddChild(panelContainer);
|
|
||||||
|
|
||||||
Grid = new GridContainer
|
|
||||||
{
|
|
||||||
MaxGridHeight = 64,
|
|
||||||
ExpandBackwards = true
|
|
||||||
};
|
|
||||||
panelContainer.AddChild(Grid);
|
|
||||||
|
|
||||||
MinSize = (64, 64);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void EnteredTree()
|
protected override void EnteredTree()
|
||||||
{
|
{
|
||||||
base.EnteredTree();
|
base.EnteredTree();
|
||||||
var _chatManager = IoCManager.Resolve<IChatManager>();
|
|
||||||
_chatManager.OnChatBoxResized += OnChatResized;
|
_chatManager.OnChatBoxResized += OnChatResized;
|
||||||
OnChatResized(new ChatResizedEventArgs(HudChatBox.InitialChatBottom));
|
OnChatResized(new ChatResizedEventArgs(HudChatBox.InitialChatBottom));
|
||||||
}
|
}
|
||||||
@@ -54,15 +45,12 @@ namespace Content.Client.Alerts.UI
|
|||||||
protected override void ExitedTree()
|
protected override void ExitedTree()
|
||||||
{
|
{
|
||||||
base.ExitedTree();
|
base.ExitedTree();
|
||||||
var _chatManager = IoCManager.Resolve<IChatManager>();
|
|
||||||
_chatManager.OnChatBoxResized -= OnChatResized;
|
_chatManager.OnChatBoxResized -= OnChatResized;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void OnChatResized(ChatResizedEventArgs chatResizedEventArgs)
|
private void OnChatResized(ChatResizedEventArgs chatResizedEventArgs)
|
||||||
{
|
{
|
||||||
// resize us to fit just below the chatbox
|
// resize us to fit just below the chatbox
|
||||||
var _chatManager = IoCManager.Resolve<IChatManager>();
|
|
||||||
if (_chatManager.CurrentChatBox != null)
|
if (_chatManager.CurrentChatBox != null)
|
||||||
{
|
{
|
||||||
LayoutContainer.SetMarginTop(this, chatResizedEventArgs.NewBottom + ChatSeparation);
|
LayoutContainer.SetMarginTop(this, chatResizedEventArgs.NewBottom + ChatSeparation);
|
||||||
@@ -81,12 +69,12 @@ namespace Content.Client.Alerts.UI
|
|||||||
// this is here because there isn't currently a good way to allow the grid to adjust its height based
|
// this is here because there isn't currently a good way to allow the grid to adjust its height based
|
||||||
// on constraints, otherwise we would use anchors to lay it out
|
// on constraints, otherwise we would use anchors to lay it out
|
||||||
base.Resized();
|
base.Resized();
|
||||||
Grid.MaxGridHeight = Height;
|
AlertContainer.MaxGridHeight = Height;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void UIScaleChanged()
|
protected override void UIScaleChanged()
|
||||||
{
|
{
|
||||||
Grid.MaxGridHeight = Height;
|
AlertContainer.MaxGridHeight = Height;
|
||||||
base.UIScaleChanged();
|
base.UIScaleChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -284,29 +284,6 @@ namespace Content.Client.Chemistry.UI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// This searches recursively through all the children of "parent"
|
|
||||||
/// and sets the Disabled value of any buttons found to "val"
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="parent">The control which childrens get searched</param>
|
|
||||||
/// <param name="val">The value to which disabled gets set</param>
|
|
||||||
private void SetButtonDisabledRecursive(Control parent, bool val)
|
|
||||||
{
|
|
||||||
foreach (var child in parent.Children)
|
|
||||||
{
|
|
||||||
if (child is Button but)
|
|
||||||
{
|
|
||||||
but.Disabled = val;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (child.Children != null)
|
|
||||||
{
|
|
||||||
SetButtonDisabledRecursive(child, val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Update the container, buffer, and packaging panels.
|
/// Update the container, buffer, and packaging panels.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -173,29 +173,6 @@ namespace Content.Client.Chemistry.UI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// This searches recursively through all the children of "parent"
|
|
||||||
/// and sets the Disabled value of any buttons found to "val"
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="parent">The control which childrens get searched</param>
|
|
||||||
/// <param name="val">The value to which disabled gets set</param>
|
|
||||||
private void SetButtonDisabledRecursive(Control parent, bool val)
|
|
||||||
{
|
|
||||||
foreach (var child in parent.Children)
|
|
||||||
{
|
|
||||||
if (child is Button but)
|
|
||||||
{
|
|
||||||
but.Disabled = val;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (child.Children != null)
|
|
||||||
{
|
|
||||||
SetButtonDisabledRecursive(child, val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Update the UI state when new state data is received from the server.
|
/// Update the UI state when new state data is received from the server.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user