| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 | using System;using System.Collections.Generic;using System.Linq;using EnhancedHierarchy.Icons;using UnityEditor;using UnityEngine;namespace EnhancedHierarchy {    public enum IconPosition {        AfterObjectName = 1,        BeforeObjectName = 2,        RightMost = 4,        SafeArea = AfterObjectName | RightMost,        All = SafeArea | BeforeObjectName    }    public abstract class IconBase {        private const float DEFAULT_WIDTH = 16f;        public static None none = new None();        public virtual string Name { get { return GetType().Name; } }        public virtual float Width { get { return DEFAULT_WIDTH; } } // May be called multiple times in the same frame for the same object        public virtual IconPosition Side { get { return IconPosition.SafeArea; } }        public virtual Texture2D PreferencesPreview { get { return null; } }        public virtual string PreferencesTooltip { get { return null; } }        public static IconBase[] AllLeftIcons { get; private set; }        public static IconBase[] AllRightIcons { get; private set; }        public static IconBase[] AllLeftOfNameIcons { get; private set; }        static IconBase() {            var baseType = typeof(IconBase);            icons = baseType.Assembly.GetTypes()                .Where(t => t != baseType && baseType.IsAssignableFrom(t))                .Select(t => (IconBase)Activator.CreateInstance(t))                .ToDictionary(t => t.Name);            AllLeftIcons = icons.Select(i => i.Value).Where(i => (i.Side & IconPosition.AfterObjectName) != 0).ToArray();            AllRightIcons = icons.Select(i => i.Value).Where(i => (i.Side & IconPosition.RightMost) != 0).ToArray();            AllLeftOfNameIcons = icons.Select(i => i.Value).Where(i => (i.Side & IconPosition.BeforeObjectName) != 0).ToArray();        }        public virtual void Init() { } // Guaranteed to be called only once for each obj in every frame before any DoGUI() and get Width calls        public abstract void DoGUI(Rect rect);        private static readonly Dictionary<string, IconBase> icons = new Dictionary<string, IconBase>();        protected static ChildrenChangeMode AskChangeModeIfNecessary(List<GameObject> objs, ChildrenChangeMode reference, string title, string message) {            var controlPressed = Event.current.control || Event.current.command;            switch (reference) {                case ChildrenChangeMode.ObjectOnly:                    return controlPressed ? ChildrenChangeMode.ObjectAndChildren : ChildrenChangeMode.ObjectOnly;                case ChildrenChangeMode.ObjectAndChildren:                    return controlPressed ? ChildrenChangeMode.ObjectOnly : ChildrenChangeMode.ObjectAndChildren;                default:                    for (var i = 0; i < objs.Count; i++)                        if (objs[i] && objs[i].transform.childCount > 0)                            try {                                return (ChildrenChangeMode)EditorUtility.DisplayDialogComplex(title, message, "Yes, change children", "No, this object only", "Cancel");                            } finally {                                //Unity bug, DisplayDialogComplex makes the unity partially lose focus                                if (EditorWindow.focusedWindow)                                    EditorWindow.focusedWindow.Focus();                            }                    return ChildrenChangeMode.ObjectOnly;            }        }        protected static List<GameObject> GetSelectedObjectsAndCurrent() {            if (!Preferences.ChangeAllSelected || Selection.gameObjects.Length < 2)                return EnhancedHierarchy.CurrentGameObject ?                    new List<GameObject> { EnhancedHierarchy.CurrentGameObject } :                    new List<GameObject>();            return Selection.gameObjects                .Where(obj => !EditorUtility.IsPersistent(obj)) // Makes sure the object is part of the scene and not the project                .Union(EnhancedHierarchy.CurrentGameObject ? new [] { EnhancedHierarchy.CurrentGameObject } : new GameObject[0])                .Distinct()                .ToList();        }        public static bool operator ==(IconBase left, IconBase right) {            if (ReferenceEquals(left, right))                return true;            if (ReferenceEquals(left, null))                return false;            if (ReferenceEquals(right, null))                return false;            return left.Name == right.Name;        }        public static bool operator !=(IconBase left, IconBase right) {            return !(left == right);        }        public override string ToString() {            return Name;        }        public override int GetHashCode() {            return Name.GetHashCode();        }        public override bool Equals(object obj) {            return obj as IconBase == this;        }        public static implicit operator IconBase(string name) {            try { return icons[name]; } catch { return none; }        }        public static implicit operator string(IconBase icon) {            return icon.ToString();        }    }}
 |