]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Save unpublished news articles (#31491)
authorthemias <89101928+themias@users.noreply.github.com>
Mon, 9 Sep 2024 19:38:49 +0000 (15:38 -0400)
committerGitHub <noreply@github.com>
Mon, 9 Sep 2024 19:38:49 +0000 (13:38 -0600)
* Add draft saving to news consoles

* fix after bui changes

* comments + rename vars

* no

Content.Client/MassMedia/Ui/ArticleEditorPanel.xaml
Content.Client/MassMedia/Ui/ArticleEditorPanel.xaml.cs
Content.Client/MassMedia/Ui/NewsWriterBoundUserInterface.cs
Content.Client/MassMedia/Ui/NewsWriterMenu.xaml.cs
Content.Server/MassMedia/Components/NewsWriterComponent.cs
Content.Server/MassMedia/Systems/NewsSystem.cs
Content.Shared/MassMedia/Components/NewsWriterBuiMessages.cs
Resources/Locale/en-US/mass-media/news-ui.ftl

index 2b600845cae4369c2e39174f38d0cdded3fa80c1..f4fb9da06220a753d7772f9415c1f7e2582dde1f 100644 (file)
             </Control>
             <Control HorizontalExpand="True"/>
             <BoxContainer Orientation="Horizontal">
+                <Button Name="ButtonSaveDraft" SetHeight="32" SetWidth="85"
+                        StyleClasses="OpenRight" Text="{Loc news-write-ui-save-text}"/>
                 <Button Name="ButtonPreview" SetHeight="32" SetWidth="85"
-                        StyleClasses="OpenRight" Text="{Loc news-write-ui-preview-text}"/>
+                        StyleClasses="OpenBoth" Text="{Loc news-write-ui-preview-text}"/>
                 <Button Name="ButtonPublish" SetHeight="32" SetWidth="85" Text="{Loc news-write-ui-publish-text}" Access="Public"/>
             </BoxContainer>
         </BoxContainer>
index 5e068f1e9c534663ae955a23989e68048bf18691..90a66bec7f3079e666a4c92fd311fb020a602ef0 100644 (file)
@@ -14,6 +14,7 @@ namespace Content.Client.MassMedia.Ui;
 public sealed partial class ArticleEditorPanel : Control
 {
     public event Action? PublishButtonPressed;
+    public event Action<string, string>? ArticleDraftUpdated;
 
     private bool _preview;
 
@@ -45,6 +46,7 @@ public sealed partial class ArticleEditorPanel : Control
         ButtonPreview.OnPressed += OnPreview;
         ButtonCancel.OnPressed += OnCancel;
         ButtonPublish.OnPressed += OnPublish;
+        ButtonSaveDraft.OnPressed += OnDraftSaved;
 
         TitleField.OnTextChanged += args => OnTextChanged(args.Text.Length, args.Control, SharedNewsSystem.MaxTitleLength);
         ContentField.OnTextChanged += args => OnTextChanged(Rope.CalcTotalLength(args.TextRope), args.Control, SharedNewsSystem.MaxContentLength);
@@ -68,6 +70,9 @@ public sealed partial class ArticleEditorPanel : Control
             ButtonPublish.Disabled = false;
             ButtonPreview.Disabled = false;
         }
+
+        // save draft regardless; they can edit down the length later
+        ArticleDraftUpdated?.Invoke(TitleField.Text, Rope.Collapse(ContentField.TextRope));
     }
 
     private void OnPreview(BaseButton.ButtonEventArgs eventArgs)
@@ -92,6 +97,12 @@ public sealed partial class ArticleEditorPanel : Control
         Visible = false;
     }
 
+    private void OnDraftSaved(BaseButton.ButtonEventArgs eventArgs)
+    {
+        ArticleDraftUpdated?.Invoke(TitleField.Text, Rope.Collapse(ContentField.TextRope));
+        Visible = false;
+    }
+
     private void Reset()
     {
         _preview = false;
@@ -100,6 +111,7 @@ public sealed partial class ArticleEditorPanel : Control
         PreviewLabel.SetMarkup("");
         TitleField.Text = "";
         ContentField.TextRope = Rope.Leaf.Empty;
+        ArticleDraftUpdated?.Invoke(string.Empty, string.Empty);
     }
 
     protected override void Dispose(bool disposing)
