private static void SetupThreaded(object threadTaskId)
        {
                        #if DEV_MODE && DEBUG_SETUP_TIME
            var timer = new ExecutionTimeLogger();
            timer.Start("MenuItemAttributeUtility.SetupThreaded");
                        #endif

            foreach (var type in TypeExtensions.GetAllTypesThreadSafe(true, true, true))
            {
                var staticMethods = type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);
                for (int m = staticMethods.Length - 1; m >= 0; m--)
                {
                    var method    = staticMethods[m];
                    var menuItems = method.GetCustomAttributes(typeof(MenuItem), false);
                    foreach (var menuItemAttribute in menuItems)
                    {
                        var menuItem = (MenuItem)menuItemAttribute;
                        var itemPath = menuItem.menuItem;
                        if (itemPath.StartsWith("CONTEXT/", StringComparison.OrdinalIgnoreCase) && !IsBlackListed(itemPath))
                        {
                            int targetNameEnd = itemPath.IndexOf('/', 8);
                            if (targetNameEnd != -1)
                            {
                                var typeName   = itemPath.Substring(8, targetNameEnd - 8);
                                var targetType = TypeExtensions.GetType(typeName, Types.UnityObject);
                                if (targetType != null)
                                {
                                                                        #if DEV_MODE && PI_ASSERTATIONS
                                    UnityEngine.Debug.Assert(Types.UnityObject.IsAssignableFrom(targetType));
                                                                        #endif

                                                                        #if DEV_MODE && DEBUG_GENERATE_CONTEXT_MENU_ITEMS
                                    UnityEngine.Debug.Log("Found context menu item \"" + itemPath + "\" for type " + typeName + " in class " + type.FullName);
                                                                        #endif

                                    var label = itemPath.Substring(targetNameEnd + 1);

                                    AddContextMenuMethodForType(targetType, method, label, menuItem.priority, menuItem.validate);
                                    var extendingTypes = TypeExtensions.GetExtendingUnityObjectTypes(targetType, true);
                                    for (int t = extendingTypes.Length - 1; t >= 0; t--)
                                    {
                                        AddContextMenuMethodForType(extendingTypes[t], method, label, menuItem.priority, menuItem.validate);
                                    }
                                }
                                                                #if DEV_MODE && DEBUG_FAIL_GENERATE_CONTEXT_MENU_ITEMS
                                else
                                {
                                    UnityEngine.Debug.LogWarning("Context menu item \"" + itemPath + "\" in class " + type.FullName + ": UnityObject of type " + typeName + " was not found.");
                                }
                                                                #endif
                            }
                        }
                    }
                }
            }

                        #if DEV_MODE && DEBUG_SETUP_TIME
            timer.FinishAndLogResults();
                        #endif
        }
