1
0

ChangelogTab.xaml.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. using System.Linq;
  2. using System.Numerics;
  3. using Content.Client.Resources;
  4. using Content.Client.Stylesheets;
  5. using Robust.Client.AutoGenerated;
  6. using Robust.Client.ResourceManagement;
  7. using Robust.Client.UserInterface;
  8. using Robust.Client.UserInterface.Controls;
  9. using Robust.Client.UserInterface.XAML;
  10. using Robust.Shared.ContentPack;
  11. using Robust.Shared.Utility;
  12. using static Content.Client.Changelog.ChangelogManager;
  13. using static Robust.Client.UserInterface.Controls.BoxContainer;
  14. namespace Content.Client.Changelog;
  15. [GenerateTypedNameReferences]
  16. public sealed partial class ChangelogTab : Control
  17. {
  18. [Dependency] private readonly ChangelogManager _changelog = default!;
  19. [Dependency] private readonly IResourceCache _resourceCache = default!;
  20. public bool AdminOnly;
  21. public ChangelogTab()
  22. {
  23. RobustXamlLoader.Load(this);
  24. IoCManager.InjectDependencies(this);
  25. }
  26. public void PopulateChangelog(ChangelogManager.Changelog changelog)
  27. {
  28. var byDay = changelog.Entries
  29. .GroupBy(e => e.Time.ToLocalTime().Date)
  30. .OrderByDescending(c => c.Key);
  31. var hasRead = changelog.Name != MainChangelogName ||
  32. _changelog.MaxId <= _changelog.LastReadId;
  33. foreach (var dayEntries in byDay)
  34. {
  35. var day = dayEntries.Key;
  36. var groupedEntries = dayEntries
  37. .GroupBy(c => (c.Author, Read: c.Id <= _changelog.LastReadId))
  38. .OrderBy(c => c.Key.Read)
  39. .ThenBy(c => c.Key.Author);
  40. string dayNice;
  41. var today = DateTime.Today;
  42. if (day == today)
  43. dayNice = Loc.GetString("changelog-today");
  44. else if (day == today.AddDays(-1))
  45. dayNice = Loc.GetString("changelog-yesterday");
  46. else
  47. dayNice = day.ToShortDateString();
  48. ChangelogBody.AddChild(new Label
  49. {
  50. Text = dayNice,
  51. StyleClasses = { StyleBase.StyleClassLabelHeading },
  52. Margin = new Thickness(4, 6, 0, 0)
  53. });
  54. var first = true;
  55. foreach (var groupedEntry in groupedEntries)
  56. {
  57. var (author, read) = groupedEntry.Key;
  58. if (!first)
  59. {
  60. ChangelogBody.AddChild(new Control { Margin = new Thickness(4) });
  61. }
  62. if (read && !hasRead)
  63. {
  64. hasRead = true;
  65. var upArrow =
  66. _resourceCache.GetTexture("/Textures/Interface/Changelog/up_arrow.svg.192dpi.png");
  67. var readDivider = new BoxContainer
  68. {
  69. Orientation = LayoutOrientation.Vertical
  70. };
  71. var hBox = new BoxContainer
  72. {
  73. Orientation = LayoutOrientation.Horizontal,
  74. HorizontalAlignment = HAlignment.Center,
  75. Children =
  76. {
  77. new TextureRect
  78. {
  79. Texture = upArrow,
  80. ModulateSelfOverride = Color.FromHex("#888"),
  81. TextureScale = new Vector2(0.5f, 0.5f),
  82. Margin = new Thickness(4, 3),
  83. VerticalAlignment = VAlignment.Bottom
  84. },
  85. new Label
  86. {
  87. Align = Label.AlignMode.Center,
  88. Text = Loc.GetString("changelog-new-changes"),
  89. FontColorOverride = Color.FromHex("#888"),
  90. },
  91. new TextureRect
  92. {
  93. Texture = upArrow,
  94. ModulateSelfOverride = Color.FromHex("#888"),
  95. TextureScale = new Vector2(0.5f, 0.5f),
  96. Margin = new Thickness(4, 3),
  97. VerticalAlignment = VAlignment.Bottom
  98. }
  99. }
  100. };
  101. readDivider.AddChild(hBox);
  102. readDivider.AddChild(new PanelContainer { StyleClasses = { StyleBase.ClassLowDivider } });
  103. ChangelogBody.AddChild(readDivider);
  104. if (first)
  105. readDivider.SetPositionInParent(ChangelogBody.ChildCount - 2);
  106. }
  107. first = false;
  108. var authorLabel = new RichTextLabel
  109. {
  110. Margin = new Thickness(6, 0, 0, 0),
  111. };
  112. authorLabel.SetMessage(
  113. FormattedMessage.FromMarkupOrThrow(Loc.GetString("changelog-author-changed", ("author", author))));
  114. ChangelogBody.AddChild(authorLabel);
  115. foreach (var change in groupedEntry.SelectMany(c => c.Changes))
  116. {
  117. var text = new RichTextLabel();
  118. text.SetMessage(FormattedMessage.FromMarkupOrThrow(change.Message));
  119. ChangelogBody.AddChild(new BoxContainer
  120. {
  121. Orientation = LayoutOrientation.Horizontal,
  122. Margin = new Thickness(14, 1, 10, 2),
  123. Children =
  124. {
  125. GetIcon(change.Type),
  126. text
  127. }
  128. });
  129. }
  130. }
  131. }
  132. }
  133. private TextureRect GetIcon(ChangelogLineType type)
  134. {
  135. var (file, color) = type switch
  136. {
  137. ChangelogLineType.Add => ("plus.svg.192dpi.png", "#6ED18D"),
  138. ChangelogLineType.Remove => ("minus.svg.192dpi.png", "#D16E6E"),
  139. ChangelogLineType.Fix => ("bug.svg.192dpi.png", "#D1BA6E"),
  140. ChangelogLineType.Tweak => ("wrench.svg.192dpi.png", "#6E96D1"),
  141. _ => throw new ArgumentOutOfRangeException(nameof(type), type, null)
  142. };
  143. return new TextureRect
  144. {
  145. Texture = _resourceCache.GetTexture(new ResPath($"/Textures/Interface/Changelog/{file}")),
  146. VerticalAlignment = VAlignment.Top,
  147. TextureScale = new Vector2(0.5f, 0.5f),
  148. Margin = new Thickness(2, 4, 6, 2),
  149. ModulateSelfOverride = Color.FromHex(color)
  150. };
  151. }
  152. }