EditableLabel.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. #if UNITY_2019_1_OR_NEWER
  5. using UnityEngine.UIElements;
  6. #else
  7. using UnityEngine.Experimental.UIElements;
  8. #endif
  9. namespace UnityEditor.Recorder
  10. {
  11. class EditableLabel : VisualElement
  12. {
  13. readonly Label m_Label;
  14. readonly TextField m_TextField;
  15. bool m_IsEditing;
  16. Action<string> m_OnValueChangedCallback;
  17. Focusable m_PreviouslyFocused;
  18. internal string text
  19. {
  20. get { return m_Label.text; }
  21. set { m_Label.text = value; }
  22. }
  23. internal void SetLabelEnabled(bool value)
  24. {
  25. m_Label.SetEnabled(value);
  26. }
  27. internal EditableLabel()
  28. {
  29. m_IsEditing = false;
  30. m_Label = new Label();
  31. m_TextField = new TextField();
  32. UIElementHelper.SetFlex(this, 1.0f);
  33. UIElementHelper.SetFlex(m_TextField, 1.0f);
  34. Add(m_Label);
  35. UIElementHelper.RegisterTrickleDownCallback<KeyUpEvent>(this, OnKeyUpCallback);
  36. m_TextField.RegisterCallback<FocusOutEvent>(OnTextFieldLostFocus);
  37. }
  38. void SetValueAndNotify(string newValue)
  39. {
  40. if (EqualityComparer<string>.Default.Equals(m_Label.text, newValue))
  41. return;
  42. if (string.IsNullOrEmpty(newValue))
  43. return;
  44. m_Label.text = newValue;
  45. if (m_OnValueChangedCallback != null)
  46. m_OnValueChangedCallback.Invoke(newValue);
  47. }
  48. internal void OnValueChanged(Action<string> callback)
  49. {
  50. m_OnValueChangedCallback = callback;
  51. }
  52. internal void StartEditing()
  53. {
  54. if (m_IsEditing)
  55. return;
  56. m_IsEditing = true;
  57. m_TextField.value = m_Label.text;
  58. Remove(m_Label);
  59. Add(m_TextField);
  60. UIElementHelper.SetFocusable(m_TextField);
  61. #if UNITY_2019_1_OR_NEWER
  62. m_TextField.delegatesFocus = true;
  63. #endif
  64. m_PreviouslyFocused = focusController.focusedElement;
  65. m_TextField.Focus();
  66. }
  67. void ApplyEditing()
  68. {
  69. if (!m_IsEditing)
  70. return;
  71. SetValueAndNotify(m_TextField.text);
  72. m_IsEditing = false;
  73. Remove(m_TextField);
  74. Add(m_Label);
  75. }
  76. void CancelEditing()
  77. {
  78. if (!m_IsEditing)
  79. return;
  80. m_IsEditing = false;
  81. Remove(m_TextField);
  82. Add(m_Label);
  83. }
  84. void OnTextFieldLostFocus(FocusOutEvent evt)
  85. {
  86. ApplyEditing();
  87. }
  88. void OnKeyUpCallback(KeyUpEvent evt)
  89. {
  90. if (!m_IsEditing)
  91. return;
  92. if (evt.keyCode == KeyCode.Return || evt.keyCode == KeyCode.KeypadEnter)
  93. {
  94. ApplyEditing();
  95. RestorePreviousFocus();
  96. evt.StopImmediatePropagation();
  97. }
  98. else if (evt.keyCode == KeyCode.Escape)
  99. {
  100. CancelEditing();
  101. RestorePreviousFocus();
  102. evt.StopImmediatePropagation();
  103. }
  104. }
  105. void RestorePreviousFocus()
  106. {
  107. if (m_PreviouslyFocused != null)
  108. m_PreviouslyFocused.Focus();
  109. }
  110. }
  111. }