Esempio n. 2
0
        /// <inheritdoc/>
        public override void Setup(IInspectorDrawer drawer, InspectorPreferences setPreferences, Object[] inspected, Vector2 scrollPos, bool viewIsLocked)
        {
                        #if DEV_MODE && DEBUG_SETUP_TIME
            var timer = new ExecutionTimeLogger();
            timer.Start(GetType().Name + ".Setup");
                        #endif

                        #if DEV_MODE && PI_ASSERTATIONS
            Debug.Assert(setPreferences != null);
                        #endif

            previewDrawer = new PreviewDrawer(this);

            // Call base.Setup before calling Setup for the toolbar, so that the Preferences field gets assigned first
            base.Setup(drawer, setPreferences, inspected, scrollPos, viewIsLocked);

                        #if DEV_MODE && PI_ASSERTATIONS
            Debug.Assert(Preferences != null);
            Debug.Assert(Preferences == setPreferences);
                        #endif

                        #if DEV_MODE && DEBUG_SETUP_TIME
            timer.FinishAndLogResults();
                        #endif
        }
        private static void SetupThreaded(object threadTaskId)
        {
                        #if DEV_MODE
            var timer = new ExecutionTimeLogger();
            timer.Start("DefaultDrawerProviders.SetupThreaded");
                        #endif

            drawerProvidersByInspectorType.Clear();

                        #if DEV_MODE
            timer.StartInterval("FindDrawerProviderForAttributesInTypes");
                        #endif

            FindDrawerProviderForAttributesInTypes(TypeExtensions.GetAllTypesThreadSafe(false, true, true));

                        #if DEV_MODE
            timer.FinishInterval();
            timer.StartInterval("Add derived types");
                        #endif

            // Also add derived types of inspector types
            var addDerived = new List <KeyValuePair <Type, IDrawerProvider> >();
            foreach (var drawerByType in drawerProvidersByInspectorType)
            {
                var exactInspectorType    = drawerByType.Key;
                var derivedInspectorTypes = exactInspectorType.IsInterface ? TypeExtensions.GetImplementingTypes(exactInspectorType, true) : TypeExtensions.GetExtendingTypes(exactInspectorType, true);
                for (int n = derivedInspectorTypes.Length - 1; n >= 0; n--)
                {
                    addDerived.Add(new KeyValuePair <Type, IDrawerProvider>(derivedInspectorTypes[n], drawerByType.Value));
                }
            }

            for (int n = addDerived.Count - 1; n >= 0; n--)
            {
                var add = addDerived[n];
                var derivedInspectorType = add.Key;
                if (!drawerProvidersByInspectorType.ContainsKey(derivedInspectorType))
                {
                    drawerProvidersByInspectorType.Add(derivedInspectorType, add.Value);
                }
            }

                        #if DEV_MODE && PI_ASSERTATIONS
            UnityEngine.Debug.Assert(drawerProvidersByInspectorType[typeof(PowerInspector)] != null);
                        #endif

            selfReady = true;

                        #if DEV_MODE
            timer.FinishInterval();
            timer.FinishAndLogResults();
                        #endif

                        #if CACHE_TO_DISK && (!NET_2_0 && !NET_2_0_SUBSET && !NET_STANDARD_2_0) // HashSet.GetObjectData is not implemented in older versions
            EditorApplication.delayCall += Serialize;
                        #endif
        }
Esempio n. 4
0
        private static void SetupThreaded(object threadTaskId)
        {
                        #if DEV_MODE && DEBUG_SETUP_TIME
            var timer = new ExecutionTimeLogger();
            timer.Start("HeaderToolbarItemAttributeUtility.SetupThreaded");
                        #endif

            foreach (var type in TypeExtensions.GetAllTypesThreadSafe(true, true, true))
            {
                var staticMethods = type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);
                for (int m = staticMethods.Length - 1; m >= 0; m--)
                {
                    var method = staticMethods[m];
                    var toolbarItemAttributes = method.GetCustomAttributes(typeof(HeaderToolbarItemAttribute), false);
                    foreach (var toolbarItemAttribute in toolbarItemAttributes)
                    {
                        var toolbarItem = (HeaderToolbarItemAttribute)toolbarItemAttribute;
                        var targetType  = toolbarItem.targetType;
                        if (targetType == null)
                        {
                                                        #if DEV_MODE && DEBUG_FAIL_GENERATE_ITEMS
                            UnityEngine.Debug.LogWarning("HeaderToolbarItemAttribute on class " + type.FullName + " targetType was null.");
                                                        #endif
                        }

                                                #if DEV_MODE && PI_ASSERTATIONS
                        UnityEngine.Debug.Assert(Types.UnityObject.IsAssignableFrom(targetType));
                                                #endif

                                                #if !NET_STANDARD_2_0 && USE_IL
                        Func <HeaderPartDrawer> getItemDrawer = () => method.DelegateForCall <object, HeaderPartDrawer>().Invoke(null, null);
                                                #else
                        Func <HeaderPartDrawer> getItemDrawer = () => method.Invoke(null, null) as HeaderPartDrawer;
                                                #endif

                        RegisterHeaderToolbarItemForExactType(targetType, getItemDrawer);
                        var extendingTypes = TypeExtensions.GetExtendingUnityObjectTypes(targetType, true);
                        for (int t = extendingTypes.Length - 1; t >= 0; t--)
                        {
                            RegisterHeaderToolbarItemForExactType(extendingTypes[t], getItemDrawer);
                        }
                    }
                }
            }

                        #if DEV_MODE && DEBUG_SETUP_TIME
            timer.FinishAndLogResults();
                        #endif

            IsReady = true;
        }