index 22e5bc452a0d458608718fa9123bed1355258aed..4f21361990a951894a4a8acf3bdfe6b03faf9d18 100644 (file)
@@ -25,6 +25,9 @@ public sealed class NewsWriterBoundUserInterface : BoundUserInterface
         _menu.ArticleEditorPanel.PublishButtonPressed += OnPublishButtonPressed;
         _menu.DeleteButtonPressed += OnDeleteButtonPressed;
 
+        _menu.CreateButtonPressed += OnCreateButtonPressed;
+        _menu.ArticleEditorPanel.ArticleDraftUpdated += OnArticleDraftUpdated;
+
         SendMessage(new NewsWriterArticlesRequestMessage());
     }
 
@@ -34,7 +37,7 @@ public sealed class NewsWriterBoundUserInterface : BoundUserInterface
         if (state is not NewsWriterBoundUserInterfaceState cast)
             return;
 
-        _menu?.UpdateUI(cast.Articles, cast.PublishEnabled, cast.NextPublish);
+        _menu?.UpdateUI(cast.Articles, cast.PublishEnabled, cast.NextPublish, cast.DraftTitle, cast.DraftContent);
     }
 
     private void OnPublishButtonPressed()
@@ -67,4 +70,14 @@ public sealed class NewsWriterBoundUserInterface : BoundUserInterface
 
         SendMessage(new NewsWriterDeleteMessage(articleNum));
     }
+
+    private void OnCreateButtonPressed()
+    {
+        SendMessage(new NewsWriterRequestDraftMessage());
+    }
+
+    private void OnArticleDraftUpdated(string title, string content)
+    {
+        SendMessage(new NewsWriterSaveDraftMessage(title, content));
+    }
 }
index c059ce785af6c397d0f48ef1c0e37e2fcdf6565c..af1f9a94414cd130c6a457ddeaec5d3e7ad65c0c 100644 (file)
@@ -4,6 +4,7 @@ using Robust.Client.UserInterface.XAML;
 using Content.Shared.MassMedia.Systems;
 using Robust.Client.UserInterface.Controls;
 using Robust.Shared.Timing;
+using Robust.Shared.Utility;
 
 namespace Content.Client.MassMedia.Ui;
 
@@ -16,6 +17,8 @@ public sealed partial class NewsWriterMenu : FancyWindow
 
     public event Action<int>? DeleteButtonPressed;
 
+    public event Action? CreateButtonPressed;
+
     public NewsWriterMenu()
     {
         RobustXamlLoader.Load(this);
@@ -31,7 +34,7 @@ public sealed partial class NewsWriterMenu : FancyWindow
         ButtonCreate.OnPressed += OnCreate;
     }
 
-    public void UpdateUI(NewsArticle[] articles, bool publishEnabled, TimeSpan nextPublish)
+    public void UpdateUI(NewsArticle[] articles, bool publishEnabled, TimeSpan nextPublish, string draftTitle, string draftContent)
     {
         ArticlesContainer.Children.Clear();
         ArticleCount.Text = Loc.GetString("news-write-ui-article-count-text", ("count", articles.Length));
@@ -54,6 +57,9 @@ public sealed partial class NewsWriterMenu : FancyWindow
 
         ButtonCreate.Disabled = !publishEnabled;
         _nextPublish = nextPublish;
+
+        ArticleEditorPanel.TitleField.Text = draftTitle;
+        ArticleEditorPanel.ContentField.TextRope = new Rope.Leaf(draftContent);
     }
 
     protected override void FrameUpdate(FrameEventArgs args)
@@ -93,5 +99,6 @@ public sealed partial class NewsWriterMenu : FancyWindow
     private void OnCreate(BaseButton.ButtonEventArgs buttonEventArgs)
     {
         ArticleEditorPanel.Visible = true;
+        CreateButtonPressed?.Invoke();
     }
 }
index 7005600c10d2942cc67fa95cb8ab4be317773ff2..fcd1250e8ba9a5d648cb9160b2591d31c0dd2e28 100644 (file)
@@ -22,4 +22,16 @@ public sealed partial class NewsWriterComponent : Component
 
     [DataField]
     public SoundSpecifier ConfirmSound = new SoundPathSpecifier("/Audio/Machines/scan_finish.ogg");
+
+    /// <summary>
+    /// This stores the working title of the current article
+    /// </summary>
+    [DataField, ViewVariables]
+    public string DraftTitle = "";
+
+    /// <summary>
+    /// This stores the working content of the current article
+    /// </summary>
+    [DataField, ViewVariables]
+    public string DraftContent = "";
 }
