123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- using System;
- using System.Collections.Generic;
- using System.Reflection;
- using UnityEngine;
-
- namespace UnityEditor.Tilemaps
- {
- /// <summary>
- /// Use this attribute to add an option to customize the sorting of Active Targets in the Active Tilemap list of the Tile Palette window.
- /// </summary>
- /// <remarks>
- /// Append this attribute to a class which inherits from IComparer<GameObject> or to a method which creates an IComparer<GameObject>. The instance of IComparer generated with the attribute is used for comparing and sorting Active Target GameObjects in the Active Tilemaps list.
- /// </remarks>
- /// <example>
- /// <code lang="cs"><![CDATA[
- /// using System;
- /// using System.Collections.Generic;
- /// using UnityEngine;
- /// using UnityEditor;
- ///
- /// [GridPaintSorting]
- /// class Alphabetical : IComparer<GameObject>
- /// {
- /// public int Compare(GameObject go1, GameObject go2)
- /// {
- /// return String.Compare(go1.name, go2.name);
- /// }
- /// }
- ///
- /// class ReverseAlphabeticalComparer : IComparer<GameObject>
- /// {
- /// public int Compare(GameObject go1, GameObject go2)
- /// {
- /// return -String.Compare(go1.name, go2.name);
- /// }
- ///
- /// [GridPaintSorting]
- /// public static IComparer<GameObject> ReverseAlphabetical()
- /// {
- /// return new ReverseAlphabeticalComparer();
- /// }
- /// }
- /// ]]></code>
- /// </example>
- [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
- public class GridPaintSortingAttribute : Attribute
- {
- private static List<MethodInfo> m_SortingMethods;
- private static List<Type> m_SortingTypes;
-
- internal static List<MethodInfo> sortingMethods
- {
- get
- {
- if (m_SortingMethods == null)
- GetUserSortingComparers();
- return m_SortingMethods;
- }
- }
-
- internal static List<Type> sortingTypes
- {
- get
- {
- if (m_SortingTypes == null)
- GetUserSortingComparers();
- return m_SortingTypes;
- }
- }
-
- private static void GetUserSortingComparers()
- {
- m_SortingMethods = new List<MethodInfo>();
- foreach (var sortingMethod in TypeCache.GetMethodsWithAttribute<GridPaintSortingAttribute>())
- {
- if (!sortingMethod.ReturnType.IsAssignableFrom(typeof(IComparer<GameObject>)))
- continue;
- if (sortingMethod.GetGenericArguments().Length > 0)
- continue;
- m_SortingMethods.Add(sortingMethod);
- }
-
- m_SortingTypes = new List<Type>();
- foreach (var sortingType in TypeCache.GetTypesWithAttribute<GridPaintSortingAttribute>())
- {
- if (sortingType.IsAbstract)
- continue;
- m_SortingTypes.Add(sortingType);
- }
- }
-
- [GridPaintSorting]
- internal class Alphabetical : IComparer<GameObject>
- {
- public int Compare(GameObject go1, GameObject go2)
- {
- return String.Compare(go1.name, go2.name);
- }
- }
-
- [GridPaintSorting]
- internal class ReverseAlphabetical : IComparer<GameObject>
- {
- public int Compare(GameObject go1, GameObject go2)
- {
- return -String.Compare(go1.name, go2.name);
- }
- }
- }
- }
|