283 lines
10 KiB
C#
283 lines
10 KiB
C#
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<string, TextureButton> _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<List<ProtoId<AccessLevelPrototype>>> 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<IdCardConsoleComponent>(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<ProtoId<AccessLevelPrototype>>(),
|
|
state.AllowedModifyAccessList?.ToList() ??
|
|
new List<ProtoId<AccessLevelPrototype>>());
|
|
|
|
//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);
|
|
}
|
|
}
|
|
}
|