/// <summary> /// Initializes all assigned drawers using provided settings reference. /// </summary> /// <param name="settings"></param> internal static void InitializeDrawers(IToolboxDrawersSettings settings) { ToolboxDrawerUtility.settings = settings; CreateAttributeDrawers(settings); CreateTargetTypeDrawers(settings); }
/// <summary> /// Initializes all assigned drawers using provided settings reference. /// </summary> /// <param name="settings"></param> internal static void PerformData(IToolboxDrawersSettings settings) { ToolboxDrawerUtility.settings = settings; CreateAttributeDrawers(settings); CreateTargetTypeDrawers(settings); ToolboxDrawersAllowed = settings.UseToolboxDrawers; }
/// <summary> /// Creates all possible type-based drawers and add them ro proper collection. /// </summary> /// <param name="settings"></param> private static void CreateTargetTypeDrawers(IToolboxDrawersSettings settings) { targetTypeDrawers.Clear(); for (var i = 0; i < settings.TargetTypeDrawersCount; i++) { var drawerType = settings.GetTargetTypeDrawerTypeAt(i); if (drawerType == null) { continue; } var drawerInstance = Activator.CreateInstance(drawerType) as ToolboxTargetTypeDrawer; var targetTypes = drawerInstance.GetTargetType().GetAllChildClasses(); foreach (var type in targetTypes) { targetTypeDrawers[type] = drawerInstance; } } }
/// <summary> /// Creates all possible attribute-based drawers and add them to proper collections. /// </summary> /// <param name="settings"></param> private static void CreateAttributeDrawers(IToolboxDrawersSettings settings) { void AddAttributeDrawer <T>(Type drawerType, Type targetAttributeType, Dictionary <Type, T> drawersCollection) where T : ToolboxAttributeDrawer { if (drawerType == null) { return; } var drawerInstance = Activator.CreateInstance(drawerType) as T; if (drawersCollection.ContainsKey(targetAttributeType)) { Debug.LogWarning(targetAttributeType + " is already associated to more than one ToolboxDrawer."); return; } drawersCollection.Add(targetAttributeType, drawerInstance); } Type GetAttributeTargetType(Type drawerType, Type drawerBaseType) { if (drawerType == null) { Debug.LogWarning("One of assigned drawer types in " + nameof(ToolboxEditorSettings) + " is empty."); return(null); } while (!drawerType.IsGenericType || drawerType.GetGenericTypeDefinition() != drawerBaseType) { if (drawerType.BaseType == null) { return(null); } drawerType = drawerType.BaseType; } return(drawerType.IsGenericType ? drawerType.GetGenericArguments().FirstOrDefault() : null); } decoratorDrawers.Clear(); for (var i = 0; i < settings.DecoratorDrawersCount; i++) { var drawerType = settings.GetDecoratorDrawerTypeAt(i); var targetType = GetAttributeTargetType(settings.GetDecoratorDrawerTypeAt(i), decoratorDrawerBase); AddAttributeDrawer(drawerType, targetType, decoratorDrawers); } propertyDrawers.Clear(); for (var i = 0; i < settings.PropertyDrawersCount; i++) { var drawerType = settings.GetPropertyDrawerTypeAt(i); var targetType = GetAttributeTargetType(settings.GetPropertyDrawerTypeAt(i), propertyDrawerBase); AddAttributeDrawer(drawerType, targetType, propertyDrawers); } collectionDrawers.Clear(); for (var i = 0; i < settings.CollectionDrawersCount; i++) { var drawerType = settings.GetCollectionDrawerTypeAt(i); var targetType = GetAttributeTargetType(settings.GetCollectionDrawerTypeAt(i), collectionDrawerBase); AddAttributeDrawer(drawerType, targetType, collectionDrawers); } conditionDrawers.Clear(); for (var i = 0; i < settings.ConditionDrawersCount; i++) { var drawerType = settings.GetConditionDrawerTypeAt(i); var targetType = GetAttributeTargetType(settings.GetConditionDrawerTypeAt(i), conditionDrawerBase); AddAttributeDrawer(drawerType, targetType, conditionDrawers); } }