private void AddNewItem()
        {
            List <Type> collectableSubclasses = TypeUtility.GetAllSubclasses(collection.GetCollectionType(), true);

            if (collectableSubclasses.Count == 0)
            {
                EditorApplication.delayCall += () => { AddNewItemOfType(collection.GetCollectionType()); };
            }
            else
            {
                GenericMenu optionsMenu = new GenericMenu();
                AddMenuOption(optionsMenu, collection.GetCollectionType().Name, () =>
                {
                    EditorApplication.delayCall += () => { AddNewItemOfType(collection.GetCollectionType()); };
                });

                for (int i = 0; i < collectableSubclasses.Count; i++)
                {
                    Type collectableSubClass = collectableSubclasses[i];
                    AddMenuOption(optionsMenu, collectableSubClass.Name, () =>
                    {
                        EditorApplication.delayCall += () => { AddNewItemOfType(collectableSubClass); };
                    });
                }
                optionsMenu.ShowAsContext();
            }
        }
        public static void GenerateStaticCollectionScript(ScriptableObjectCollection collection)
        {
            string fileName = $"{collection.GetCollectionType().Name}Static";
            bool   isGeneratingCustomStaticFile = ScriptableObjectCollectionSettings.Instance.IsGeneratingCustomStaticFile(collection);

            if (isGeneratingCustomStaticFile)
            {
                fileName = ScriptableObjectCollectionSettings.Instance.GetGeneratedStaticFileName(collection);
            }

            string nameSpace   = collection.GetCollectionType().Namespace;
            string finalFolder = ScriptableObjectCollectionSettings.Instance.GetStaticFileFolderForCollection(collection);

            if (string.IsNullOrEmpty(finalFolder))
            {
                Debug.LogError("Static Code Generation folder not assigned, please assign it on the ScriptableObjectCollectionSettings");
                EditorGUIUtility.PingObject(ScriptableObjectCollectionSettings.Instance);
                Selection.objects = new Object[] { ScriptableObjectCollectionSettings.Instance };
                return;
            }

            AssetDatabaseUtils.CreatePathIfDontExist(finalFolder);
            using (StreamWriter writer = new StreamWriter(Path.Combine(finalFolder, $"{fileName}.cs")))
            {
                int indentation = 0;

                List <string> directives = new List <string>();
                directives.Add(typeof(CollectionsRegistry).Namespace);
                directives.Add(collection.GetType().Namespace);
                directives.AddRange(GetCollectionDirectives(collection));

                if (!isGeneratingCustomStaticFile)
                {
                    AppendHeader(writer, ref indentation, nameSpace, "",
                                 collection.GetCollectionType().Name, true, false, directives.Distinct().ToArray());
                }
                else
                {
                    AppendHeader(writer, ref indentation, nameSpace, "",
                                 fileName, false, false, directives.Distinct().ToArray());
                }

                GeneratedStaticFileType staticFileTypeForCollection = ScriptableObjectCollectionSettings.Instance.GetStaticFileTypeForCollection(collection);
                if (staticFileTypeForCollection == GeneratedStaticFileType.DirectAccess)
                {
                    WriteDirectAccessCollectionStatic(collection, writer, ref indentation);
                }
                else
                {
                    WriteTryGetAccessCollectionStatic(collection, writer, ref indentation);
                }

                indentation--;
                AppendFooter(writer, ref indentation, nameSpace);
            }

            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
        }
        public string GetGeneratedStaticFileName(ScriptableObjectCollection collection)
        {
            if (!TryGetSettingsForCollection(collection, out CollectionToSettings settings))
            {
                return(collection.GetCollectionType().Name);
            }

            if (string.IsNullOrEmpty(settings.customStaticFileName))
            {
                return(collection.GetCollectionType().Name);
            }

            return(settings.customStaticFileName);
        }
        public bool TryGetCollectionFromCollectableType(Type targetType,
                                                        out ScriptableObjectCollection scriptableObjectCollection)
        {
            for (int i = 0; i < collections.Count; i++)
            {
                ScriptableObjectCollection collection = collections[i];
                if (collection.GetCollectionType() == targetType ||
                    targetType.BaseType == collection.GetCollectionType())
                {
                    scriptableObjectCollection = collection;
                    return(true);
                }
            }

            scriptableObjectCollection = null;
            return(false);
        }
Beispiel #5
0
        protected override AdvancedDropdownItem BuildRoot()
        {
            Type collectableType      = collection.GetCollectionType();
            AdvancedDropdownItem root = new AdvancedDropdownItem(collectableType.Name);

            root.AddChild(new AdvancedDropdownItem("None"));
            for (int i = 0; i < collection.Count; i++)
            {
                CollectableScriptableObject collectionItem = collection[i];
                if (collectionItem.GetType() == collectableType)
                {
                    root.AddChild(new CollectableDropdownItem(collectionItem));
                }
                else
                {
                    AdvancedDropdownItem parent = GetOrCreateDropdownItemForType(root, collectionItem);
                    parent.AddChild(new CollectableDropdownItem(collectionItem));
                }
            }
            return(root);
        }