</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>
public sealed partial class ArticleEditorPanel : Control
{
public event Action? PublishButtonPressed;
+ public event Action<string, string>? ArticleDraftUpdated;
private bool _preview;
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);
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)
Visible = false;
}
+ private void OnDraftSaved(BaseButton.ButtonEventArgs eventArgs)
+ {
+ ArticleDraftUpdated?.Invoke(TitleField.Text, Rope.Collapse(ContentField.TextRope));
+ Visible = false;
+ }
+
private void Reset()
{
_preview = false;
PreviewLabel.SetMarkup("");
TitleField.Text = "";
ContentField.TextRope = Rope.Leaf.Empty;
+ ArticleDraftUpdated?.Invoke(string.Empty, string.Empty);
}
protected override void Dispose(bool disposing)
_menu.ArticleEditorPanel.PublishButtonPressed += OnPublishButtonPressed;
_menu.DeleteButtonPressed += OnDeleteButtonPressed;
+ _menu.CreateButtonPressed += OnCreateButtonPressed;
+ _menu.ArticleEditorPanel.ArticleDraftUpdated += OnArticleDraftUpdated;
+
SendMessage(new NewsWriterArticlesRequestMessage());
}
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()
SendMessage(new NewsWriterDeleteMessage(articleNum));
}
+
+ private void OnCreateButtonPressed()
+ {
+ SendMessage(new NewsWriterRequestDraftMessage());
+ }
+
+ private void OnArticleDraftUpdated(string title, string content)
+ {
+ SendMessage(new NewsWriterSaveDraftMessage(title, content));
+ }
}
using Content.Shared.MassMedia.Systems;
using Robust.Client.UserInterface.Controls;
using Robust.Shared.Timing;
+using Robust.Shared.Utility;
namespace Content.Client.MassMedia.Ui;
public event Action<int>? DeleteButtonPressed;
+ public event Action? CreateButtonPressed;
+
public NewsWriterMenu()
{
RobustXamlLoader.Load(this);
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));
ButtonCreate.Disabled = !publishEnabled;
_nextPublish = nextPublish;
+
+ ArticleEditorPanel.TitleField.Text = draftTitle;
+ ArticleEditorPanel.ContentField.TextRope = new Rope.Leaf(draftContent);
}
protected override void FrameUpdate(FrameEventArgs args)
private void OnCreate(BaseButton.ButtonEventArgs buttonEventArgs)
{
ArticleEditorPanel.Visible = true;
+ CreateButtonPressed?.Invoke();
}
}
[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 = "";
}
subs.Event<NewsWriterDeleteMessage>(OnWriteUiDeleteMessage);
subs.Event<NewsWriterArticlesRequestMessage>(OnRequestArticlesUiMessage);
subs.Event<NewsWriterPublishMessage>(OnWriteUiPublishMessage);
+ subs.Event<NewsWriterSaveDraftMessage>(OnNewsWriterDraftUpdatedMessage);
+ subs.Event<NewsWriterRequestDraftMessage>(OnRequestArticleDraftMessage);
});
// News reader
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);
}
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);
+ }
}
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;
}
}
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
+{
+}
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