using System.Linq; using System.Numerics; using Content.Shared.Access; using Content.Shared.Access.Components; using Content.Shared.Roles; using Robust.Client.AutoGenerated; using Robust.Client.ResourceManagement; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.XAML; using Robust.Shared.Prototypes; using Robust.Shared.Utility; using static Content.Shared.Access.Components.IdCardConsoleComponent; namespace Content.Client.Access.UI { [GenerateTypedNameReferences] public sealed partial class IdCardConsoleWindow : DefaultWindow { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly ILogManager _logManager = default!; [Dependency] private readonly IResourceCache _resource = default!; //WD-EDIT [Dependency] private readonly IEntityManager _entityManager = default!; //WD-EDIT private readonly IdCardConsoleBoundUserInterface _owner; private GridContainer _grid = default!; private readonly AccessLevelControl _groupAccessButtons = new(); private readonly Dictionary _jobIconButtons = new(); //WD-EDIT private string _newJob = ""; private string? _lastFullName; private string? _lastJobTitle; private string? _lastJobProto; private string? _lastJobIcon; //WD-EDIT public IdCardConsoleWindow( IdCardConsoleBoundUserInterface owner, IPrototypeManager prototypeManager, List>> accessLevels) { RobustXamlLoader.Load(this); IoCManager.InjectDependencies(this); _owner = owner; 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(); _groupAccessButtons.PopulateForConsole(accessLevels, prototypeManager); foreach (var department in _groupAccessButtons.ButtonGroups) { var departmentGrid = new GridContainer {}; foreach (var button in department.Values) { departmentGrid.AddChild(button); } AccessLevelControlContainer.AddChild(departmentGrid); } foreach (var department in _groupAccessButtons.ButtonGroups) { foreach (var button in department.Values) { button.OnPressed += _ => SubmitData(); } } //WD-EDIT if (!_entityManager.TryGetComponent(owner.Owner, out var idConsoleComponent)) return; var path = new ResPath("/Textures/Interface/Misc/job_icons.rsi"); _resource.TryGetResource(path, out RSIResource? rsi); if (rsi == null) return; foreach (var department in idConsoleComponent.JobIcons) { _grid = new GridContainer { Columns = department.Count }; foreach (var jobIcon in department) { var newButton = new TextureButton { TextureNormal = rsi.RSI.TryGetState(jobIcon, out var state) ? state.Frame0 : rsi.RSI.TryGetState("CustomId", out var customState) ? customState.Frame0 : null, Scale = new Vector2(5, 5) }; _jobIconButtons.TryAdd(jobIcon, newButton); newButton.OnPressed += _ => { SelectJobPreset(jobIcon); _newJob = jobIcon; _lastJobIcon = "JobIcon" + jobIcon; SubmitData(); }; _grid.AddChild(newButton); } JobIconsGrid.AddChild(_grid); } //WD-EDIT } private void ClearAllAccess() { foreach (var group in _groupAccessButtons.ButtonGroups) { foreach (var button in group.Values) { if (button.Pressed) { button.Pressed = false; } } } } private void SelectJobPreset(string jobName) { if (!_prototypeManager.TryIndex(jobName, out JobPrototype? job)) { return; } JobTitleLineEdit.Text = Loc.GetString(job.Name); ClearAllAccess(); // this is a sussy way to do this foreach (var access in job.Access) { foreach (var group in _groupAccessButtons.ButtonGroups) { if (group.TryGetValue(access, out var button) && !button.Disabled) { button.Pressed = true; } } } foreach (var group in job.AccessGroups) { if (!_prototypeManager.TryIndex(group, out AccessGroupPrototype? groupPrototype)) continue; foreach (var access in groupPrototype.Tags) { foreach (var buttonGroup in _groupAccessButtons.ButtonGroups) { if (buttonGroup.TryGetValue(access, out var button) && !button.Disabled) button.Pressed = true; } } } _lastJobIcon = job.Icon; 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; _groupAccessButtons.UpdateStateConsole(state.TargetIdAccessList?.ToList() ?? new List>(), state.AllowedModifyAccessList?.ToList() ?? new List>()); //WD-EDIT if (_resource.TryGetResource(new ResPath("/Textures/Interface/Misc/job_icons.rsi"), out RSIResource? rsi)) { CurrentJobIcon.RemoveAllChildren(); var newLabel = new Label { Text = "Текущая выбранная иконка для роли: " }; CurrentJobIcon.AddChild(newLabel); var newIcon = new TextureRect { Texture = rsi.RSI.TryGetState(state.TargetIdJobIcon?.Replace("JobIcon", ""), out var iconState) ? iconState.Frame0 : rsi.RSI.TryGetState("CustomId", out var customState) ? customState.Frame0 : null, TextureScale = new Vector2(4, 4) }; CurrentJobIcon.AddChild(newIcon); } foreach (var (jobIcon, button) in _jobIconButtons) { button.Disabled = !interfaceEnabled; button.Pressed = state.TargetIdJobIcon?.Contains(jobIcon) ?? false; } //WD-EDIT _lastFullName = state.TargetIdFullName; _lastJobTitle = state.TargetIdJobTitle; _lastJobProto = state.TargetIdJobPrototype; } private void SubmitData() { // Don't send this if it isn't dirty. var jobProtoDirty = _lastJobProto != null && _newJob != _lastJobProto; _owner.SubmitData( FullNameLineEdit.Text, JobTitleLineEdit.Text, // Iterate over the buttons dictionary, filter by `Pressed`, only get key from the key/value pair _groupAccessButtons.ButtonGroups .SelectMany(dict => dict) .Where(x => x.Value.Pressed) .Select(x => x.Key) .ToList(), jobProtoDirty ? _newJob : string.Empty, _lastJobIcon); } } }