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.Components.SharedIdCardConsoleComponent; namespace Content.Client.Access.UI { [GenerateTypedNameReferences] public partial class IdCardConsoleWindow : SS14Window { private readonly IdCardConsoleBoundUserInterface _owner; private readonly Dictionary _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()) { 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()); } } }