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

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

@@ -3,6 +3,7 @@
xmlns:cc="clr-namespace:Content.Client.Administration.UI.CustomControls" xmlns:cc="clr-namespace:Content.Client.Administration.UI.CustomControls"
Title="{Loc admin-job-ban-window-title}" MinSize="425 325"> Title="{Loc admin-job-ban-window-title}" MinSize="425 325">
<BoxContainer Orientation="Vertical"> <BoxContainer Orientation="Vertical">
<BoxContainer Orientation="Vertical" HorizontalExpand="True">
<!-- Name --> <!-- Name -->
<BoxContainer Orientation="Horizontal"> <BoxContainer Orientation="Horizontal">
<Label Text="{Loc admin-job-ban-window-player}" MinWidth="100" /> <Label Text="{Loc admin-job-ban-window-player}" MinWidth="100" />
@@ -19,11 +20,12 @@
<BoxContainer Orientation="Horizontal"> <BoxContainer Orientation="Horizontal">
<Label Text="{Loc admin-job-ban-window-minutes}" MinWidth="100" /> <Label Text="{Loc admin-job-ban-window-minutes}" MinWidth="100" />
<Control MinWidth="50" /> <Control MinWidth="50" />
<LineEdit Name="MinutesLine" Text="0" MinWidth="100" HorizontalExpand="True" PlaceHolder="{Loc admin-job-ban-window-minutes-amount}" /> <LineEdit Name="MinutesLine" Text="0" MinWidth="100" HorizontalExpand="True"
<Button Name="HourButton" Text="+1ч (0)"/> PlaceHolder="{Loc admin-job-ban-window-minutes-amount}" />
<Button Name="DayButton" Text="+1д (0)"/> <Button Name="HourButton" Text="+1ч (0)" />
<Button Name="WeekButton" Text="+1н (0)"/> <Button Name="DayButton" Text="+1д (0)" />
<Button Name="MonthButton" Text="+1М (0)"/> <Button Name="WeekButton" Text="+1н (0)" />
<Button Name="MonthButton" Text="+1М (0)" />
</BoxContainer> </BoxContainer>
<!-- Role --> <!-- Role -->
<BoxContainer Orientation="Horizontal"> <BoxContainer Orientation="Horizontal">
@@ -32,66 +34,16 @@
<LineEdit Name="RoleNameLine" MinWidth="100" HorizontalExpand="True" /> <LineEdit Name="RoleNameLine" MinWidth="100" HorizontalExpand="True" />
<Button Name="SubmitByNameButton" Text="{Loc admin-job-ban-window-button-ban-by-name}" /> <Button Name="SubmitByNameButton" Text="{Loc admin-job-ban-window-button-ban-by-name}" />
</BoxContainer> </BoxContainer>
<CheckBox Name="GlobalBan" Text="{Loc admin-job-ban-window-global-ban}"/> <!-- GlobalBan -->
<BoxContainer Orientation="Horizontal"> <CheckBox Name="GlobalBan" Text="{Loc admin-job-ban-window-global-ban}" />
<cc:PlayerListControl Name="PlayerList" VerticalExpand="True" HorizontalExpand="True"/>
<BoxContainer Orientation="Vertical">
<BoxContainer Orientation="Horizontal">
<BoxContainer Orientation="Vertical">
<Label Text="{Loc department-Command}" FontColorOverride="Yellow"/>
<CheckBox Name="Captain" Text="{Loc job-name-captain}"/>
<CheckBox Name="HeadOfPersonnel" Text="{Loc job-name-hop}"/>
<CheckBox Name="HeadOfSecurity" Text="{Loc job-name-hos}"/>
<CheckBox Name="ChiefMedicalOfficer" Text="{Loc job-name-cmo}"/>
<CheckBox Name="ChiefEngineer" Text="{Loc job-name-ce}"/>
<CheckBox Name="Quartermaster" Text="{Loc job-name-qm}"/>
<CheckBox Name="ResearchDirector" Text="{Loc job-name-rd}"/>
<Label Text="{Loc department-Security}" FontColorOverride="Red"/>
<CheckBox Name="Warden" Text="{Loc job-name-warden}"/>
<CheckBox Name="SecurityOfficer" Text="{Loc job-name-security}"/>
<CheckBox Name="Detective" Text="{Loc job-name-detective}"/>
<CheckBox Name="SecurityCadet" Text="{Loc job-name-cadet}"/>
<Label Text="{Loc department-Medical}" FontColorOverride="DeepSkyBlue"/>
<CheckBox Name="Chemist" Text="{Loc job-name-chemist}"/>
<CheckBox Name="MedicalDoctor" Text="{Loc job-name-doctor}"/>
<CheckBox Name="Psychologist" Text="{Loc job-name-psychologist}"/>
<CheckBox Name="MedicalIntern" Text="{Loc job-name-intern}"/>
<Label Text="{Loc department-Engineering}" FontColorOverride="Orange"/>
<CheckBox Name="AtmosphericTechnician" Text="{Loc job-name-atmostech}"/>
<CheckBox Name="StationEngineer" Text="{Loc job-name-engineer}"/>
<CheckBox Name="TechnicalAssistant" Text="{Loc job-name-technical-assistant}"/>
</BoxContainer>
<Control MinWidth="30" />
<BoxContainer Orientation="Vertical">
<Label Text="{Loc department-Cargo}" FontColorOverride="Chocolate"/>
<CheckBox Name="CargoTechnician" Text="{Loc job-name-cargotech}"/>
<CheckBox Name="SalvageSpecialist" Text="{Loc job-name-salvagespec}"/>
<Label Text="{Loc department-Science}" FontColorOverride="MediumOrchid"/>
<CheckBox Name="Scientist" Text="{Loc job-name-scientist}"/>
<Label Text="{Loc department-Civilian}" FontColorOverride="Lime"/>
<CheckBox Name="ServiceWorker" Text="{Loc job-name-serviceworker}"/>
<CheckBox Name="Bartender" Text="{Loc job-name-bartender}"/>
<CheckBox Name="Chef" Text="{Loc job-name-chef}"/>
<CheckBox Name="Botanist" Text="{Loc job-name-botanist}"/>
<CheckBox Name="Clown" Text="{Loc job-name-clown}"/>
<CheckBox Name="Mime" Text="{Loc job-name-mime}"/>
<CheckBox Name="Chaplain" Text="{Loc job-name-chaplain}"/>
<CheckBox Name="Librarian" Text="{Loc job-name-librarian}"/>
<CheckBox Name="Lawyer" Text="{Loc job-name-lawyer}"/>
<CheckBox Name="Janitor" Text="{Loc job-name-janitor}"/>
<CheckBox Name="Musician" Text="{Loc job-name-musician}"/>
<CheckBox Name="Reporter" Text="{Loc job-name-reporter}"/>
<CheckBox Name="Zookeeper" Text="{Loc job-name-zookeeper}"/>
<CheckBox Name="Boxer" Text="{Loc job-name-boxer}"/>
<!--<Label Text="{Loc department-Silicon}" FontColorOverride="LightGray"/>
<CheckBox Name="Cyborg" Text="{Loc job-name-cyborg}"/>
<CheckBox Name="MedicalCyborg" Text="{Loc job-name-medical-cyborg}"/>
<CheckBox Name="EngCyborg" Text="Инженерный борг"/>
<CheckBox Name="SecCyborg" Text="Охранный борг"/>-->
</BoxContainer>
</BoxContainer>
<Button Name="SubmitListButton" Text="{Loc admin-job-ban-window-button-ban}"/>
</BoxContainer> </BoxContainer>
<BoxContainer Orientation="Horizontal" VerticalExpand="True">
<!-- Player List -->
<cc:PlayerListControl Name="PlayerList" VerticalExpand="True" MinWidth="200"/>
<Control VerticalExpand="True" Margin="10" />
<!-- Role list (auto-generated) -->
<BoxContainer Name="RolesContainer" Orientation="Vertical" VerticalExpand="True" HorizontalExpand="True" />
</BoxContainer> </BoxContainer>
<Button Name="SubmitListButton" Text="{Loc admin-job-ban-window-button-ban}" />
</BoxContainer> </BoxContainer>
</DefaultWindow> </DefaultWindow>

