Ei kuvausta
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

RenameableLabel.cs 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. using System;
  2. using UnityEngine;
  3. using UnityEngine.UIElements;
  4. namespace UnityEditor.Tilemaps.External
  5. {
  6. /// <summary>
  7. /// Label that can be renamed.
  8. /// </summary>
  9. class RenameableLabel : VisualElement
  10. {
  11. static readonly string k_USSFilePath = "Packages/com.unity.2d.tilemap/Editor/UI/External/RenameableLabel.uss";
  12. public static readonly string ussClassName = "u2d-renameable-label";
  13. /// <summary>
  14. /// Text to display.
  15. /// </summary>
  16. internal string text
  17. {
  18. get => label.text;
  19. set => label.text = value;
  20. }
  21. internal bool isRenaming { get; set; }
  22. internal event Action<RenameableLabel, bool> renameEnding;
  23. Label label { get; } = new();
  24. TextField textField { get; } = new();
  25. internal RenameableLabel() : base()
  26. {
  27. name = ussClassName;
  28. AddToClassList(ussClassName);
  29. styleSheets.Add(AssetDatabase.LoadAssetAtPath<StyleSheet>(k_USSFilePath));
  30. focusable = true;
  31. delegatesFocus = false;
  32. Add(label);
  33. Add(textField);
  34. label.RegisterCallback<MouseUpEvent>(OnLabelMouseUpEvent);
  35. textField.selectAllOnFocus = true;
  36. textField.selectAllOnMouseUp = false;
  37. textField.style.display = DisplayStyle.None;
  38. textField.RegisterCallback<MouseUpEvent>(OnMouseUpEvent);
  39. textField.RegisterCallback<KeyDownEvent>(OnKeyDownEvent);
  40. textField.RegisterCallback<BlurEvent>(OnBlurEvent);
  41. }
  42. internal void BeginRename()
  43. {
  44. if (isRenaming)
  45. return;
  46. isRenaming = true;
  47. delegatesFocus = true;
  48. label.style.display = DisplayStyle.None;
  49. textField.style.display = DisplayStyle.Flex;
  50. textField.value = text;
  51. textField.Q<TextElement>().Focus();
  52. }
  53. internal void CancelRename()
  54. {
  55. if (isRenaming)
  56. EndRename(false);
  57. }
  58. void EndRename(bool canceled = false)
  59. {
  60. isRenaming = false;
  61. delegatesFocus = false;
  62. schedule.Execute(Focus);
  63. textField.style.display = DisplayStyle.None;
  64. label.style.display = DisplayStyle.Flex;
  65. if (!canceled) // When the rename is canceled, the label keep its current value.
  66. label.text = textField.value;
  67. renameEnding?.Invoke(this, canceled);
  68. }
  69. void OnLabelMouseUpEvent(MouseUpEvent evt)
  70. {
  71. if (isRenaming)
  72. return;
  73. BeginRename();
  74. evt.StopPropagation();
  75. }
  76. void OnMouseUpEvent(MouseUpEvent evt)
  77. {
  78. if (!isRenaming)
  79. return;
  80. textField.Q<TextElement>().Focus();
  81. evt.StopPropagation();
  82. }
  83. void OnKeyDownEvent(KeyDownEvent evt)
  84. {
  85. if (isRenaming && evt.keyCode == KeyCode.Escape)
  86. EndRename(true);
  87. }
  88. void OnBlurEvent(BlurEvent evt)
  89. {
  90. if (!isRenaming)
  91. return;
  92. EndRename();
  93. }
  94. }
  95. }