PrefItem.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. using System;
  2. using UnityEditor;
  3. using UnityEngine;
  4. namespace EnhancedHierarchy {
  5. /// <summary>
  6. /// Generic preference item interface.
  7. /// </summary>
  8. public interface IPrefItem {
  9. bool Drawing { get; }
  10. object Value { get; set; }
  11. GUIContent Label { get; }
  12. //void DoGUI();
  13. GUIEnabled GetEnabledScope();
  14. GUIEnabled GetEnabledScope(bool enabled);
  15. GUIFade GetFadeScope(bool enabled);
  16. }
  17. /// <summary>
  18. /// Generic preference item.
  19. /// </summary>
  20. [Serializable]
  21. public sealed class PrefItem<T> : IPrefItem {
  22. [Serializable]
  23. private struct Wrapper {
  24. [SerializeField]
  25. public T value;
  26. }
  27. private const string KEY_PREFIX = "EH.";
  28. private string key;
  29. private Wrapper wrapper;
  30. private T defaultValue;
  31. private readonly GUIFade fade;
  32. public GUIContent Label { get; private set; }
  33. public bool Drawing { get { return fade.Visible; } }
  34. public T DefaultValue {
  35. get { return defaultValue; }
  36. set { SetDefaultValue(value); }
  37. }
  38. public T Value {
  39. get { return wrapper.value; }
  40. set { SetValue(value, false); }
  41. }
  42. private bool UsingDefaultValue { get { return !EditorPrefs.HasKey(key); } }
  43. object IPrefItem.Value {
  44. get { return Value; }
  45. set { Value = (T)value; }
  46. }
  47. public PrefItem(string key, T defaultValue, string text = "", string tooltip = "") {
  48. this.key = KEY_PREFIX + key;
  49. this.defaultValue = defaultValue;
  50. Label = new GUIContent(text, tooltip);
  51. fade = new GUIFade();
  52. Preferences.contents.Add(Label);
  53. Preferences.onResetPreferences += ResetValue;
  54. if (UsingDefaultValue)
  55. wrapper.value = Clone(defaultValue);
  56. else
  57. LoadValue();
  58. }
  59. public void SetDefaultValue(T newDefault) {
  60. if (UsingDefaultValue)
  61. wrapper.value = Clone(newDefault);
  62. defaultValue = newDefault;
  63. }
  64. private void LoadValue() {
  65. try {
  66. if (!EditorPrefs.HasKey(key))
  67. return;
  68. var json = EditorPrefs.GetString(key);
  69. // if(Preferences.DebugEnabled)
  70. // Debug.LogFormat("Loading preference {0}: {1}", key, json);
  71. wrapper = JsonUtility.FromJson<Wrapper>(json);
  72. } catch (Exception e) {
  73. Debug.LogWarningFormat("Failed to load preference item \"{0}\", using default value: {1}", key, defaultValue);
  74. Debug.LogException(e);
  75. ResetValue();
  76. }
  77. }
  78. private void SetValue(T newValue, bool forceSave) {
  79. try {
  80. if (Value != null && Value.Equals(newValue) && !forceSave)
  81. return;
  82. wrapper.value = newValue;
  83. var json = JsonUtility.ToJson(wrapper, Preferences.DebugEnabled);
  84. // if(Preferences.DebugEnabled)
  85. // Debug.LogFormat("Saving preference {0}: {1}", key, json);
  86. EditorPrefs.SetString(key, json);
  87. } catch (Exception e) {
  88. Debug.LogWarningFormat("Failed to save {0}: {1}", key, e);
  89. Debug.LogException(e);
  90. } finally {
  91. wrapper.value = newValue;
  92. }
  93. }
  94. private void ResetValue() {
  95. if (UsingDefaultValue)
  96. return;
  97. if (Preferences.DebugEnabled)
  98. Debug.LogFormat("Deleted preference {0}", key);
  99. wrapper.value = Clone(defaultValue);
  100. EditorPrefs.DeleteKey(key);
  101. }
  102. public void ForceSave() {
  103. SetValue(wrapper.value, true);
  104. }
  105. private T Clone(T other) {
  106. if (typeof(T).IsValueType)
  107. return other;
  108. var wrapper = new Wrapper() { value = other };
  109. var json = JsonUtility.ToJson(wrapper, Preferences.DebugEnabled);
  110. var clonnedWrapper = JsonUtility.FromJson<Wrapper>(json);
  111. // if(Preferences.DebugEnabled)
  112. // Debug.LogFormat("Clone of {0}: {1}", key, json);
  113. return clonnedWrapper.value;
  114. }
  115. public GUIEnabled GetEnabledScope() {
  116. return GetEnabledScope(Value.Equals(true));
  117. }
  118. public GUIEnabled GetEnabledScope(bool enabled) {
  119. return new GUIEnabled(enabled);
  120. }
  121. public GUIFade GetFadeScope(bool enabled) {
  122. fade.SetTarget(enabled);
  123. return fade;
  124. }
  125. public static implicit operator T(PrefItem<T> pb) {
  126. if (pb == null) {
  127. Debug.LogError("Cannot get the value of a null PrefItem");
  128. return default(T);
  129. }
  130. return pb.Value;
  131. }
  132. public static implicit operator GUIContent(PrefItem<T> pb) {
  133. if (pb == null) {
  134. Debug.LogError("Cannot get the content of a null PrefItem");
  135. return new GUIContent("Null PrefItem");
  136. }
  137. return pb.Label;
  138. }
  139. }
  140. }