fish-station/Content.Client/_Sunrise/CopyMachine/CopyMachineMenu.xaml.cs
2025-08-16 06:20:10 +03:00

185 lines
5.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Content.Shared._Sunrise.CopyMachine;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Prototypes;
using System.Linq;
using Robust.Client.UserInterface.Controls;
namespace Content.Client._Sunrise.CopyMachine;
[GenerateTypedNameReferences]
public sealed partial class CopyMachineMenu : DefaultWindow
{
[Dependency] private readonly IPrototypeManager _protoManager = default!;
public event Action<string?>? OnPrintPressed;
public event Action? OnCopyPressed;
private string? _currentTemplate;
private bool _canCopy;
private float _incVolume;
private string _searchText = string.Empty;
private List<string> _allTemplates = new();
private string? _activeComponentFilter = null;
public CopyMachineMenu()
{
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
PrintButton.OnPressed += _ => OnPrintPressed?.Invoke(_currentTemplate);
CopyButton.OnPressed += _ => OnCopyPressed?.Invoke();
TemplateList.OnItemSelected += OnTemplateSelected;
TemplateList.OnItemDeselected += OnTemplateDeselected;
SearchBar.OnTextChanged += _ =>
{
_searchText = SearchBar.Text.Trim();
PopulateTemplates();
};
FilterDropdown.OnItemSelected += args =>
{
var metadata = FilterDropdown.GetItemMetadata(args.Id) as string;
_activeComponentFilter = string.IsNullOrEmpty(metadata) ? null : metadata;
_searchText = string.Empty;
SearchBar.Text = string.Empty;
FilterDropdown.SelectId(args.Id);
PopulateTemplates();
};
CreateFilterDropdown();
}
private void OnTemplateSelected(ItemList.ItemListSelectedEventArgs args)
{
_currentTemplate = args.ItemList[args.ItemIndex].Metadata as string;
PrintButton.Disabled = _incVolume <= 0.0f || _currentTemplate == null;
}
private void OnTemplateDeselected(ItemList.ItemListDeselectedEventArgs args)
{
_currentTemplate = null;
PrintButton.Disabled = true;
}
public void UpdateState(CopyMachineBoundUserInterfaceState state)
{
_canCopy = state.CanCopy;
_incVolume = state.InkAmount;
_allTemplates = state.Templates;
PaperCountLabel.Text = state.PaperCount.ToString();
InkAmountLabel.Text = _incVolume.ToString("F1");
CopyStatusLabel.Text = _canCopy
? Loc.GetString("copy-machine-menu-copy-available")
: Loc.GetString("copy-machine-menu-copy-unavailable");
PrintButton.Disabled = _currentTemplate == null || _incVolume <= 0.0f;
CopyButton.Disabled = !_canCopy;
CurrentJobLabel.Text = state.CurrentJob?.ToString() ?? Loc.GetString("copy-machine-menu-no-active-job");
QueueList.Clear();
foreach (var job in state.Queue)
{
QueueList.AddItem(job.ToString());
}
CreateFilterDropdown();
PopulateTemplates();
}
private void CreateFilterDropdown()
{
FilterDropdown.Clear();
var allowedComponents = new[]
{
"Centcom", "Command", "Engineering", "Justice", "Medical", "Science",
"Security", "Service", "Supply", "Syndicate", "General", "Prison"
};
var usedComponents = _protoManager
.EnumeratePrototypes<DocTemplatePrototype>()
.Where(p => _allTemplates.Contains(p.ID) && allowedComponents.Contains(p.Component))
.Select(p => p.Component)
.Distinct()
.OrderBy(c => c)
.ToList();
// Добавляем "Все"
FilterDropdown.AddItem(Loc.GetString("copy-machine-filter-all"), 0);
FilterDropdown.SetItemMetadata(0, string.Empty);
for (var i = 0; i < usedComponents.Count; i++)
{
var component = usedComponents[i];
var localized = Loc.GetString($"copy-machine-component-{component}");
var id = i + 1;
FilterDropdown.AddItem(localized, id);
FilterDropdown.SetItemMetadata(id, component);
}
// Обновляем отображаемый текст на текущем выбранном
var selectedId = 0;
if (_activeComponentFilter != null)
{
foreach (var (data, idx) in usedComponents.Select((c, i) => (c, i + 1)))
{
if (data == _activeComponentFilter)
{
selectedId = idx;
break;
}
}
}
FilterDropdown.SelectId(selectedId);
}
private void PopulateTemplates()
{
TemplateList.Clear();
var filtered = GetFilteredTemplates();
foreach (var id in filtered)
{
if (_protoManager.TryIndex<DocTemplatePrototype>(id, out var proto))
{
TemplateList.AddItem(Loc.GetString(proto.Name)).Metadata = id;
}
}
}
private List<string> GetFilteredTemplates()
{
return _allTemplates
.Where(id => PassesFilter(id))
.ToList();
}
private bool PassesFilter(string id)
{
if (!_protoManager.TryIndex<DocTemplatePrototype>(id, out var proto))
return false;
if (_activeComponentFilter != null && proto.Component != _activeComponentFilter)
return false;
if (string.IsNullOrWhiteSpace(_searchText))
return true;
var name = Loc.GetString(proto.Name).ToLowerInvariant();
var idLower = id.ToLowerInvariant();
var search = _searchText.ToLowerInvariant();
return name.Contains(search) || idLower.Contains(search);
}
}