PlaytimeStatsHeader.cs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using Robust.Client.AutoGenerated;
  2. using Robust.Client.UserInterface;
  3. using Robust.Client.UserInterface.Controls;
  4. using Robust.Client.UserInterface.XAML;
  5. using Robust.Shared.Input;
  6. namespace Content.Client.Info.PlaytimeStats;
  7. [GenerateTypedNameReferences]
  8. public sealed partial class PlaytimeStatsHeader : Control
  9. {
  10. public event Action<Header, SortDirection>? OnHeaderClicked;
  11. private SortDirection _roleDirection = SortDirection.Ascending;
  12. private SortDirection _playtimeDirection = SortDirection.Descending;
  13. public PlaytimeStatsHeader()
  14. {
  15. RobustXamlLoader.Load(this);
  16. RoleLabel.OnKeyBindDown += RoleClicked;
  17. PlaytimeLabel.OnKeyBindDown += PlaytimeClicked;
  18. UpdateLabels();
  19. }
  20. public enum Header : byte
  21. {
  22. Role,
  23. Playtime
  24. }
  25. public enum SortDirection : byte
  26. {
  27. Ascending,
  28. Descending
  29. }
  30. private void HeaderClicked(GUIBoundKeyEventArgs args, Header header)
  31. {
  32. if (args.Function != EngineKeyFunctions.UIClick)
  33. {
  34. return;
  35. }
  36. switch (header)
  37. {
  38. case Header.Role:
  39. _roleDirection = _roleDirection == SortDirection.Ascending ? SortDirection.Descending : SortDirection.Ascending;
  40. break;
  41. case Header.Playtime:
  42. _playtimeDirection = _playtimeDirection == SortDirection.Ascending ? SortDirection.Descending : SortDirection.Ascending;
  43. break;
  44. }
  45. UpdateLabels();
  46. OnHeaderClicked?.Invoke(header, header == Header.Role ? _roleDirection : _playtimeDirection);
  47. args.Handle();
  48. }
  49. private void UpdateLabels()
  50. {
  51. RoleLabel.Text = Loc.GetString("ui-playtime-header-role-type") +
  52. (_roleDirection == SortDirection.Ascending ? " ↓" : " ↑");
  53. PlaytimeLabel.Text = Loc.GetString("ui-playtime-header-role-time") +
  54. (_playtimeDirection == SortDirection.Ascending ? " ↓" : " ↑");
  55. }
  56. private void RoleClicked(GUIBoundKeyEventArgs args)
  57. {
  58. HeaderClicked(args, Header.Role);
  59. }
  60. private void PlaytimeClicked(GUIBoundKeyEventArgs args)
  61. {
  62. HeaderClicked(args, Header.Playtime);
  63. }
  64. protected override void Dispose(bool disposing)
  65. {
  66. base.Dispose(disposing);
  67. if (disposing)
  68. {
  69. RoleLabel.OnKeyBindDown -= RoleClicked;
  70. PlaytimeLabel.OnKeyBindDown -= PlaytimeClicked;
  71. }
  72. }
  73. }