diff --git a/Content.Client/Paper/UI/PaperBoundUserInterface.cs b/Content.Client/Paper/UI/PaperBoundUserInterface.cs index 63645bc01e..ec417f749b 100644 --- a/Content.Client/Paper/UI/PaperBoundUserInterface.cs +++ b/Content.Client/Paper/UI/PaperBoundUserInterface.cs @@ -2,6 +2,7 @@ using JetBrains.Annotations; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Shared.Utility; +using Content.Shared.Paper; using static Content.Shared.Paper.PaperComponent; namespace Content.Client.Paper.UI; @@ -23,6 +24,10 @@ public sealed class PaperBoundUserInterface : BoundUserInterface _window = this.CreateWindow(); _window.OnSaved += InputOnTextEntered; + if (EntMan.TryGetComponent(Owner, out var paper)) + { + _window.MaxInputLength = paper.ContentSize; + } if (EntMan.TryGetComponent(Owner, out var visuals)) { _window.InitVisuals(Owner, visuals); diff --git a/Content.Client/Paper/UI/PaperWindow.xaml b/Content.Client/Paper/UI/PaperWindow.xaml index 2344afd5ef..503ae928a3 100644 --- a/Content.Client/Paper/UI/PaperWindow.xaml +++ b/Content.Client/Paper/UI/PaperWindow.xaml @@ -15,10 +15,13 @@ - - - + + + + + diff --git a/Content.Client/Paper/UI/PaperWindow.xaml.cs b/Content.Client/Paper/UI/PaperWindow.xaml.cs index 81b831068c..02c4ed64c3 100644 --- a/Content.Client/Paper/UI/PaperWindow.xaml.cs +++ b/Content.Client/Paper/UI/PaperWindow.xaml.cs @@ -48,6 +48,20 @@ namespace Content.Client.Paper.UI public event Action? OnSaved; + private int _MaxInputLength = -1; + public int MaxInputLength + { + get + { + return _MaxInputLength; + } + set + { + _MaxInputLength = value; + UpdateFillState(); + } + } + public PaperWindow() { IoCManager.InjectDependencies(this); @@ -63,11 +77,21 @@ namespace Content.Client.Paper.UI { if (args.Function == EngineKeyFunctions.MultilineTextSubmit) { - RunOnSaved(); - args.Handle(); + // SaveButton is disabled when we hit the max input limit. Just check + // that flag instead of trying to calculate the input length again + if (!SaveButton.Disabled) + { + RunOnSaved(); + args.Handle(); + } } }; + Input.OnTextChanged += args => + { + UpdateFillState(); + }; + SaveButton.OnPressed += _ => { RunOnSaved(); @@ -126,6 +150,7 @@ namespace Content.Client.Paper.UI PaperContent.ModulateSelfOverride = visuals.ContentImageModulate; WrittenTextLabel.ModulateSelfOverride = visuals.FontAccentColor; + FillStatus.ModulateSelfOverride = visuals.FontAccentColor; var contentImage = visuals.ContentImagePath != null ? _resCache.GetResource(visuals.ContentImagePath) : null; if (contentImage != null) @@ -296,5 +321,25 @@ namespace Content.Client.Paper.UI { OnSaved?.Invoke(Rope.Collapse(Input.TextRope)); } + + private void UpdateFillState() + { + if (MaxInputLength != -1) + { + var inputLength = Input.TextLength; + + FillStatus.Text = Loc.GetString("paper-ui-fill-level", + ("currentLength", inputLength), + ("maxLength", MaxInputLength)); + + // Disable the save button if we've gone over the limit + SaveButton.Disabled = inputLength > MaxInputLength; + } + else + { + FillStatus.Text = ""; + SaveButton.Disabled = false; + } + } } } diff --git a/Content.Shared/Paper/PaperSystem.cs b/Content.Shared/Paper/PaperSystem.cs index 0f4bfef983..211eb7eba8 100644 --- a/Content.Shared/Paper/PaperSystem.cs +++ b/Content.Shared/Paper/PaperSystem.cs @@ -201,7 +201,7 @@ public sealed class PaperSystem : EntitySystem public void SetContent(Entity entity, string content) { - entity.Comp.Content = content + '\n'; + entity.Comp.Content = content; Dirty(entity); UpdateUserInterface(entity); diff --git a/Resources/Locale/en-US/paper/paper-component.ftl b/Resources/Locale/en-US/paper/paper-component.ftl index c2d9d5712b..7425ea2da1 100644 --- a/Resources/Locale/en-US/paper/paper-component.ftl +++ b/Resources/Locale/en-US/paper/paper-component.ftl @@ -11,6 +11,9 @@ paper-component-examine-detail-stamped-by = {CAPITALIZE(THE($paper))} {CONJUGATE paper-component-action-stamp-paper-other = {CAPITALIZE(THE($user))} stamps {THE($target)} with {THE($stamp)}. paper-component-action-stamp-paper-self = You stamp {THE($target)} with {THE($stamp)}. +# Indicator to show how full a paper is +paper-ui-fill-level = {$currentLength}/{$maxLength} + paper-ui-save-button = Save ({$keybind}) paper-tamper-proof-modified-message = This page was written using tamper-proof ink.