feat: смена значков в консоли ID карт

This commit is contained in:
Remuchi
2024-01-24 15:15:13 +07:00
parent cf8709f1ea
commit e09cc7b802
5 changed files with 213 additions and 28 deletions

View File

@@ -42,7 +42,9 @@ namespace Content.Client.Access.UI
};
_window.CrewManifestButton.OnPressed += _ => SendMessage(new CrewManifestOpenUiMessage());
_window.PrivilegedIdButton.OnPressed += _ => SendMessage(new ItemSlotButtonPressedEvent(PrivilegedIdCardSlotId));
_window.PrivilegedIdButton.OnPressed +=
_ => SendMessage(new ItemSlotButtonPressedEvent(PrivilegedIdCardSlotId));
_window.TargetIdButton.OnPressed += _ => SendMessage(new ItemSlotButtonPressedEvent(TargetIdCardSlotId));
_window.OnClose += Close;
@@ -65,7 +67,12 @@ namespace Content.Client.Access.UI
_window?.UpdateState(castState);
}
public void SubmitData(string newFullName, string newJobTitle, List<string> newAccessList, string newJobPrototype)
public void SubmitData(
string newFullName,
string newJobTitle,
List<string> newAccessList,
string newJobPrototype,
string? newJobIcon)
{
if (newFullName.Length > MaxFullNameLength)
newFullName = newFullName[..MaxFullNameLength];
@@ -77,7 +84,8 @@ namespace Content.Client.Access.UI
newFullName,
newJobTitle,
newAccessList,
newJobPrototype));
newJobPrototype,
newJobIcon));
}
}
}

View File

@@ -1,14 +1,14 @@
<DefaultWindow xmlns="https://spacestation14.io"
MinSize="650 290">
MinSize="650 290">
<BoxContainer Orientation="Vertical">
<GridContainer Columns="2">
<GridContainer Columns="3" HorizontalExpand="True">
<Label Text="{Loc 'id-card-console-window-privileged-id'}" />
<Button Name="PrivilegedIdButton" Access="Public"/>
<Button Name="PrivilegedIdButton" Access="Public" />
<Label Name="PrivilegedIdLabel" />
<Label Text="{Loc 'id-card-console-window-target-id'}" />
<Button Name="TargetIdButton" Access="Public"/>
<Button Name="TargetIdButton" Access="Public" />
<Label Name="TargetIdLabel" />
</GridContainer>
<BoxContainer Orientation="Vertical">
@@ -35,5 +35,13 @@
<!-- Access level buttons are added here by the C# code -->
</GridContainer>
<!-- WD EDIT -->
<GridContainer Name="CurrentJobIcon" Columns="2">
<Label Text="Текущая выбранная иконка для роли: " />
</GridContainer>
<GridContainer Name="JobIconsGrid" Columns="10" HorizontalAlignment="Center">
<!-- Job icon buttons are generated in the code -->
</GridContainer>
<!-- WD EDIT END -->
</BoxContainer>
</DefaultWindow>

View File

