]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Paper QOL improvements (#32418)
authoreoineoineoin <github@eoinrul.es>
Mon, 23 Sep 2024 23:36:05 +0000 (00:36 +0100)
committerGitHub <noreply@github.com>
Mon, 23 Sep 2024 23:36:05 +0000 (09:36 +1000)
* Don't add newlines (fixes #32357)

* Improve UI around max paper length (Fixes #32344)

* Display a "fill progress" indicator so users know how close they are to filling it
* Don't allow users to save a paper which went over the limit, to avoid them losing data they want to keep.

---------

Co-authored-by: Eoin Mcloughlin <helloworld@eoinrul.es>
Content.Client/Paper/UI/PaperBoundUserInterface.cs
Content.Client/Paper/UI/PaperWindow.xaml
Content.Client/Paper/UI/PaperWindow.xaml.cs
Content.Shared/Paper/PaperSystem.cs
Resources/Locale/en-US/paper/paper-component.ftl

index 63645bc01e910d4ce8359261c167e9b5291c701a..ec417f749b9bb4b796099502f50976ffeed89baf 100644 (file)
@@ -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<PaperWindow>();
         _window.OnSaved += InputOnTextEntered;
 
+        if (EntMan.TryGetComponent<PaperComponent>(Owner, out var paper))
+        {
+            _window.MaxInputLength = paper.ContentSize;
+        }
         if (EntMan.TryGetComponent<PaperVisualsComponent>(Owner, out var visuals))
         {
             _window.InitVisuals(Owner, visuals);
index 2344afd5ef708b9a2cd506296267c1e3cedea944..503ae928a3ed14282ab3f1b5f54de87d1105c39a 100644 (file)
                         <Control Name="TextAlignmentPadding" VerticalAlignment="Top"/>
                         <RichTextLabel Name="BlankPaperIndicator" StyleClasses="LabelSecondaryColor" VerticalAlignment="Top" HorizontalAlignment="Center"/>
                         <RichTextLabel StyleClasses="PaperWrittenText" Name="WrittenTextLabel" VerticalAlignment="Top"/>
-                        <PanelContainer Name="InputContainer" StyleClasses="TransparentBorderedWindowPanel" MinHeight="100"
-                                        VerticalAlignment="Stretch" VerticalExpand="True" HorizontalExpand="True">
-                            <TextEdit Name="Input" StyleClasses="PaperLineEdit" Access="Public" />
-                        </PanelContainer>
+                        <BoxContainer Name="InputContainer" Orientation="Vertical" VerticalExpand="True" VerticalAlignment="Stretch">
+                            <PanelContainer StyleClasses="TransparentBorderedWindowPanel" MinHeight="100"
+                                VerticalAlignment="Stretch" VerticalExpand="True" HorizontalExpand="True">
+                                <TextEdit Name="Input" StyleClasses="PaperLineEdit" Access="Public" />
+                            </PanelContainer>
+                            <Label Name="FillStatus" StyleClasses="LabelSecondaryColor"/>
+                        </BoxContainer>
                     </BoxContainer>
                     <paper:StampCollection Name="StampDisplay" VerticalAlignment="Bottom" Margin="6"/>
 
index 81b831068c39298790919d52b99e5b54e0e1819c..02c4ed64c359f08ee5461eb1a83e2b1fc1ef33b5 100644 (file)
@@ -48,6 +48,20 @@ namespace Content.Client.Paper.UI
 
         public event Action<string>? 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<TextureResource>(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;
+            }
+        }
     }
 }
index 0f4bfef983dc39e9792269eb807f7f70ca116944..211eb7eba814a43db4d30fda67ca3da45dcb1eee 100644 (file)
@@ -201,7 +201,7 @@ public sealed class PaperSystem : EntitySystem
 
     public void SetContent(Entity<PaperComponent> entity, string content)
     {
-        entity.Comp.Content = content + '\n';
+        entity.Comp.Content = content;
         Dirty(entity);
         UpdateUserInterface(entity);
 
index c2d9d5712bf67e25f42b9e97d935d8e43c3343d5..7425ea2da1647897984928caa69c65fad786d64c 100644 (file)
@@ -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.