Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 13 additions & 3 deletions Content.Client/Labels/UI/HandLabelerBoundUserInterface.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,9 @@ protected override void Open()
}

_window.OnLabelChanged += OnLabelChanged;
_window.OnLabelSelected += OnLabelSelected; // Starlight
Reload();
}

private void OnLabelChanged(string newLabel)
{
// Focus moment
Expand All @@ -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))
Expand All @@ -70,4 +80,4 @@ public void Reload()
_window.SetCurrentLabel(component.AssignedLabel);
}
}
}
}
26 changes: 24 additions & 2 deletions Content.Client/Labels/UI/HandLabelerWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,31 @@ SPDX-License-Identifier: MIT

<DefaultWindow xmlns="https://spacestation14.io"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="{Loc 'hand-labeler-ui-header'}">
<BoxContainer Orientation="Vertical" SeparationOverride="4" MinWidth="150">
xmlns:gfx="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
Title="{Loc 'hand-labeler-ui-header'}"
SetWidth="400"
MinWidth="150"
SetHeight="400"> <!-- Starlight - include gfx and set default height to include saved labels section nicely -->
<BoxContainer Orientation="Vertical" SeparationOverride="4">
<Label Name="CurrentTextLabel" Text="{Loc 'hand-labeler-current-text-label'}" />
<LineEdit Name="LabelLineEdit" />
<BoxContainer Orientation="Horizontal" Align="Center">
<Button Name="ResetLabelButton" Text="{Loc 'hand-labeler-ui-reset-label-text'}" StyleClasses="OpenRight" />
<Button Name="ClearLabelButton" Text="{Loc 'hand-labeler-ui-clear-label-text'}" StyleClasses="OpenLeft" />
</BoxContainer>
<!-- Starlight Begin -->
<Label Text="{Loc 'hand-labeler-saved-labels'}" />
<PanelContainer VerticalExpand="True" SizeFlagsStretchRatio="1">
<PanelContainer.PanelOverride>
<gfx:StyleBoxFlat BackgroundColor="#1B1B1E" />
</PanelContainer.PanelOverride>
<ItemList Name="SavedLabelsList" VerticalExpand="True" SelectMode="Button" />
</PanelContainer>

<BoxContainer Orientation="Horizontal" Align="Center">
<Button Name="SaveLabelButton" Text="{Loc 'hand-labeler-save-label-text'}" StyleClasses="OpenRight" />
<Button Name="DeleteLabelButton" Text="{Loc 'hand-labeler-delete-label-text'}" StyleClasses="OpenLeft" />
</BoxContainer>
<!-- Starlight end -->
</BoxContainer>
</DefaultWindow>
125 changes: 123 additions & 2 deletions Content.Client/Labels/UI/HandLabelerWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<string>? OnLabelChanged;
public event Action<string>? OnLabelSelected; // Starlight

/// <summary>
/// Is the user currently entering text into the control?
Expand All @@ -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<string> _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;
Expand All @@ -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();
Expand All @@ -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<string> labels)
{
var items = new List<ItemList.Item>();
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<string>(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
}
}
}
10 changes: 10 additions & 0 deletions Content.Shared/_Starlight/CCVar/StarlightCCVar.cs
Original file line number Diff line number Diff line change
@@ -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
{
}
13 changes: 13 additions & 0 deletions Content.Shared/_Starlight/CCVar/StarlightCCVars.Interface.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using Robust.Shared.Configuration;

namespace Content.Shared._Starlight.CCVar;

public sealed partial class StarlightCCVars
{
/// <summary>
/// A newline-separated list of saved labels for the hand labeler tool
/// </summary>
public static readonly CVarDef<string> HandLabelerSavedLabels =
CVarDef.Create("interface.hand_labeler_saved_labels", "", CVar.CLIENTONLY | CVar.ARCHIVE);

}
20 changes: 20 additions & 0 deletions Resources/Locale/en-US/hand-labeler/hand-labeler.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -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


Loading