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();
- }
- }
- }
|