Esempio n. 5
0
        /// <summary>
        /// Sets up DrawGUI and Default Inspector Preferences
        /// </summary>
        private static void Setup()
        {
                        #if DEV_MODE && DEBUG_SETUP_TIME
            var setupTimer = new ExecutionTimeLogger();
            setupTimer.Start("InspectorPreferencesDrawerProvider.Setup");
                        #endif

            var settings = InspectorPreferences.GetDefaultPreferences();
            settings.Setup();
            DrawGUI.Setup(settings);

                        #if DEV_MODE && DEBUG_SETUP_TIME
            setupTimer.FinishAndLogResults();
                        #endif
        }
Esempio n. 6
0
		public static void AddRange(ref Dictionary<string, PopupMenuItem> itemsByLabel, Dictionary<string, PopupMenuItem> addItems)
		{
			#if DEV_MODE && PI_ASSERTATIONS
			Debug.Assert(itemsByLabel != addItems);
			Debug.Assert(itemsByLabel != null);
			Debug.Assert(addItems != null);
			#endif

			#if DEV_MODE && DEBUG_ADD_RANGE_TIME
			var timer = new ExecutionTimeLogger();
			timer.Start("PopupMenuUtility.AddRange(Dictionary("+itemsByLabel.Count+"), Dictionary("+addItems.Count+")"));
			#endif

			foreach(var add in addItems)
			{
				itemsByLabel[add.Key] = add.Value;
			}

			#if DEV_MODE && DEBUG_ADD_RANGE_TIME
			timer.FinishAndLogResults();
			#endif
		}
        private static void FindDrawerProviderForAttributesInTypes([NotNull] IEnumerable <Type> types)
        {
            foreach (var type in types)
            {
                if (!typeof(IDrawerProvider).IsAssignableFrom(type))
                {
                    continue;
                }

                foreach (var drawerProviderFor in AttributeUtility.GetAttributes <DrawerProviderForAttribute>(type))
                {
                    var inspectorType = drawerProviderFor.inspectorType;
                    if (inspectorType == null)
                    {
                        UnityEngine.Debug.LogError(drawerProviderFor.GetType().Name + " on class " + type.Name + " NullReferenceException - inspectorType was null!");
                        continue;
                    }

                    IDrawerProvider drawerProvider;
                    if (!drawerProvidersByInspectorType.TryGetValue(inspectorType, out drawerProvider) || !drawerProviderFor.isFallback)
                    {
                        bool reusedExistingInstance = false;
                        foreach (var createdDrawerProvider in drawerProvidersByInspectorType.Values)
                        {
                            if (createdDrawerProvider.GetType() == type)
                            {
                                drawerProvidersByInspectorType.Add(inspectorType, createdDrawerProvider);
                                reusedExistingInstance = true;
                                break;
                            }
                        }

                        if (!reusedExistingInstance)
                        {
                                                        #if DEV_MODE && DEBUG_SETUP
                            UnityEngine.Debug.Log("Creating new DrawerProvider instance of type " + type.Name + " for inspector" + inspectorType.Name);
                                                        #endif

                                                        #if DEV_MODE
                            var timer = new ExecutionTimeLogger();
                            timer.Start(type.Name + ".CreateInstance");
                                                        #endif

                            var drawerProviderInstance = (IDrawerProvider)Activator.CreateInstance(type);

                                                        #if DEV_MODE && PI_ASSERTATIONS
                            UnityEngine.Debug.Assert(drawerProviderInstance != null);
                                                        #endif

                            drawerProvidersByInspectorType.Add(inspectorType, drawerProviderInstance);

                                                        #if DEV_MODE && PI_ASSERTATIONS
                            UnityEngine.Debug.Assert(drawerProvidersByInspectorType[inspectorType] != null);
                                                        #endif

                                                        #if DEV_MODE
                            timer.FinishAndLogResults();
                                                        #endif
                        }
                    }
                }
            }
        }
        private static void SetupThreaded(object threadTaskId)
        {
                        #if DEV_MODE
            var timer = new ExecutionTimeLogger();
            timer.Start("DefaultDrawerProviders.SetupThreaded");
                        #endif

            drawerProvidersByInspectorTypeRebuilt = new Dictionary <Type, IDrawerProvider>(2);

                        #if DEV_MODE
            timer.StartInterval("FindDrawerProviderForAttributesInTypes");
                        #endif

            foreach (var type in TypeExtensions.GetAllTypesThreadSafe(false, true, true))
            {
                if (!typeof(IDrawerProvider).IsAssignableFrom(type))
                {
                    continue;
                }

                foreach (var drawerProviderFor in AttributeUtility.GetAttributes <DrawerProviderForAttribute>(type))
                {
                    var inspectorType = drawerProviderFor.inspectorType;
                    if (inspectorType == null)
                    {
                        UnityEngine.Debug.LogError(drawerProviderFor.GetType().Name + " on class " + type.Name + " NullReferenceException - inspectorType was null!");
                        continue;
                    }

                    IDrawerProvider drawerProvider;
                    if (!drawerProvidersByInspectorTypeRebuilt.TryGetValue(inspectorType, out drawerProvider) || !drawerProviderFor.isFallback)
                    {
                        bool reusedExistingInstance = false;
                        foreach (var createdDrawerProvider in drawerProvidersByInspectorTypeRebuilt.Values)
                        {
                            if (createdDrawerProvider.GetType() == type)
                            {
                                drawerProvidersByInspectorTypeRebuilt.Add(inspectorType, createdDrawerProvider);
                                reusedExistingInstance = true;
                                break;
                            }
                        }

                        if (!reusedExistingInstance)
                        {
                                                        #if DEV_MODE && DEBUG_SETUP
                            UnityEngine.Debug.Log("Creating new DrawerProvider instance of type " + type.Name + " for inspector" + inspectorType.Name);
                                                        #endif

                                                        #if DEV_MODE
                            timer.StartInterval(type.Name + ".CreateInstance");
                                                        #endif

                            var drawerProviderInstance = (IDrawerProvider)Activator.CreateInstance(type);

                                                        #if DEV_MODE && PI_ASSERTATIONS
                            UnityEngine.Debug.Assert(drawerProviderInstance != null);
                                                        #endif

                            drawerProvidersByInspectorTypeRebuilt.Add(inspectorType, drawerProviderInstance);

                                                        #if DEV_MODE && PI_ASSERTATIONS
                            UnityEngine.Debug.Assert(drawerProvidersByInspectorTypeRebuilt[inspectorType] != null);
                                                        #endif

                                                        #if DEV_MODE
                            timer.FinishInterval();
                                                        #endif
                        }
                    }
                }
            }

                        #if DEV_MODE
            timer.FinishInterval();
            timer.StartInterval("Add derived types");
                        #endif

            // Also add derived types of inspector types
            var addDerived = new List <KeyValuePair <Type, IDrawerProvider> >();
            foreach (var drawerByType in drawerProvidersByInspectorTypeRebuilt)
            {
                var exactInspectorType    = drawerByType.Key;
                var derivedInspectorTypes = exactInspectorType.IsInterface ? TypeExtensions.GetImplementingTypes(exactInspectorType, true) : TypeExtensions.GetExtendingTypes(exactInspectorType, true);
                for (int n = derivedInspectorTypes.Length - 1; n >= 0; n--)
                {
                    addDerived.Add(new KeyValuePair <Type, IDrawerProvider>(derivedInspectorTypes[n], drawerByType.Value));
                }
            }

            for (int n = addDerived.Count - 1; n >= 0; n--)
            {
                var add = addDerived[n];
                var derivedInspectorType = add.Key;
                if (!drawerProvidersByInspectorTypeRebuilt.ContainsKey(derivedInspectorType))
                {
                    drawerProvidersByInspectorTypeRebuilt.Add(derivedInspectorType, add.Value);
                }
            }

                        #if DEV_MODE && PI_ASSERTATIONS
            UnityEngine.Debug.Assert(drawerProvidersByInspectorTypeRebuilt[typeof(PowerInspector)] != null);
                        #endif

            //selfReady = true;
            threadedFullRebuildFinished = true;

                        #if DEV_MODE
            timer.FinishInterval();
            timer.FinishAndLogResults();
                        #endif

                        #if CACHE_TO_DISK && (!NET_2_0 && !NET_2_0_SUBSET && !NET_STANDARD_2_0) // HashSet.GetObjectData is not implemented in older versions
            EditorApplication.delayCall += Serialize;
                        #endif
        }
