| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 | using System;using UnityEditor;using UnityEngine;namespace EnhancedHierarchy {    /// <summary>    /// Generic preference item interface.    /// </summary>    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);    }    /// <summary>    /// Generic preference item.    /// </summary>    [Serializable]    public sealed class PrefItem<T> : 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<Wrapper>(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<Wrapper>(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<T> 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<T> pb) {            if (pb == null) {                Debug.LogError("Cannot get the content of a null PrefItem");                return new GUIContent("Null PrefItem");            }            return pb.Label;        }    }}
 |