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? OnPrintPressed; public event Action? OnCopyPressed; private string? _currentTemplate; private bool _canCopy; private float _incVolume; private string _searchText = string.Empty; private List _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() .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(id, out var proto)) { TemplateList.AddItem(Loc.GetString(proto.Name)).Metadata = id; } } } private List GetFilteredTemplates() { return _allTemplates .Where(id => PassesFilter(id)) .ToList(); } private bool PassesFilter(string id) { if (!_protoManager.TryIndex(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); } }