Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 28 additions & 12 deletions Content.Client/Access/UI/AccessOverriderWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,15 @@ public sealed partial class AccessOverriderWindow : DefaultWindow
private readonly Dictionary<string, Button> _legacyAccessButtons = new();
// Starlight-edit: End

#region Starlight
/// <summary>
/// Every access set on the target, including those outside the selected group.
/// Only the selected group has buttons at any one time, so the rest are held here
/// and merged back in on submit rather than being dropped.
/// </summary>
private readonly HashSet<ProtoId<AccessLevelPrototype>> _pressedAccess = new();
Comment thread
coderabbitai[bot] marked this conversation as resolved.
#endregion

public event Action<List<ProtoId<AccessLevelPrototype>>>? OnSubmit;
public event Action<ProtoId<AccessGroupPrototype>>? OnGroupSelected; // Starlight-edit

Expand Down Expand Up @@ -57,16 +66,23 @@ public void SetAccess(IPrototypeManager protoManager, List<ProtoId<AccessGroupPr
// Wire up level presses -> submit list
foreach (var (id, button) in _accessButtons.ButtonsList)
{
button.OnPressed += _ =>
{
OnSubmit?.Invoke(
_accessButtons.ButtonsList.Where(x => x.Value.Pressed)
.Select(x => new ProtoId<AccessLevelPrototype>(x.Key))
.ToList());
// Starlight-edit: End
};
button.OnPressed += _ => OnSubmit?.Invoke(BuildAccessList());
}
}
// Starlight-edit: End

#region Starlight
/// <summary>
/// Layers the visible buttons' states over the accesses belonging to the other groups.
/// </summary>
private List<ProtoId<AccessLevelPrototype>> BuildAccessList()
{
var accessList = _pressedAccess.Where(x => !_accessButtons.ButtonsList.ContainsKey(x)).ToList();
accessList.AddRange(_accessButtons.ButtonsList.Where(x => x.Value.Pressed).Select(x => x.Key));

return accessList;
}
#endregion

public void UpdateState(IPrototypeManager protoManager, AccessOverriderBoundUserInterfaceState state)
{
Expand Down Expand Up @@ -131,6 +147,9 @@ public void UpdateState(IPrototypeManager protoManager, AccessOverriderBoundUser
var availableAccess = state.AvailableAccessLevels?.ToList() ?? new List<ProtoId<AccessLevelPrototype>>();
var pressedAccess = state.PressedAccessLevels?.ToList() ?? new List<ProtoId<AccessLevelPrototype>>();

_pressedAccess.Clear();
_pressedAccess.UnionWith(pressedAccess);

var groupsWithCoverage = new List<ProtoId<AccessGroupPrototype>>();
if (availableAccess.Count > 0 && state.AccessGroups != null)
{
Expand Down Expand Up @@ -190,10 +209,7 @@ public void UpdateState(IPrototypeManager protoManager, AccessOverriderBoundUser

foreach (var (id, button) in _accessButtons.ButtonsList)
{
button.OnPressed += _ => OnSubmit?.Invoke(
_accessButtons.ButtonsList.Where(x => x.Value.Pressed)
.Select(x => new ProtoId<AccessLevelPrototype>(x.Key))
.ToList());
button.OnPressed += _ => OnSubmit?.Invoke(BuildAccessList());
// Starlight-edit: End
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,9 @@ private void UpdateAccessButtons()
_pressedLevels.Add(id);
else
_pressedLevels.Remove(id);
OnAccessChanged?.Invoke(_pressedLevels.Where(level => levels.Contains(level)).ToList());
// Submit every pressed access, not just the selected group's, or switching
// groups would wipe the accesses set from the previous one.
OnAccessChanged?.Invoke(_pressedLevels.ToList());
};
}
// Starlight edit End
Expand Down
Loading