NewsWriterMenu.xaml.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. using Content.Client.UserInterface.Controls;
  2. using Robust.Client.AutoGenerated;
  3. using Robust.Client.UserInterface.XAML;
  4. using Content.Shared.MassMedia.Systems;
  5. using Robust.Client.UserInterface.Controls;
  6. using Robust.Shared.Timing;
  7. using Robust.Shared.Utility;
  8. namespace Content.Client.MassMedia.Ui;
  9. [GenerateTypedNameReferences]
  10. public sealed partial class NewsWriterMenu : FancyWindow
  11. {
  12. [Dependency] private readonly IGameTiming _gameTiming = default!;
  13. private TimeSpan? _nextPublish;
  14. public event Action<int>? DeleteButtonPressed;
  15. public event Action? CreateButtonPressed;
  16. public NewsWriterMenu()
  17. {
  18. RobustXamlLoader.Load(this);
  19. IoCManager.InjectDependencies(this);
  20. ContentsContainer.RectClipContent = false;
  21. // Customize scrollbar width and margin. This is not possible in xaml
  22. var scrollbar = ArticleListScrollbar.GetChild(1);
  23. scrollbar.SetWidth = 6f;
  24. scrollbar.Margin = new Thickness(0, 0, 2 , 0);
  25. ButtonCreate.OnPressed += OnCreate;
  26. }
  27. public void UpdateUI(NewsArticle[] articles, bool publishEnabled, TimeSpan nextPublish, string draftTitle, string draftContent)
  28. {
  29. ArticlesContainer.Children.Clear();
  30. ArticleCount.Text = Loc.GetString("news-write-ui-article-count-text", ("count", articles.Length));
  31. //Iterate backwards to have the newest article at the top
  32. for (var i = articles.Length - 1; i >= 0 ; i--)
  33. {
  34. var article = articles[i];
  35. var control = new NewsArticleCard
  36. {
  37. Title = article.Title,
  38. Author = article.Author ?? Loc.GetString("news-read-ui-no-author"),
  39. PublicationTime = article.ShareTime,
  40. ArtcileNumber = i
  41. };
  42. control.OnDeletePressed += () => DeleteButtonPressed?.Invoke(control.ArtcileNumber);
  43. ArticlesContainer.AddChild(control);
  44. }
  45. ButtonCreate.Disabled = !publishEnabled;
  46. _nextPublish = nextPublish;
  47. ArticleEditorPanel.TitleField.Text = draftTitle;
  48. ArticleEditorPanel.ContentField.TextRope = new Rope.Leaf(draftContent);
  49. }
  50. protected override void FrameUpdate(FrameEventArgs args)
  51. {
  52. base.FrameUpdate(args);
  53. if (!_nextPublish.HasValue)
  54. return;
  55. var remainingTime = _nextPublish.Value.Subtract(_gameTiming.CurTime);
  56. if (remainingTime.TotalSeconds <= 0)
  57. {
  58. _nextPublish = null;
  59. ButtonCreate.Text = Loc.GetString("news-write-ui-create-text");
  60. return;
  61. }
  62. ButtonCreate.Text = remainingTime.Seconds.ToString("D2");
  63. }
  64. protected override void Resized()
  65. {
  66. base.Resized();
  67. var margin = ArticleEditorPanel.Margin;
  68. // Bandaid for the funny 1 pixel margin differences
  69. ArticleEditorPanel.Margin = new Thickness(Width - 1, margin.Top, margin.Right, margin.Bottom);
  70. }
  71. protected override void Dispose(bool disposing)
  72. {
  73. base.Dispose(disposing);
  74. if (!disposing)
  75. return;
  76. ButtonCreate.OnPressed -= OnCreate;
  77. }
  78. private void OnCreate(BaseButton.ButtonEventArgs buttonEventArgs)
  79. {
  80. ArticleEditorPanel.Visible = true;
  81. CreateButtonPressed?.Invoke();
  82. }
  83. }