diff --git a/Content.Client/Labels/UI/HandLabelerBoundUserInterface.cs b/Content.Client/Labels/UI/HandLabelerBoundUserInterface.cs
index c9f74236e61..1a1217d574e 100644
--- a/Content.Client/Labels/UI/HandLabelerBoundUserInterface.cs
+++ b/Content.Client/Labels/UI/HandLabelerBoundUserInterface.cs
@@ -49,9 +49,9 @@ protected override void Open()
}
_window.OnLabelChanged += OnLabelChanged;
+ _window.OnLabelSelected += OnLabelSelected; // Starlight
Reload();
}
-
private void OnLabelChanged(string newLabel)
{
// Focus moment
@@ -61,7 +61,17 @@ private void OnLabelChanged(string newLabel)
SendPredictedMessage(new HandLabelerLabelChangedMessage(newLabel));
}
-
+ // Starlight start
+ private void OnLabelSelected(string label)
+ {
+ // Update UI and send message to sync with server
+ if (_window != null)
+ {
+ _window.SetCurrentLabel(label);
+ }
+ SendPredictedMessage(new HandLabelerLabelChangedMessage(label));
+ }
+ // Starlight End
public void Reload()
{
if (_window == null || !_entManager.TryGetComponent(Owner, out HandLabelerComponent? component))
@@ -70,4 +80,4 @@ public void Reload()
_window.SetCurrentLabel(component.AssignedLabel);
}
}
-}
\ No newline at end of file
+}
diff --git a/Content.Client/Labels/UI/HandLabelerWindow.xaml b/Content.Client/Labels/UI/HandLabelerWindow.xaml
index 10b92a47061..811333753ac 100644
--- a/Content.Client/Labels/UI/HandLabelerWindow.xaml
+++ b/Content.Client/Labels/UI/HandLabelerWindow.xaml
@@ -11,9 +11,31 @@ SPDX-License-Identifier: MIT
-
+ xmlns:gfx="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
+ Title="{Loc 'hand-labeler-ui-header'}"
+ SetWidth="400"
+ MinWidth="150"
+ SetHeight="400">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Content.Client/Labels/UI/HandLabelerWindow.xaml.cs b/Content.Client/Labels/UI/HandLabelerWindow.xaml.cs
index fd08171e80b..42046462fdd 100644
--- a/Content.Client/Labels/UI/HandLabelerWindow.xaml.cs
+++ b/Content.Client/Labels/UI/HandLabelerWindow.xaml.cs
@@ -19,13 +19,19 @@
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?
@@ -34,15 +40,21 @@ public sealed partial class HandLabelerWindow : DefaultWindow
// 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;
@@ -51,12 +63,50 @@ public HandLabelerWindow()
_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();
@@ -69,12 +119,83 @@ public void SetCurrentLabel(string label)
_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
}
-}
\ No newline at end of file
+}
diff --git a/Content.Shared/_Starlight/CCVar/StarlightCCVar.cs b/Content.Shared/_Starlight/CCVar/StarlightCCVar.cs
new file mode 100644
index 00000000000..6ff6e672d81
--- /dev/null
+++ b/Content.Shared/_Starlight/CCVar/StarlightCCVar.cs
@@ -0,0 +1,10 @@
+using Robust.Shared.Configuration;
+using Content.Shared.CCVar.CVarAccess;
+using Content.Shared.Administration;
+
+namespace Content.Shared._Starlight.CCVar;
+
+[CVarDefs]
+public sealed partial class StarlightCCVars
+{
+}
diff --git a/Content.Shared/_Starlight/CCVar/StarlightCCVars.Interface.cs b/Content.Shared/_Starlight/CCVar/StarlightCCVars.Interface.cs
new file mode 100644
index 00000000000..105c483ed39
--- /dev/null
+++ b/Content.Shared/_Starlight/CCVar/StarlightCCVars.Interface.cs
@@ -0,0 +1,13 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared._Starlight.CCVar;
+
+public sealed partial class StarlightCCVars
+{
+ ///
+ /// A newline-separated list of saved labels for the hand labeler tool
+ ///
+ public static readonly CVarDef HandLabelerSavedLabels =
+ CVarDef.Create("interface.hand_labeler_saved_labels", "", CVar.CLIENTONLY | CVar.ARCHIVE);
+
+}
diff --git a/Resources/Locale/en-US/hand-labeler/hand-labeler.ftl b/Resources/Locale/en-US/hand-labeler/hand-labeler.ftl
index 610146d282a..36cdfd6d747 100644
--- a/Resources/Locale/en-US/hand-labeler/hand-labeler.ftl
+++ b/Resources/Locale/en-US/hand-labeler/hand-labeler.ftl
@@ -24,3 +24,23 @@ hand-labeler-has-label = This object has a label on it, which reads '{$label}'
# Verb text
hand-labeler-remove-label-text = Remove label
hand-labeler-add-label-text = Apply label
+
+#starlight start
+# Label saving mechanic
+hand-labeler-saved-labels = Saved Labels:
+
+# The text on the button in the ui to save a label to the saved label list.
+hand-labeler-save-label-text = Save Label
+
+# The text on the button in the ui to delete a label from the saved label list.
+hand-labeler-delete-label-text = Delete Label
+
+# The text on the button when in delete mode.
+hand-labeler-delete-mode-text = Deleting...
+
+hand-labeler-ui-clear-label-text = Clear
+
+hand-labeler-ui-reset-label-text = Reset
+#starlight end
+
+