Esempio n. 9
0
        private static void SetupThreaded(object threadTaskId)
        {
                        #if DEV_MODE
            var timer = new ExecutionTimeLogger();
            timer.Start("MemberInfoBaseDrawerData.SetupThreaded");
            timer.StartInterval("Generate PopupMenuItems");
                        #endif

            var sb = new System.Text.StringBuilder();
            foreach (var type in TypeExtensions.AllVisibleAndUniqueTypes)
            {
                sb.Append(TypeExtensions.GetPopupMenuLabel(type, ""));
                sb.Append('/');
                string typePrefix = sb.ToString();
                sb.Length = 0;

                var fields = type.GetFields(BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);
                for (int f = fields.Length - 1; f >= 0; f--)
                {
                    var field = fields[f];
                    sb.Append(typePrefix);
                    sb.Append(field.Name);
                    string menuPath = sb.ToString();
                    sb.Length = 0;
                    PopupMenuUtility.BuildPopupMenuItemWithLabel(ref fieldRootItems, ref fieldGroupsByLabel, ref fieldItemsByLabel, field, menuPath, MenuItemValueType.Undefined);
                }

                var properties = type.GetProperties(BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);
                for (int p = properties.Length - 1; p >= 0; p--)
                {
                    var property = properties[p];
                    sb.Append(typePrefix);
                    StringUtils.ToString(property, sb);

                    string menuPath = sb.ToString();
                    sb.Length = 0;
                    PopupMenuUtility.BuildPopupMenuItemWithLabel(ref propertyRootItems, ref propertyGroupsByLabel, ref propertyItemsByLabel, property, menuPath, MenuItemValueType.Undefined);
                }

                var methods = type.GetMethods(BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);

                for (int m = methods.Length - 1; m >= 0; m--)
                {
                    var method = methods[m];

                    sb.Append(typePrefix);
                    StringUtils.ToString(method, sb);
                    string menuPath = sb.ToString();
                    sb.Length = 0;

                    PopupMenuUtility.BuildPopupMenuItemWithLabel(ref methodRootItems, ref methodGroupsByLabel, ref methodItemsByLabel, method, menuPath, MenuItemValueType.Undefined);
                }
            }

                        #if DEV_MODE
            timer.FinishInterval();
            timer.StartInterval("allRootItems.AddRange(fieldRootItems)");
                        #endif

            allRootItems.AddRange(fieldRootItems);

                        #if DEV_MODE
            timer.FinishInterval();
            timer.StartInterval("AddRange(allRootItems, propertyRootItems)");
                        #endif

            PopupMenuUtility.AddRange(ref allRootItems, propertyRootItems);

                        #if DEV_MODE
            timer.FinishInterval();
            timer.StartInterval("AddRange(allRootItems, methodRootItems)");
                        #endif

            PopupMenuUtility.AddRange(ref allRootItems, methodRootItems);

                        #if DEV_MODE
            timer.FinishInterval();
            timer.StartInterval("AddRange(allGroupsByLabel, fieldGroupsByLabel)");
                        #endif

            PopupMenuUtility.AddRange(ref allGroupsByLabel, fieldGroupsByLabel);

                        #if DEV_MODE
            timer.FinishInterval();
            timer.StartInterval("AddRange(allGroupsByLabel, propertyGroupsByLabel)");
                        #endif

            PopupMenuUtility.AddRange(ref allGroupsByLabel, propertyGroupsByLabel);

                        #if DEV_MODE
            timer.FinishInterval();
            timer.StartInterval("AddRange(allGroupsByLabel, methodGroupsByLabel)");
                        #endif

            PopupMenuUtility.AddRange(ref allGroupsByLabel, methodGroupsByLabel);

                        #if DEV_MODE
            timer.FinishInterval();
            timer.StartInterval("AddRange(allItemsByLabel, fieldItemsByLabel)");
                        #endif

            PopupMenuUtility.AddRange(ref allItemsByLabel, fieldItemsByLabel);

                        #if DEV_MODE
            timer.FinishInterval();
            timer.StartInterval("AddRange(allItemsByLabel, propertyItemsByLabel)");
                        #endif

            PopupMenuUtility.AddRange(ref allItemsByLabel, propertyItemsByLabel);

                        #if DEV_MODE
            timer.FinishInterval();
            timer.StartInterval("AddRange(allItemsByLabel, methodItemsByLabel)");
                        #endif

            PopupMenuUtility.AddRange(ref allItemsByLabel, methodItemsByLabel);

                        #if DEV_MODE
            timer.FinishInterval();
            timer.FinishAndLogResults();
                        #endif

            setupDone = SetupPhase.Done;

            lock (threadLock)
            {
                var action = onSetupFinished;
                if (action != null)
                {
                    onSetupFinished = null;
                    action();
                }
            }
        }