index fd49ebf188a88bd4c146cd65187c164eb609f9ff..899e9419930d4e739882d525eace678aed424830 100644 (file)
@@ -51,6 +51,8 @@ public sealed class NewsSystem : SharedNewsSystem
             subs.Event<NewsWriterDeleteMessage>(OnWriteUiDeleteMessage);
             subs.Event<NewsWriterArticlesRequestMessage>(OnRequestArticlesUiMessage);
             subs.Event<NewsWriterPublishMessage>(OnWriteUiPublishMessage);
+            subs.Event<NewsWriterSaveDraftMessage>(OnNewsWriterDraftUpdatedMessage);
+            subs.Event<NewsWriterRequestDraftMessage>(OnRequestArticleDraftMessage);
         });
 
         // News reader
@@ -256,7 +258,7 @@ public sealed class NewsSystem : SharedNewsSystem
         if (!TryGetArticles(ent, out var articles))
             return;
 
-        var state = new NewsWriterBoundUserInterfaceState(articles.ToArray(), ent.Comp.PublishEnabled, ent.Comp.NextPublish);
+        var state = new NewsWriterBoundUserInterfaceState(articles.ToArray(), ent.Comp.PublishEnabled, ent.Comp.NextPublish, ent.Comp.DraftTitle, ent.Comp.DraftContent);
         _ui.SetUiState(ent.Owner, NewsWriterUiKey.Key, state);
     }
 
@@ -318,4 +320,14 @@ public sealed class NewsSystem : SharedNewsSystem
         return true;
     }
 
+    private void OnNewsWriterDraftUpdatedMessage(Entity<NewsWriterComponent> ent, ref NewsWriterSaveDraftMessage args)
+    {
+        ent.Comp.DraftTitle = args.DraftTitle;
+        ent.Comp.DraftContent = args.DraftContent;
+    }
+
+    private void OnRequestArticleDraftMessage(Entity<NewsWriterComponent> ent, ref NewsWriterRequestDraftMessage msg)
+    {
+        UpdateWriterUi(ent);
+    }
 }
index f3dda487307abf2cd7f9058cd55f4203ec6b0074..ad37a832e914213045e308ad34e197fdea53cba6 100644 (file)
@@ -15,12 +15,16 @@ public sealed class NewsWriterBoundUserInterfaceState : BoundUserInterfaceState
     public readonly NewsArticle[] Articles;
     public readonly bool PublishEnabled;
     public readonly TimeSpan NextPublish;
+    public readonly string DraftTitle;
+    public readonly string DraftContent;
 
-    public NewsWriterBoundUserInterfaceState(NewsArticle[] articles, bool publishEnabled, TimeSpan nextPublish)
+    public NewsWriterBoundUserInterfaceState(NewsArticle[] articles, bool publishEnabled, TimeSpan nextPublish, string draftTitle, string draftContent)
     {
         Articles = articles;
         PublishEnabled = publishEnabled;
         NextPublish = nextPublish;
+        DraftTitle = draftTitle;
+        DraftContent = draftContent;
     }
 }
 
@@ -53,3 +57,21 @@ public sealed class NewsWriterDeleteMessage : BoundUserInterfaceMessage
 public sealed class NewsWriterArticlesRequestMessage : BoundUserInterfaceMessage
 {
 }
+
+[Serializable, NetSerializable]
+public sealed class NewsWriterSaveDraftMessage : BoundUserInterfaceMessage
+{
+    public readonly string DraftTitle;
+    public readonly string DraftContent;
+
+    public NewsWriterSaveDraftMessage(string draftTitle, string draftContent)
+    {
+        DraftTitle = draftTitle;
+        DraftContent = draftContent;
+    }
+}
+
+[Serializable, NetSerializable]
+public sealed class NewsWriterRequestDraftMessage : BoundUserInterfaceMessage
+{
+}
index 678f20a81afbcbdf1a5a8d73d1d3e3f05d5934ce..b6c826936bab05f989f29d695047b9e837d3fd5d 100644 (file)
@@ -15,7 +15,8 @@ news-write-ui-articles-label = Articles:
 news-write-ui-delete-text = Delete
 news-write-ui-publish-text = Publish
 news-write-ui-create-text = Create
-news-write-ui-cancel-text = Cancel
+news-write-ui-cancel-text = Clear
+news-write-ui-save-text = Save
 news-write-ui-preview-text = Preview
 news-write-ui-article-count-0 = 0 Articles
 news-write-ui-article-count-text = {$count} Articles