using UnityEngine; using UnityEditor; using System.Collections; using System.Collections.Generic; using qtools.qhierarchy.phierarchy; namespace qtools.qhierarchy.pdata { public enum QSetting { ShowTreeMapComponent = 0, ShowVisibilityComponent, ShowLockComponent, ShowGameObjectIconComponent, ShowMonoBehaviourIconComponent, ShowTagLayerComponent, ShowErrorComponent, ShowRendererComponent, ShowSeparatorComponent, ShowColorComponent, ShowComponentsComponent, ShowChildrenCountComponent, ShowStaticComponent, ShowPrefabComponent, ShowTagIconComponent, ShowVisibilityComponentDuringPlayMode, ShowLockComponentDuringPlayMode, ShowGameObjectIconComponentDuringPlayMode, ShowMonoBehaviourIconComponentDuringPlayMode, ShowTagLayerComponentDuringPlayMode, ShowErrorComponentDuringPlayMode, ShowRendererComponentDuringPlayMode, ShowColorComponentDuringPlayMode, ShowComponentsComponentDuringPlayMode, ShowChildrenCountComponentDuringPlayMode, ShowStaticComponentDuringPlayMode, ShowTagIconComponentDuringPlayMode, ShowErrorIconParent, ShowErrorIconScriptIsMissing, ShowErrorIconReferenceIsNull, ShowErrorIconStringIsEmpty, ShowErrorIconMissingEventMethod, ShowErrorIconWhenTagOrLayerIsUndefined, IgnoreErrorOfMonoBehaviours, TagAndLayerType, TagAndLayerSizeType, TagAndLayerSizeValuePixel, TagAndLayerAligment, ComponentOrder, Identation, CustomTagIcon, PreventSelectionOfLockedObjects, ShowHiddenQHierarchyObjectList, ShowModifierWarning, ShowErrorForDisabledComponents, IgnoreUnityMonobehaviour, TagAndLayerSizeValueType, TagAndLayerSizeValuePercent, TagAndLayerLabelSize, ShowObjectListContent, ShowRowShading, ShowBreakedPrefabsOnly, HideIconsIfNotFit } public enum QHierarchyTagAndLayerType { Always = 0, OnlyIfNotDefault = 1 } public enum QHierarchyTagAndLayerAligment { Left = 0, Center = 1, Right = 2 } public enum QHierarchyTagAndLayerSizeType { Pixel = 0, Percent = 1 } public enum QHierarchyTagAndLayerLabelSize { Small = 0, Normal = 1, SmallIfNeeded } public enum QHierarchyComponentEnum { LockComponent = 0, VisibilityComponent = 1, StaticComponent = 2, ErrorComponent = 3, RendererComponent = 4, PrefabComponent = 5, TagLayerComponent = 6, ColorComponent = 7, GameObjectIconComponent = 8, TagIconComponent = 9, ChildrenCountComponent = 10, SeparatorComponent = 1000, TreeMapComponent = 1001, MonoBehaviourIconComponent = 1002, ComponentsComponent = 1003 } public class QTagTexture { public string tag; public Texture2D texture; public QTagTexture(string tag, Texture2D texture) { this.tag = tag; this.texture = texture; } } public delegate void QSettingChangedHandler(); public class QSettings { // CONST private const string PREFS_PREFIX = "QTools.QHierarchy_"; public const string DEFAULT_ORDER = "0;1;2;3;4;5;6;7;8;9;10"; public const int DEFAULT_ORDER_COUNT = 11; // PRIVATE private Dictionary settings; // EVENTS private Dictionary settingChangedHandlerList; // SINGLETON private static QSettings instance; public static QSettings getInstance() { if (instance == null) instance = new QSettings(); return instance; } // CONSTRUCTOR private QSettings() { settingChangedHandlerList = new Dictionary(); settings = new Dictionary(); List tagTextureList = new List(); string customTagIcon = (string)getEditorSetting(QSetting.CustomTagIcon, ""); string[] customTagIconArray = customTagIcon.Split(new char[]{';'}); List tags = new List(UnityEditorInternal.InternalEditorUtility.tags); for (int i = 0; i < customTagIconArray.Length - 1; i+=2) { string tag = customTagIconArray[i]; if (!tags.Contains(tag)) continue; string texturePath = customTagIconArray[i+1]; Texture2D texture = (Texture2D)AssetDatabase.LoadAssetAtPath(texturePath, typeof(Texture2D)); if (texture != null) { QTagTexture tagTexture = new QTagTexture(tag, texture); tagTextureList.Add(tagTexture); } } initSetting(QSetting.ShowVisibilityComponent , true); initSetting(QSetting.ShowLockComponent , true); initSetting(QSetting.ShowGameObjectIconComponent , false); initSetting(QSetting.ShowTreeMapComponent , true); initSetting(QSetting.ShowMonoBehaviourIconComponent , true); initSetting(QSetting.ShowTagLayerComponent , true); initSetting(QSetting.ShowErrorComponent , true); initSetting(QSetting.ShowTagIconComponent , false); initSetting(QSetting.ShowStaticComponent , true); initSetting(QSetting.ShowRendererComponent , false); initSetting(QSetting.ShowSeparatorComponent , true); initSetting(QSetting.ShowColorComponent , true); initSetting(QSetting.ShowComponentsComponent , true); initSetting(QSetting.ShowChildrenCountComponent , false); initSetting(QSetting.ShowPrefabComponent , false); initSetting(QSetting.ShowVisibilityComponentDuringPlayMode , true); initSetting(QSetting.ShowLockComponentDuringPlayMode , false); initSetting(QSetting.ShowGameObjectIconComponentDuringPlayMode , true); initSetting(QSetting.ShowMonoBehaviourIconComponentDuringPlayMode, true); initSetting(QSetting.ShowTagLayerComponentDuringPlayMode , true); initSetting(QSetting.ShowErrorComponentDuringPlayMode , false); initSetting(QSetting.ShowRendererComponentDuringPlayMode , false); initSetting(QSetting.ShowColorComponentDuringPlayMode , true); initSetting(QSetting.ShowComponentsComponentDuringPlayMode , false); initSetting(QSetting.ShowChildrenCountComponentDuringPlayMode , true); initSetting(QSetting.ShowStaticComponentDuringPlayMode , false); initSetting(QSetting.ShowTagIconComponentDuringPlayMode , true); initSetting(QSetting.ShowErrorIconParent , true); initSetting(QSetting.ShowErrorIconScriptIsMissing , true); initSetting(QSetting.ShowErrorIconReferenceIsNull , true); initSetting(QSetting.ShowErrorIconStringIsEmpty , true); initSetting(QSetting.ShowErrorIconMissingEventMethod, true); initSetting(QSetting.ShowErrorIconWhenTagOrLayerIsUndefined, true); initSetting(QSetting.IgnoreErrorOfMonoBehaviours , ""); initSetting(QSetting.TagAndLayerType , (int)QHierarchyTagAndLayerType.OnlyIfNotDefault); initSetting(QSetting.TagAndLayerAligment , (int)QHierarchyTagAndLayerAligment.Left); initSetting(QSetting.TagAndLayerSizeValueType , (int)QHierarchyTagAndLayerSizeType.Pixel); initSetting(QSetting.TagAndLayerSizeValuePercent , 0.25f); initSetting(QSetting.TagAndLayerSizeValuePixel , 75); initSetting(QSetting.TagAndLayerLabelSize , (int)QHierarchyTagAndLayerLabelSize.Small); initSetting(QSetting.ComponentOrder , DEFAULT_ORDER); initSetting(QSetting.Identation , 0); initSetting(QSetting.CustomTagIcon , tagTextureList); initSetting(QSetting.PreventSelectionOfLockedObjects, false); initSetting(QSetting.ShowHiddenQHierarchyObjectList , true); initSetting(QSetting.ShowModifierWarning , true); initSetting(QSetting.ShowErrorForDisabledComponents , true); initSetting(QSetting.IgnoreUnityMonobehaviour , true); initSetting(QSetting.ShowObjectListContent , false); initSetting(QSetting.ShowRowShading , true); initSetting(QSetting.ShowBreakedPrefabsOnly , false); initSetting(QSetting.HideIconsIfNotFit , false); } // DESTRUCTOR public void OnDestroy() { settings = null; settingChangedHandlerList = null; instance = null; } // PUBLIC public T get(QSetting setting) { return (T)settings[(int)setting]; } public void set(QSetting setting, T value) { int settingId = (int)setting; settings[settingId] = value; setEditorSetting(setting, value); if (settingChangedHandlerList.ContainsKey(settingId) && settingChangedHandlerList[settingId] != null) settingChangedHandlerList[settingId].Invoke(); EditorApplication.RepaintHierarchyWindow(); } public void set(QSetting setting, List tagTextureList) { string result = ""; for (int i = 0; i < tagTextureList.Count; i++) result += tagTextureList[i].tag + ";" + AssetDatabase.GetAssetPath(tagTextureList[i].texture.GetInstanceID()) + ";"; setEditorSetting(setting, result); settings[(int)setting] = tagTextureList; } public void addEventListener(QSetting setting, QSettingChangedHandler handler) { int settingId = (int)setting; if (!settingChangedHandlerList.ContainsKey(settingId)) settingChangedHandlerList.Add(settingId, null); if (settingChangedHandlerList[settingId] == null) settingChangedHandlerList[settingId] = handler; else settingChangedHandlerList[settingId] += handler; } public void removeEventListener(QSetting setting, QSettingChangedHandler handler) { int settingId = (int)setting; if (settingChangedHandlerList.ContainsKey(settingId) && settingChangedHandlerList[settingId] != null) settingChangedHandlerList[settingId] -= handler; } // PRIVATE private void initSetting(QSetting setting, object defaultValue) { object value = getEditorSetting(setting, defaultValue); if (value != defaultValue && value.GetType() == defaultValue.GetType()) { settings[(int)setting] = value; } else { set(setting, defaultValue); } } private object getEditorSetting(QSetting setting, object defaultValue) { if (defaultValue is bool) { return EditorPrefs.GetBool(PREFS_PREFIX + setting.ToString("G"), (bool)defaultValue); } else if (defaultValue is int) { return EditorPrefs.GetInt(PREFS_PREFIX + setting.ToString("G"), (int)defaultValue); } else if (defaultValue is float) { return EditorPrefs.GetFloat(PREFS_PREFIX + setting.ToString("G"), (float)defaultValue); } else if (defaultValue is string) { return EditorPrefs.GetString(PREFS_PREFIX + setting.ToString("G"), (string)defaultValue); } else { return defaultValue; } } private void setEditorSetting(QSetting setting, object value) { if (value is bool) { EditorPrefs.SetBool(PREFS_PREFIX + setting.ToString("G"), (bool)value); } else if (value is int) { EditorPrefs.SetInt(PREFS_PREFIX + setting.ToString("G"), (int)value); } else if (value is float) { EditorPrefs.SetFloat(PREFS_PREFIX + setting.ToString("G"), (float)value); } else if (value is string) { EditorPrefs.SetString(PREFS_PREFIX + setting.ToString("G"), (string)value); } } } }