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