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