PlaytimeStatsWindow.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. using System.Linq;
  2. using System.Text.RegularExpressions;
  3. using Content.Client.Players.PlayTimeTracking;
  4. using Content.Client.UserInterface.Controls;
  5. using Robust.Client.AutoGenerated;
  6. using Robust.Client.Graphics;
  7. using Robust.Client.UserInterface.XAML;
  8. namespace Content.Client.Info.PlaytimeStats;
  9. [GenerateTypedNameReferences]
  10. public sealed partial class PlaytimeStatsWindow : FancyWindow
  11. {
  12. [Dependency] private readonly JobRequirementsManager _jobRequirementsManager = default!;
  13. private ISawmill _sawmill = Logger.GetSawmill("PlaytimeStatsWindow");
  14. private readonly Color _altColor = Color.FromHex("#292B38");
  15. private readonly Color _defaultColor = Color.FromHex("#2F2F3B");
  16. private bool _useAltColor;
  17. public PlaytimeStatsWindow()
  18. {
  19. IoCManager.InjectDependencies(this);
  20. RobustXamlLoader.Load(this);
  21. PopulatePlaytimeHeader();
  22. PopulatePlaytimeData();
  23. }
  24. private void PopulatePlaytimeHeader()
  25. {
  26. var header = new PlaytimeStatsHeader();
  27. header.OnHeaderClicked += HeaderClicked;
  28. header.BackgroundColorPlaytimePanel.PanelOverride = new StyleBoxFlat(_altColor);
  29. RolesPlaytimeList.AddChild(header);
  30. }
  31. private void HeaderClicked(PlaytimeStatsHeader.Header header, PlaytimeStatsHeader.SortDirection direction)
  32. {
  33. switch (header)
  34. {
  35. case PlaytimeStatsHeader.Header.Role:
  36. SortByRole(direction);
  37. break;
  38. case PlaytimeStatsHeader.Header.Playtime:
  39. SortByPlaytime(direction);
  40. break;
  41. }
  42. }
  43. private void SortByRole(PlaytimeStatsHeader.SortDirection direction)
  44. {
  45. var header = RolesPlaytimeList.GetChild(0) as PlaytimeStatsHeader;
  46. var entries = RolesPlaytimeList.Children.OfType<PlaytimeStatsEntry>().ToList();
  47. RolesPlaytimeList.RemoveAllChildren();
  48. if (header != null)
  49. RolesPlaytimeList.AddChild(header);
  50. var sortedEntries = (direction == PlaytimeStatsHeader.SortDirection.Ascending)
  51. ? entries.OrderBy(entry => entry.RoleText).ToList()
  52. : entries.OrderByDescending(entry => entry.RoleText).ToList();
  53. _useAltColor = false;
  54. foreach (var entry in sortedEntries)
  55. {
  56. var styleBox = new StyleBoxFlat { BackgroundColor = _useAltColor ? _altColor : _defaultColor };
  57. entry.UpdateShading(styleBox);
  58. RolesPlaytimeList.AddChild(entry);
  59. _useAltColor ^= true;
  60. }
  61. }
  62. private void SortByPlaytime(PlaytimeStatsHeader.SortDirection direction)
  63. {
  64. var header = RolesPlaytimeList.GetChild(0) as PlaytimeStatsHeader;
  65. var entries = RolesPlaytimeList.Children.OfType<PlaytimeStatsEntry>().ToList();
  66. RolesPlaytimeList.RemoveAllChildren();
  67. if (header != null)
  68. RolesPlaytimeList.AddChild(header);
  69. var sortedEntries = (direction == PlaytimeStatsHeader.SortDirection.Ascending)
  70. ? entries.OrderBy(entry => entry.Playtime).ToList()
  71. : entries.OrderByDescending(entry => entry.Playtime).ToList();
  72. _useAltColor = false;
  73. foreach (var entry in sortedEntries)
  74. {
  75. var styleBox = new StyleBoxFlat { BackgroundColor = _useAltColor ? _altColor : _defaultColor };
  76. entry.UpdateShading(styleBox);
  77. RolesPlaytimeList.AddChild(entry);
  78. _useAltColor ^= true;
  79. }
  80. }
  81. private void PopulatePlaytimeData()
  82. {
  83. var overallPlaytime = _jobRequirementsManager.FetchOverallPlaytime();
  84. OverallPlaytimeLabel.Text = Loc.GetString("ui-playtime-overall", ("time", overallPlaytime));
  85. var rolePlaytimes = _jobRequirementsManager.FetchPlaytimeByRoles();
  86. RolesPlaytimeList.RemoveAllChildren();
  87. PopulatePlaytimeHeader();
  88. foreach (var rolePlaytime in rolePlaytimes)
  89. {
  90. var role = rolePlaytime.Key;
  91. var playtime = rolePlaytime.Value;
  92. AddRolePlaytimeEntryToTable(Loc.GetString(role), playtime.ToString());
  93. }
  94. }
  95. private void AddRolePlaytimeEntryToTable(string role, string playtimeString)
  96. {
  97. if (TimeSpan.TryParse(playtimeString, out var playtime))
  98. {
  99. var entry = new PlaytimeStatsEntry(role, playtime,
  100. new StyleBoxFlat(_useAltColor ? _altColor : _defaultColor));
  101. RolesPlaytimeList.AddChild(entry);
  102. _useAltColor ^= true;
  103. }
  104. else
  105. {
  106. _sawmill.Error($"The provided playtime string '{playtimeString}' is not in the correct format.");
  107. }
  108. }
  109. }