IconButton.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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 IconButton : Image
  10. {
  11. public const string UssClassName = "unity-icon-button";
  12. public const string UndoUssClassName = "btn-undo";
  13. public const string ShowUssClassName = "btn-show";
  14. public const string MergeUssClassName = "btn-merge";
  15. public const string ChooseMineUssClassName = "btn-choose-mine";
  16. public const string ChooseRemoteUssClassName = "btn-choose-remote";
  17. public const string DiffUssCLassName = "btn-diff";
  18. static readonly string k_StylePath = $"{CollaborateWindow.StylePath}/{nameof(IconButton)}.uss";
  19. public event Action Clicked;
  20. public IconButton() : this(null)
  21. {
  22. }
  23. public IconButton([CanBeNull] Action clickEvent = null)
  24. {
  25. AddToClassList(UssClassName);
  26. styleSheets.Add(AssetDatabase.LoadAssetAtPath<StyleSheet>(k_StylePath));
  27. // Setup Clickable
  28. Clicked += clickEvent;
  29. this.AddManipulator(new Clickable(OnClick));
  30. }
  31. void OnClick()
  32. {
  33. Clicked?.Invoke();
  34. Blur();
  35. }
  36. /// <summary>
  37. /// Remove all event handlers for the Clicked event.
  38. /// </summary>
  39. public void UnregisterClickEvents()
  40. {
  41. Clicked = null;
  42. }
  43. public Texture2D Image
  44. {
  45. get => style.backgroundImage.value.texture;
  46. set => style.backgroundImage = value;
  47. }
  48. public override bool canGrabFocus { get; } = true;
  49. /// <summary>
  50. /// Catch the enter key event to allow for tab & enter UI navigation.
  51. /// </summary>
  52. /// <param name="evt">Event to check.</param>
  53. protected override void ExecuteDefaultActionAtTarget(EventBase evt)
  54. {
  55. base.ExecuteDefaultActionAtTarget(evt);
  56. // Catch enter key being pressed.
  57. if (!(evt is KeyDownEvent downEvent)) return;
  58. if ((downEvent.keyCode != KeyCode.KeypadEnter) && (downEvent.keyCode != KeyCode.Return)) return;
  59. Clicked?.Invoke();
  60. downEvent.StopPropagation();
  61. }
  62. [UsedImplicitly]
  63. public new class UxmlFactory : UxmlFactory<IconButton> {}
  64. }
  65. }