Exemplo n.º 1
0
    private void createButtonReorderableList()
    {
        buttonEditor = Editor.CreateEditor(Database.Instance);

        // Get specialized classes
        listSpecializedClass = new ReorderableList(buttonEditor.serializedObject,
                                                   buttonEditor.serializedObject.FindProperty("specializedClasses"),
                                                   true, false, true, true);

        // Draw specialized class
        listSpecializedClass.drawElementCallback =
            (Rect rect, int index, bool isActive, bool isFocused) => {
            var element          = listSpecializedClass.serializedProperty.GetArrayElementAtIndex(index);
            var specializedClass = element.objectReferenceValue as SpecializedClass;
            rect.y += 2;
            EditorGUI.LabelField(rect, specializedClass.name);
        };

        // On select specialized class
        listSpecializedClass.onSelectCallback = (ReorderableList l) => {
            var specializedClass = l.serializedProperty.GetArrayElementAtIndex(l.index).objectReferenceValue as SpecializedClass;
            editor = Editor.CreateEditor(specializedClass);
        };

        // On new specialized class
        listSpecializedClass.onAddDropdownCallback = (Rect buttonRect, ReorderableList l) => {
            SpecializedClass specializedClass = (SpecializedClass)ScriptableObject.CreateInstance(typeof(SpecializedClass));
            specializedClass.Init();

            var specializedClassesPath = "Assets/TRPGMaker/Database/SpecializedClasses";
            var _exists = AssetDatabase.LoadAssetAtPath(specializedClassesPath + "/NewSpecializedClass.asset", typeof(SpecializedClass));
            if (_exists == null)
            {
                //Create the folder if doesn't exist
                if (!System.IO.Directory.Exists(specializedClassesPath))
                {
                    System.IO.Directory.CreateDirectory(specializedClassesPath);
                }
                specializedClass.name = "New Specialized Class";
                AssetDatabase.CreateAsset(specializedClass, specializedClassesPath + "/NewSpecializedClass.asset");
            }
            else
            {
                string[] existAssets = AssetDatabase.FindAssets("NewSpecializedClass");
                bool     seted       = false;
                int      i           = 0;
                while (i <= existAssets.Length && !seted)
                {
                    var _existsNumber = AssetDatabase.LoadAssetAtPath(specializedClassesPath + "/NewSpecializedClass(" + (i + 1) + ").asset", typeof(SpecializedClass));
                    if (_existsNumber == null)
                    {
                        specializedClass.name = "New Specialized Class (" + (i + 1) + ")";
                        AssetDatabase.CreateAsset(specializedClass, specializedClassesPath + "/NewSpecializedClass(" + (i + 1) + ").asset");
                        seted = true;
                    }
                    i++;
                }
            }

            editor = Editor.CreateEditor(specializedClass);
            Database.Instance.specializedClasses.Add(specializedClass);
            listSpecializedClass.index = Database.Instance.specializedClasses.Count - 1;
            DrawButton();
        };

        // On remove specialized class
        listSpecializedClass.onRemoveCallback = (ReorderableList l) => {
            var specializedClass = l.serializedProperty.GetArrayElementAtIndex(l.index).objectReferenceValue as SpecializedClass;
            removeSpecializedClass(specializedClass);
            editor = null;
            DrawMainView();
            DrawButton();
        };

        // No header
        listSpecializedClass.headerHeight = 0;
    }