185 lines
5.7 KiB
C#
185 lines
5.7 KiB
C#
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);
|
||
}
|
||
}
|