Панель рольбанов теперь удобнее и работает

This commit is contained in:
Remuchi
2024-01-27 17:52:18 +07:00
parent bc6c66efc4
commit 62145432f0
2 changed files with 200 additions and 175 deletions

View File

@@ -1,123 +1,196 @@
using System.Linq;
using Content.Client.Administration.UI.CustomControls;
using Content.Shared.Administration;
using Content.Shared.Roles;
using JetBrains.Annotations;
using Robust.Client.AutoGenerated;
using Robust.Client.Console;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.IoC;
using Robust.Shared.Utility;
using static Robust.Client.UserInterface.Controls.LineEdit;
using Content.Shared.Roles;
using Robust.Client.Graphics;
using Robust.Client.UserInterface;
using Robust.Shared.Prototypes;
using static Robust.Client.UserInterface.Controls.LineEdit;
namespace Content.Client.Administration.UI.Tabs.AdminTab
namespace Content.Client.Administration.UI.Tabs.AdminTab;
[GenerateTypedNameReferences, UsedImplicitly]
public sealed partial class RoleBanWindow : DefaultWindow
{
[GenerateTypedNameReferences]
[UsedImplicitly]
public sealed partial class RoleBanWindow : DefaultWindow
private readonly IClientConsoleHost _clientConsoleHost = IoCManager.Resolve<IClientConsoleHost>();
private readonly List<CheckBox> _roleCheckboxes = new();
public RoleBanWindow()
{
[Dependency] private readonly IPrototypeManager _prototypeManager = IoCManager.Resolve<IPrototypeManager>();
private List<CheckBox> CheckBoxes = new();
private readonly IClientConsoleHost _clientConsoleHost = IoCManager.Resolve<IClientConsoleHost>();
public RoleBanWindow()
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
OnNamesChanged();
PlayerNameLine.OnTextChanged += _ => OnNamesChanged();
MinutesLine.OnTextChanged += UpdateButtonsText;
RoleNameLine.OnTextChanged += _ => OnNamesChanged();
PlayerList.OnSelectionChanged += OnPlayerSelectionChanged;
SubmitByNameButton.OnPressed += SubmitByNameButtonOnPressed;
SubmitListButton.OnPressed += SubmitListButtonOnPressed;
MinutesLine.OnTextChanged += UpdateButtonsText;
HourButton.OnPressed += _ => AddMinutes(60);
DayButton.OnPressed += _ => AddMinutes(1440);
WeekButton.OnPressed += _ => AddMinutes(10080);
MonthButton.OnPressed += _ => AddMinutes(43200);
var prototypeManager = IoCManager.Resolve<IPrototypeManager>();
foreach (var proto in prototypeManager.EnumeratePrototypes<DepartmentPrototype>())
{
RobustXamlLoader.Load(this);
OnNamesChanged();
PlayerNameLine.OnTextChanged += _ => OnNamesChanged();
MinutesLine.OnTextChanged += UpdateButtonsText;
RoleNameLine.OnTextChanged += _ => OnNamesChanged();
PlayerList.OnSelectionChanged += OnPlayerSelectionChanged;
SubmitByNameButton.OnPressed += SubmitByNameButtonOnPressed;
SubmitListButton.OnPressed += SubmitListButtonOnPressed;
MinutesLine.OnTextChanged += UpdateButtonsText;
HourButton.OnPressed += _ => AddMinutes(60);
DayButton.OnPressed += _ => AddMinutes(1440);
WeekButton.OnPressed += _ => AddMinutes(10080);
MonthButton.OnPressed += _ => AddMinutes(43200);
CacheJobs();
CreateRoleGroup(proto.ID, proto.Roles, proto.Color);
}
private void CacheJobs()
CreateRoleGroup("Antagonist", prototypeManager.EnumeratePrototypes<AntagPrototype>().Select(p => p.ID),
Color.Red);
}
private void CreateRoleGroup(string roleName, IEnumerable<string> roleList, Color color)
{
var outerContainer = new BoxContainer
{
var nameScope = FindNameScope();
var jobs = _prototypeManager.EnumeratePrototypes<JobPrototype>();
if (nameScope == null)
return;
foreach (var job in jobs)
Name = $"{roleName}GroupOuterBox",
HorizontalExpand = true,
VerticalExpand = true,
Orientation = BoxContainer.LayoutOrientation.Vertical,
Margin = new Thickness(4)
};
var departmentCheckbox = new CheckBox
{
Name = $"{roleName}GroupCheckbox",
Text = roleName,
Modulate = color,
HorizontalAlignment = HAlignment.Left
};
outerContainer.AddChild(departmentCheckbox);
var innerContainer = new BoxContainer
{
Name = $"{roleName}GroupInnerBox",
HorizontalExpand = true,
Orientation = BoxContainer.LayoutOrientation.Horizontal
};
departmentCheckbox.OnToggled += args =>
{
foreach (var child in innerContainer.Children)
{
if (!job.SetPreference)
continue;
var control = nameScope.Find(job.ID);
if (control is CheckBox)
CheckBoxes.Add(FindControl<CheckBox>(job.ID));
if (child is CheckBox c)
{
c.Pressed = args.Pressed;
}
}
};
outerContainer.AddChild(innerContainer);
foreach (var role in roleList)
{
AddRoleCheckbox(role, innerContainer, departmentCheckbox);
}
private bool TryGetMinutes(string str, out uint minutes)
RolesContainer.AddChild(new PanelContainer
{
if(string.IsNullOrWhiteSpace(str))
PanelOverride = new StyleBoxFlat
{
minutes = 0;
return true;
BackgroundColor = color
}
});
return uint.TryParse(str, out minutes);
}
RolesContainer.AddChild(outerContainer);
RolesContainer.AddChild(new HSeparator());
}
private void AddMinutes(uint add)
private void AddRoleCheckbox(string role, Control container, CheckBox header)
{
var roleCheckbox = new CheckBox
{
if (!TryGetMinutes(MinutesLine.Text, out var minutes))
return;
Name = $"{role}RoleCheckbox",
Text = role
};
MinutesLine.Text = $"{minutes + add}";
UpdateButtons(minutes+add);
}
private void UpdateButtonsText(LineEditEventArgs obj)
roleCheckbox.OnToggled += args =>
{
if (!TryGetMinutes(obj.Text, out var minutes))
return;
UpdateButtons(minutes);
}
private void UpdateButtons(uint minutes)
{
HourButton.Text = $"+1h ({minutes / 60})";
DayButton.Text = $"+1d ({minutes / 1440})";
WeekButton.Text = $"+1w ({minutes / 10080})";
MonthButton.Text = $"+1M ({minutes / 43200})";
}
private void OnNamesChanged()
{
if (!string.IsNullOrEmpty(PlayerNameLine.Text) && !string.IsNullOrEmpty(RoleNameLine.Text))
{
SubmitByNameButton.Disabled = false;
}
if (args is { Pressed: true, Button.Parent: { } } && args.Button.Parent.Children
.Where(e => e is CheckBox).All(e => ((CheckBox) e).Pressed))
header.Pressed = args.Pressed;
else
{
SubmitByNameButton.Disabled = true;
}
SubmitListButton.Disabled = string.IsNullOrEmpty(PlayerNameLine.Text);
}
private void OnPlayerSelectionChanged(PlayerInfo? player)
header.Pressed = false;
};
container.AddChild(roleCheckbox);
_roleCheckboxes.Add(roleCheckbox);
}
private bool TryGetMinutes(string str, out uint minutes)
{
minutes = 0;
return string.IsNullOrWhiteSpace(str) || uint.TryParse(str, out minutes);
}
private void AddMinutes(uint add)
{
if (!TryGetMinutes(MinutesLine.Text, out var minutes))
return;
MinutesLine.Text = $"{minutes + add}";
UpdateButtons(minutes + add);
}
private void UpdateButtonsText(LineEditEventArgs obj)
{
if (!TryGetMinutes(obj.Text, out var minutes))
return;
UpdateButtons(minutes);
}
private void UpdateButtons(uint minutes)
{
HourButton.Text = $"+1h ({minutes / 60})";
DayButton.Text = $"+1d ({minutes / 1440})";
WeekButton.Text = $"+1w ({minutes / 10080})";
MonthButton.Text = $"+1M ({minutes / 43200})";
}
private void OnNamesChanged()
{
if (!string.IsNullOrEmpty(PlayerNameLine.Text) && !string.IsNullOrEmpty(RoleNameLine.Text))
{
PlayerNameLine.Text = player?.Username ?? string.Empty;
OnNamesChanged();
SubmitByNameButton.Disabled = false;
}
else
{
SubmitByNameButton.Disabled = true;
}
private void SubmitByNameButtonOnPressed(BaseButton.ButtonEventArgs obj)
SubmitListButton.Disabled = string.IsNullOrEmpty(PlayerNameLine.Text);
}
private void OnPlayerSelectionChanged(PlayerInfo? player)
{
PlayerNameLine.Text = player?.Username ?? string.Empty;
OnNamesChanged();
}
private void SubmitByNameButtonOnPressed(BaseButton.ButtonEventArgs obj)
{
_clientConsoleHost.ExecuteCommand(
$"roleban \"{PlayerNameLine.Text}\" \"{RoleNameLine.Text}\" \"{CommandParsing.Escape(ReasonLine.Text)}\" \"{MinutesLine.Text}\" \"medium\" \"{GlobalBan.Pressed}\"");
}
private void SubmitListButtonOnPressed(BaseButton.ButtonEventArgs obj)
{
var pressedCheckBoxes = _roleCheckboxes.Where(checkbox => checkbox.Pressed);
foreach (var checkbox in pressedCheckBoxes)
{
_clientConsoleHost.ExecuteCommand($"roleban \"{PlayerNameLine.Text}\" \"{RoleNameLine.Text}\" \"{CommandParsing.Escape(ReasonLine.Text)}\" \"{MinutesLine.Text}\" \"{GlobalBan.Pressed}\"");
}
private void SubmitListButtonOnPressed(BaseButton.ButtonEventArgs obj)
{
var pressedCheckBoxes = CheckBoxes.Where(checkbox => checkbox.Pressed);
foreach (var checkbox in pressedCheckBoxes)
{
_clientConsoleHost.ExecuteCommand($"roleban \"{PlayerNameLine.Text}\" \"{checkbox.Name}\" \"{CommandParsing.Escape(ReasonLine.Text)}\" \"{MinutesLine.Text}\" \"{GlobalBan.Pressed}\"");
}
_clientConsoleHost.ExecuteCommand(
$"roleban \"{PlayerNameLine.Text}\" \"{checkbox.Text}\" \"{CommandParsing.Escape(ReasonLine.Text)}\" \"{MinutesLine.Text}\" \"medium\" \"{GlobalBan.Pressed}\"");
}
}
}