View File

@@ -1,29 +1,31 @@
using System.Linq; using System.Linq;
using Content.Client.Administration.UI.CustomControls;
using Content.Shared.Administration; using Content.Shared.Administration;
using Content.Shared.Roles;
using JetBrains.Annotations; using JetBrains.Annotations;
using Robust.Client.AutoGenerated; using Robust.Client.AutoGenerated;
using Robust.Client.Console; using Robust.Client.Console;
using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML; using Robust.Client.UserInterface.XAML;
using Robust.Shared.IoC;
using Robust.Shared.Utility; using Robust.Shared.Utility;
using static Robust.Client.UserInterface.Controls.LineEdit; using Robust.Client.Graphics;
using Content.Shared.Roles; using Robust.Client.UserInterface;
using Robust.Shared.Prototypes; 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
{
[Dependency] private readonly IPrototypeManager _prototypeManager = IoCManager.Resolve<IPrototypeManager>();
private List<CheckBox> CheckBoxes = new();
private readonly IClientConsoleHost _clientConsoleHost = IoCManager.Resolve<IClientConsoleHost>(); private readonly IClientConsoleHost _clientConsoleHost = IoCManager.Resolve<IClientConsoleHost>();
private readonly List<CheckBox> _roleCheckboxes = new();
public RoleBanWindow() public RoleBanWindow()
{ {
RobustXamlLoader.Load(this); RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
OnNamesChanged(); OnNamesChanged();
PlayerNameLine.OnTextChanged += _ => OnNamesChanged(); PlayerNameLine.OnTextChanged += _ => OnNamesChanged();
MinutesLine.OnTextChanged += UpdateButtonsText; MinutesLine.OnTextChanged += UpdateButtonsText;
@@ -36,33 +38,98 @@ namespace Content.Client.Administration.UI.Tabs.AdminTab
DayButton.OnPressed += _ => AddMinutes(1440); DayButton.OnPressed += _ => AddMinutes(1440);
WeekButton.OnPressed += _ => AddMinutes(10080); WeekButton.OnPressed += _ => AddMinutes(10080);
MonthButton.OnPressed += _ => AddMinutes(43200); MonthButton.OnPressed += _ => AddMinutes(43200);
CacheJobs();
} var prototypeManager = IoCManager.Resolve<IPrototypeManager>();
private void CacheJobs() foreach (var proto in prototypeManager.EnumeratePrototypes<DepartmentPrototype>())
{ {
var nameScope = FindNameScope(); CreateRoleGroup(proto.ID, proto.Roles, proto.Color);
var jobs = _prototypeManager.EnumeratePrototypes<JobPrototype>();
if (nameScope == null)
return;
foreach (var job in jobs)
{
if (!job.SetPreference)
continue;
var control = nameScope.Find(job.ID);
if (control is CheckBox)
CheckBoxes.Add(FindControl<CheckBox>(job.ID));
} }
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
{
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 (child is CheckBox c)
{
c.Pressed = args.Pressed;
}
}
};
outerContainer.AddChild(innerContainer);
foreach (var role in roleList)
{
AddRoleCheckbox(role, innerContainer, departmentCheckbox);
}
RolesContainer.AddChild(new PanelContainer
{
PanelOverride = new StyleBoxFlat
{
BackgroundColor = color
}
});
RolesContainer.AddChild(outerContainer);
RolesContainer.AddChild(new HSeparator());
}
private void AddRoleCheckbox(string role, Control container, CheckBox header)
{
var roleCheckbox = new CheckBox
{
Name = $"{role}RoleCheckbox",
Text = role
};
roleCheckbox.OnToggled += args =>
{
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
header.Pressed = false;
};
container.AddChild(roleCheckbox);
_roleCheckboxes.Add(roleCheckbox);
} }
private bool TryGetMinutes(string str, out uint minutes) private bool TryGetMinutes(string str, out uint minutes)
{
if(string.IsNullOrWhiteSpace(str))
{ {
minutes = 0; minutes = 0;
return true; return string.IsNullOrWhiteSpace(str) || uint.TryParse(str, out minutes);
}
return uint.TryParse(str, out minutes);
} }
private void AddMinutes(uint add) private void AddMinutes(uint add)
@@ -71,13 +138,14 @@ namespace Content.Client.Administration.UI.Tabs.AdminTab
return; return;
MinutesLine.Text = $"{minutes + add}"; MinutesLine.Text = $"{minutes + add}";
UpdateButtons(minutes+add); UpdateButtons(minutes + add);
} }
private void UpdateButtonsText(LineEditEventArgs obj) private void UpdateButtonsText(LineEditEventArgs obj)
{ {
if (!TryGetMinutes(obj.Text, out var minutes)) if (!TryGetMinutes(obj.Text, out var minutes))
return; return;
UpdateButtons(minutes); UpdateButtons(minutes);
} }
@@ -99,8 +167,10 @@ namespace Content.Client.Administration.UI.Tabs.AdminTab
{ {
SubmitByNameButton.Disabled = true; SubmitByNameButton.Disabled = true;
} }
SubmitListButton.Disabled = string.IsNullOrEmpty(PlayerNameLine.Text); SubmitListButton.Disabled = string.IsNullOrEmpty(PlayerNameLine.Text);
} }
private void OnPlayerSelectionChanged(PlayerInfo? player) private void OnPlayerSelectionChanged(PlayerInfo? player)
{ {
PlayerNameLine.Text = player?.Username ?? string.Empty; PlayerNameLine.Text = player?.Username ?? string.Empty;
@@ -109,15 +179,18 @@ namespace Content.Client.Administration.UI.Tabs.AdminTab
private void SubmitByNameButtonOnPressed(BaseButton.ButtonEventArgs obj) private void SubmitByNameButtonOnPressed(BaseButton.ButtonEventArgs obj)
{ {
_clientConsoleHost.ExecuteCommand($"roleban \"{PlayerNameLine.Text}\" \"{RoleNameLine.Text}\" \"{CommandParsing.Escape(ReasonLine.Text)}\" \"{MinutesLine.Text}\" \"{GlobalBan.Pressed}\""); _clientConsoleHost.ExecuteCommand(
$"roleban \"{PlayerNameLine.Text}\" \"{RoleNameLine.Text}\" \"{CommandParsing.Escape(ReasonLine.Text)}\" \"{MinutesLine.Text}\" \"medium\" \"{GlobalBan.Pressed}\"");
} }
private void SubmitListButtonOnPressed(BaseButton.ButtonEventArgs obj) private void SubmitListButtonOnPressed(BaseButton.ButtonEventArgs obj)
{ {
var pressedCheckBoxes = CheckBoxes.Where(checkbox => checkbox.Pressed); var pressedCheckBoxes = _roleCheckboxes.Where(checkbox => checkbox.Pressed);
foreach (var checkbox in pressedCheckBoxes) 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}\"");
} }
} }
} }