using System;
using UnityEditor;
using UnityEngine;
namespace EnhancedHierarchy {
///
/// Generic preference item interface.
///
public interface IPrefItem {
bool Drawing { get; }
object Value { get; set; }
GUIContent Label { get; }
//void DoGUI();
GUIEnabled GetEnabledScope();
GUIEnabled GetEnabledScope(bool enabled);
GUIFade GetFadeScope(bool enabled);
}
///
/// Generic preference item.
///
[Serializable]
public sealed class PrefItem : IPrefItem {
[Serializable]
private struct Wrapper {
[SerializeField]
public T value;
}
private const string KEY_PREFIX = "EH.";
private string key;
private Wrapper wrapper;
private T defaultValue;
private readonly GUIFade fade;
public GUIContent Label { get; private set; }
public bool Drawing { get { return fade.Visible; } }
public T DefaultValue {
get { return defaultValue; }
set { SetDefaultValue(value); }
}
public T Value {
get { return wrapper.value; }
set { SetValue(value, false); }
}
private bool UsingDefaultValue { get { return !EditorPrefs.HasKey(key); } }
object IPrefItem.Value {
get { return Value; }
set { Value = (T)value; }
}
public PrefItem(string key, T defaultValue, string text = "", string tooltip = "") {
this.key = KEY_PREFIX + key;
this.defaultValue = defaultValue;
Label = new GUIContent(text, tooltip);
fade = new GUIFade();
Preferences.contents.Add(Label);
Preferences.onResetPreferences += ResetValue;
if (UsingDefaultValue)
wrapper.value = Clone(defaultValue);
else
LoadValue();
}
public void SetDefaultValue(T newDefault) {
if (UsingDefaultValue)
wrapper.value = Clone(newDefault);
defaultValue = newDefault;
}
private void LoadValue() {
try {
if (!EditorPrefs.HasKey(key))
return;
var json = EditorPrefs.GetString(key);
// if(Preferences.DebugEnabled)
// Debug.LogFormat("Loading preference {0}: {1}", key, json);
wrapper = JsonUtility.FromJson(json);
} catch (Exception e) {
Debug.LogWarningFormat("Failed to load preference item \"{0}\", using default value: {1}", key, defaultValue);
Debug.LogException(e);
ResetValue();
}
}
private void SetValue(T newValue, bool forceSave) {
try {
if (Value != null && Value.Equals(newValue) && !forceSave)
return;
wrapper.value = newValue;
var json = JsonUtility.ToJson(wrapper, Preferences.DebugEnabled);
// if(Preferences.DebugEnabled)
// Debug.LogFormat("Saving preference {0}: {1}", key, json);
EditorPrefs.SetString(key, json);
} catch (Exception e) {
Debug.LogWarningFormat("Failed to save {0}: {1}", key, e);
Debug.LogException(e);
} finally {
wrapper.value = newValue;
}
}
private void ResetValue() {
if (UsingDefaultValue)
return;
if (Preferences.DebugEnabled)
Debug.LogFormat("Deleted preference {0}", key);
wrapper.value = Clone(defaultValue);
EditorPrefs.DeleteKey(key);
}
public void ForceSave() {
SetValue(wrapper.value, true);
}
private T Clone(T other) {
if (typeof(T).IsValueType)
return other;
var wrapper = new Wrapper() { value = other };
var json = JsonUtility.ToJson(wrapper, Preferences.DebugEnabled);
var clonnedWrapper = JsonUtility.FromJson(json);
// if(Preferences.DebugEnabled)
// Debug.LogFormat("Clone of {0}: {1}", key, json);
return clonnedWrapper.value;
}
public GUIEnabled GetEnabledScope() {
return GetEnabledScope(Value.Equals(true));
}
public GUIEnabled GetEnabledScope(bool enabled) {
return new GUIEnabled(enabled);
}
public GUIFade GetFadeScope(bool enabled) {
fade.SetTarget(enabled);
return fade;
}
public static implicit operator T(PrefItem pb) {
if (pb == null) {
Debug.LogError("Cannot get the value of a null PrefItem");
return default(T);
}
return pb.Value;
}
public static implicit operator GUIContent(PrefItem pb) {
if (pb == null) {
Debug.LogError("Cannot get the content of a null PrefItem");
return new GUIContent("Null PrefItem");
}
return pb.Label;
}
}
}