IconTextButton.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using System;
  2. using JetBrains.Annotations;
  3. using Unity.Cloud.Collaborate.UserInterface;
  4. using UnityEditor;
  5. using UnityEngine;
  6. using UnityEngine.UIElements;
  7. namespace Unity.Cloud.Collaborate.Components
  8. {
  9. internal class IconTextButton : VisualElement
  10. {
  11. public const string ussClassName = "unity-icon-text-button";
  12. public const string imageUssClassName = ussClassName + "__image";
  13. public const string textUssClassName = ussClassName + "__text";
  14. static readonly string k_StylePath = $"{CollaborateWindow.StylePath}/{nameof(IconTextButton)}.uss";
  15. readonly TextElement m_TextElement;
  16. readonly VisualElement m_Image;
  17. public event Action Clicked;
  18. public IconTextButton() : this(null)
  19. {
  20. }
  21. public IconTextButton([CanBeNull] Action clickEvent = null)
  22. {
  23. AddToClassList(ussClassName);
  24. AddToClassList(Button.ussClassName);
  25. styleSheets.Add(AssetDatabase.LoadAssetAtPath<StyleSheet>(k_StylePath));
  26. Add(m_Image = new Image());
  27. Add(m_TextElement = new TextElement());
  28. m_Image.AddToClassList(imageUssClassName);
  29. m_TextElement.AddToClassList(textUssClassName);
  30. // Setup Clickable
  31. Clicked += clickEvent;
  32. this.AddManipulator(new Clickable(OnClick));
  33. }
  34. void OnClick()
  35. {
  36. Clicked?.Invoke();
  37. Blur();
  38. }
  39. public string Text
  40. {
  41. get => m_TextElement.text;
  42. set => m_TextElement.text = value;
  43. }
  44. public Texture2D Image
  45. {
  46. get => m_Image.style.backgroundImage.value.texture;
  47. set => m_Image.style.backgroundImage = value;
  48. }
  49. public override bool canGrabFocus { get; } = true;
  50. /// <summary>
  51. /// Catch the enter key event to allow for tab & enter UI navigation.
  52. /// </summary>
  53. /// <param name="evt">Event to check.</param>
  54. protected override void ExecuteDefaultActionAtTarget(EventBase evt)
  55. {
  56. base.ExecuteDefaultActionAtTarget(evt);
  57. // Catch enter key being pressed.
  58. if (!(evt is KeyDownEvent downEvent)) return;
  59. if ((downEvent.keyCode != KeyCode.KeypadEnter) && (downEvent.keyCode != KeyCode.Return)) return;
  60. Clicked?.Invoke();
  61. downEvent.StopPropagation();
  62. }
  63. [UsedImplicitly]
  64. public new class UxmlFactory : UxmlFactory<IconTextButton, UxmlTraits> {}
  65. public new class UxmlTraits : VisualElement.UxmlTraits
  66. {
  67. readonly UxmlStringAttributeDescription m_Text = new UxmlStringAttributeDescription { name = "text" };
  68. public override void Init(VisualElement ve, IUxmlAttributes bag, CreationContext cc)
  69. {
  70. base.Init(ve, bag, cc);
  71. var field = (IconTextButton)ve;
  72. field.Text = m_Text.GetValueFromBag(bag, cc);
  73. }
  74. }
  75. }
  76. }