using Robust.Client.UserInterface.CustomControls; using Robust.Client.AutoGenerated; using Robust.Client.UserInterface.XAML; using Robust.Client.UserInterface.Controls; // Starlight using Robust.Shared.Configuration; // Starlight using Content.Shared.Starlight.CCVar; // Starlight namespace Content.Client.Labels.UI { [GenerateTypedNameReferences] public sealed partial class HandLabelerWindow : DefaultWindow { [Dependency] private readonly IConfigurationManager _cfg = default!; // Starlight public event Action? OnLabelChanged; public event Action? OnLabelSelected; // Starlight /// /// Is the user currently entering text into the control? /// private bool _focused; // TODO LineEdit Make this a bool on the LineEdit control private string _label = string.Empty; private string _initialLabel = string.Empty; private bool _deleteMode = false; // Starlight private List _savedLabels = []; // Starlight public HandLabelerWindow() { RobustXamlLoader.Load(this); IoCManager.InjectDependencies(this); // Starlight LoadSavedLabelsFromCVar(); // Starlight LabelLineEdit.OnTextChanged += e => { _label = e.Text; OnLabelChanged?.Invoke(_label); UpdateButtons(); }; LabelLineEdit.OnFocusEnter += _ => _focused = true; LabelLineEdit.OnFocusExit += _ => { _focused = false; LabelLineEdit.Text = _label; }; ResetLabelButton.OnPressed += _ => LabelLineEdit.SetText(_initialLabel, true); ClearLabelButton.OnPressed += _ => LabelLineEdit.SetText("", true); // Starlight Begin SaveLabelButton.OnPressed += _ => { if (!string.IsNullOrWhiteSpace(_label) && !_savedLabels.Contains(_label)) { _savedLabels.Add(_label); SaveSavedLabelsToCVar(); UpdateSavedLabels(_savedLabels); } }; DeleteLabelButton.OnPressed += _ => { _deleteMode = !_deleteMode; DeleteLabelButton.Pressed = _deleteMode; UpdateButtons(); }; SavedLabelsList.OnItemSelected += args => { if (_deleteMode) { _savedLabels.RemoveAt(args.ItemIndex); SaveSavedLabelsToCVar(); UpdateSavedLabels(_savedLabels); UpdateButtons(); } else { if (SavedLabelsList[args.ItemIndex].Metadata is string label) { OnLabelSelected?.Invoke(label); } } }; // Starlight End } protected override void Opened() { base.Opened(); // Give the editor keyboard focus, since that's the only // thing the user will want to be doing with this UI LabelLineEdit.GrabKeyboardFocus(); } public void SetCurrentLabel(string label) { if (label == _label) return; _label = label; if (!_focused) { LabelLineEdit.Text = label; UpdateButtons(); } } public void SetInitialLabelState() { LabelLineEdit.Text = _label; LabelLineEdit.CursorPosition = _label.Length; LabelLineEdit.SelectionStart = 0; _initialLabel = _label; UpdateButtons(); } // Starlight begin public void UpdateSavedLabels(List labels) { var items = new List(); foreach (var label in labels) { var item = new ItemList.Item(SavedLabelsList) { Text = label, Metadata = label }; items.Add(item); } SavedLabelsList.SetItems(items); UpdateButtons(); } // Starlight end public void UpdateButtons() { ResetLabelButton.Disabled = (LabelLineEdit.Text == _initialLabel); ClearLabelButton.Disabled = (LabelLineEdit.Text == ""); // Starlight begin var labelExists = false; foreach (var item in SavedLabelsList) { if ((item.Metadata as string) == _label.Trim()) { labelExists = true; break; } } SaveLabelButton.Disabled = string.IsNullOrWhiteSpace(_label) || labelExists; DeleteLabelButton.Text = _deleteMode ? Loc.GetString("hand-labeler-delete-mode-text") : Loc.GetString("hand-labeler-delete-label-text"); // Starlight end } public void SetMaxLabelLength(int maxLength) { LabelLineEdit.IsValid = s => s.Length <= maxLength; } // Starlight begin private void LoadSavedLabelsFromCVar() { var savedLabelsStr = _cfg.GetCVar(StarlightCCVars.HandLabelerSavedLabels); if (!string.IsNullOrEmpty(savedLabelsStr)) { _savedLabels = new List(savedLabelsStr.Split('\n', StringSplitOptions.RemoveEmptyEntries)); UpdateSavedLabels(_savedLabels); } } private void SaveSavedLabelsToCVar() { var savedLabelsStr = string.Join('\n', _savedLabels); _cfg.SetCVar(StarlightCCVars.HandLabelerSavedLabels, savedLabelsStr); _cfg.SaveToFile(); } // Starlight end } }