@@ -1,12 +1,16 @@
using System.Linq;
using System.Numerics;
using Content.Shared.Access;
using Content.Shared.Access.Components;
using Content.Shared.Access.Systems;
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
@@ -16,18 +20,24 @@ namespace Content.Client.Access.UI
{
[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 ISawmill _logMill = default!;
private readonly IdCardConsoleBoundUserInterface _owner;
private readonly Dictionary<string, Button> _accessButtons = new();
private readonly Dictionary<string, TextureButton> _jobIconButtons = new(); //WD-EDIT
private readonly List<string> _jobPrototypeIds = new();
private string? _lastFullName;
private string? _lastJobTitle;
private string? _lastJobProto;
private string? _lastJobIcon; //WD-EDIT
public IdCardConsoleWindow(IdCardConsoleBoundUserInterface owner, IPrototypeManager prototypeManager,
public IdCardConsoleWindow(
IdCardConsoleBoundUserInterface owner,
IPrototypeManager prototypeManager,
List<ProtoId<AccessLevelPrototype>> accessLevels)
{
RobustXamlLoader.Load(this);
@@ -41,6 +51,7 @@ namespace Content.Client.Access.UI
{
FullNameSaveButton.Disabled = FullNameSaveButton.Text == _lastFullName;
};
FullNameSaveButton.OnPressed += _ => SubmitData();
JobTitleLineEdit.OnTextEntered += _ => SubmitData();
@@ -48,6 +59,7 @@ namespace Content.Client.Access.UI
{
JobTitleSaveButton.Disabled = JobTitleLineEdit.Text == _lastJobTitle;
};
JobTitleSaveButton.OnPressed += _ => SubmitData();
var jobs = _prototypeManager.EnumeratePrototypes<JobPrototype>().ToList();
@@ -69,7 +81,7 @@ namespace Content.Client.Access.UI
foreach (var access in accessLevels)
{
if (!prototypeManager.TryIndex<AccessLevelPrototype>(access, out var accessLevel))
if (!prototypeManager.TryIndex(access, out var accessLevel))
{
_logMill.Error($"Unable to find accesslevel for {access}");
continue;
@@ -78,19 +90,50 @@ namespace Content.Client.Access.UI
var newButton = new Button
{
Text = GetAccessLevelName(accessLevel),
ToggleMode = true,
ToggleMode = true
};
_accessButtons.Add(accessLevel.ID, newButton);
newButton.OnPressed += _ => SubmitData();
buttonsToAdd.Add(newButton);
}
buttonsToAdd.Sort((x,y) => string.Compare(x.Text, y.Text, StringComparison.Ordinal));
buttonsToAdd.Sort((x, y) => string.Compare(x.Text, y.Text, StringComparison.Ordinal));
foreach (var button in buttonsToAdd)
{
AccessLevelGrid.AddChild(button);
}
//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 jobIcon in idConsoleComponent.JobIcons)
{
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.Add(jobIcon, newButton);
newButton.OnPressed += _ =>
{
_lastJobIcon = jobIcon;
SubmitData();
};
JobIconsGrid.AddChild(newButton);
}
//WD-EDIT
}
private static string GetAccessLevelName(AccessLevelPrototype prototype)
@@ -149,6 +192,7 @@ namespace Content.Client.Access.UI
}
}
_lastJobIcon = job.Icon;
SubmitData();
}
@@ -195,11 +239,11 @@ namespace Content.Client.Access.UI
foreach (var (accessName, button) in _accessButtons)
{
button.Disabled = !interfaceEnabled;
if (interfaceEnabled)
{
button.Pressed = state.TargetIdAccessList?.Contains(accessName) ?? false;
button.Disabled = (!state.AllowedModifyAccessList?.Contains(accessName)) ?? true;
}
if (!interfaceEnabled)
continue;
button.Pressed = state.TargetIdAccessList?.Contains(accessName) ?? false;
button.Disabled = !state.AllowedModifyAccessList?.Contains(accessName) ?? true;
}
var jobIndex = _jobPrototypeIds.IndexOf(state.TargetIdJobPrototype);
@@ -208,6 +252,37 @@ namespace Content.Client.Access.UI
JobPresetOptionButton.SelectId(jobIndex);
}
//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 == jobIcon;
}
//WD-EDIT
_lastFullName = state.TargetIdFullName;
_lastJobTitle = state.TargetIdJobTitle;
_lastJobProto = state.TargetIdJobPrototype;
@@ -217,14 +292,15 @@ namespace Content.Client.Access.UI
{
// Don't send this if it isn't dirty.
var jobProtoDirty = _lastJobProto != null &&
_jobPrototypeIds[JobPresetOptionButton.SelectedId] != _lastJobProto;
_jobPrototypeIds[JobPresetOptionButton.SelectedId] != _lastJobProto;
_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(),
jobProtoDirty ? _jobPrototypeIds[JobPresetOptionButton.SelectedId] : string.Empty);
jobProtoDirty ? _jobPrototypeIds[JobPresetOptionButton.SelectedId] : string.Empty,
_lastJobIcon);
}
}
}