1
0

TreeItem.xaml.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using Robust.Client.AutoGenerated;
  2. using Robust.Client.UserInterface;
  3. using Robust.Client.UserInterface.Controls;
  4. using Robust.Client.UserInterface.XAML;
  5. namespace Content.Client.UserInterface.Controls.FancyTree;
  6. /// <summary>
  7. /// Element of a <see cref="FancyTree"/>
  8. /// </summary>
  9. [GenerateTypedNameReferences]
  10. public sealed partial class TreeItem : PanelContainer
  11. {
  12. public const string StyleClassSelected = "selected";
  13. public const string StyleIdentifierTreeButton = "tree-button";
  14. public const string StyleClassEvenRow = "even-row";
  15. public const string StyleClassOddRow = "odd-row";
  16. public object? Metadata;
  17. public int Index;
  18. public FancyTree Tree = default!;
  19. public event Action<TreeItem>? OnSelected;
  20. public event Action<TreeItem>? OnDeselected;
  21. public bool Expanded { get; private set; } = false;
  22. public TreeItem()
  23. {
  24. RobustXamlLoader.Load(this);
  25. Button.StyleIdentifier = StyleIdentifierTreeButton;
  26. Body.OnChildAdded += OnItemAdded;
  27. Body.OnChildRemoved += OnItemRemoved;
  28. }
  29. private void OnItemRemoved(Control obj)
  30. {
  31. Tree.QueueRowStyleUpdate();
  32. if (Body.ChildCount == 0)
  33. {
  34. Body.Visible = false;
  35. UpdateIcon();
  36. }
  37. }
  38. private void OnItemAdded(Control obj)
  39. {
  40. Tree.QueueRowStyleUpdate();
  41. if (Body.ChildCount == 1)
  42. {
  43. Body.Visible = Expanded && Body.ChildCount != 0;
  44. UpdateIcon();
  45. }
  46. }
  47. public void SetExpanded(bool value)
  48. {
  49. if (Expanded == value)
  50. return;
  51. Expanded = value;
  52. Body.Visible = Expanded && Body.ChildCount > 0;
  53. UpdateIcon();
  54. Tree.QueueRowStyleUpdate();
  55. }
  56. public void SetSelected(bool value)
  57. {
  58. if (value)
  59. {
  60. OnSelected?.Invoke(this);
  61. Button.AddStyleClass(StyleClassSelected);
  62. }
  63. else
  64. {
  65. OnDeselected?.Invoke(this);
  66. Button.RemoveStyleClass(StyleClassSelected);
  67. }
  68. }
  69. public void UpdateIcon()
  70. {
  71. if (Body.ChildCount == 0)
  72. Icon.Texture = Tree.IconNoChildren;
  73. else
  74. Icon.Texture = Expanded ? Tree.IconExpanded : Tree.IconCollapsed;
  75. Icon.Modulate = Tree.IconColor;
  76. Icon.Visible = Icon.Texture != null || !Tree.HideEmptyIcon;
  77. }
  78. }