Exemplo n.º 1
0
    public void DrawMainView()
    {
        var customStyle = new GUIStyle();

        customStyle.alignment = TextAnchor.UpperCenter;
        customStyle.fontSize  = 17;
        GUI.Label(new Rect(EditorGUILayout.GetControlRect().x, EditorGUILayout.GetControlRect().y, EditorGUILayout.GetControlRect().width, 30), "List of specialized classes:", customStyle);

        // Create color for each line
        GUIStyle gsLinePair = new GUIStyle();

        gsLinePair.normal.background = MakeTextureColor.MakeTexture(600, 1, new Color(0.5f, 0.5f, 0.5f, 0.5f));
        GUIStyle gsLineOdd = new GUIStyle();

        gsLineOdd.normal.background = MakeTextureColor.MakeTexture(600, 1, new Color(0.5f, 0.5f, 0.5f, 0.0f));

        EditorGUILayout.BeginVertical();
        scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);

        for (int i = 0; i < Database.Instance.specializedClasses.Count; i++)
        {
            SpecializedClass specializedClass = Database.Instance.specializedClasses[i];

            // Changing line color
            if (i % 2 == 0)
            {
                GUILayout.BeginHorizontal(gsLinePair);
            }
            else
            {
                GUILayout.BeginHorizontal(gsLineOdd);
            }
            Rect rect = EditorGUILayout.GetControlRect();
            GUI.Label(rect, specializedClass.name);
            if (Event.current.type == EventType.MouseUp && rect.Contains(Event.current.mousePosition))
            {
                editor = Editor.CreateEditor(specializedClass);
                listSpecializedClass.index = Database.Instance.specializedClasses.IndexOf(specializedClass);
            }
            if (GUILayout.Button(new GUIContent("Edit"), GUILayout.Width(50)))
            {
                editor = Editor.CreateEditor(specializedClass);
                listSpecializedClass.index = Database.Instance.specializedClasses.IndexOf(specializedClass);
            }
            else if (GUILayout.Button(new GUIContent("Remove"), GUILayout.Width(90)))
            {
                removeSpecializedClass(specializedClass);
            }
            GUILayout.EndHorizontal();
        }

        EditorGUILayout.EndScrollView();
        EditorGUILayout.EndVertical();
    }
Exemplo n.º 2
0
    private void reloadAttributes()
    {
        specializedClass = (SpecializedClass)target;
        specializedClass.refreshAttributes();
        attributes = specializedClass.attributes;

        // String array of class atributes
        attributesStringArray = new string[0];
        attributesStringArray = attributes.Select(I => I.attribute.name).ToArray();

        foldout = Enumerable.Repeat(false, attributes.Count).ToList();
    }
Exemplo n.º 3
0
    public override void OnInspectorGUI()
    {
        // Create color for each line
        GUIStyle gsLinePair = new GUIStyle();

        gsLinePair.normal.background = MakeTextureColor.MakeTexture(600, 1, new Color(0.5f, 0.5f, 0.5f, 0.5f));
        GUIStyle gsLineOdd = new GUIStyle();

        gsLineOdd.normal.background = MakeTextureColor.MakeTexture(600, 1, new Color(0.5f, 0.5f, 0.5f, 0.0f));


        // Atributes
        GUILayout.BeginVertical("Box");
        var titleStyle = new GUIStyle();

        titleStyle.alignment = TextAnchor.UpperCenter;
        titleStyle.fontSize  = 15;
        titleStyle.fontStyle = FontStyle.Bold;
        GUI.Label(new Rect(EditorGUILayout.GetControlRect().x, EditorGUILayout.GetControlRect().y, EditorGUILayout.GetControlRect().width, 30), "Attributes:", titleStyle);
        for (int i = 0; i < Database.Instance.attributes.Count; i++)
        {
            Attribute attribute = Database.Instance.attributes[i];
            // Changing line color
            if (i % 2 == 0)
            {
                GUILayout.BeginHorizontal(gsLinePair);
            }
            else
            {
                GUILayout.BeginHorizontal(gsLineOdd);
            }
            Rect rect = EditorGUILayout.GetControlRect();
            GUI.Label(rect, attribute.name);
            GUILayout.EndHorizontal();
        }
        GUILayout.EndVertical();

        // Tags
        GUILayout.BeginVertical("Box");
        GUI.Label(new Rect(EditorGUILayout.GetControlRect().x, EditorGUILayout.GetControlRect().y, EditorGUILayout.GetControlRect().width, 30), "Tags:", titleStyle);
        for (int i = 0; i < Database.Instance.tags.Count; i++)
        {
            string tag = Database.Instance.tags[i].tagName;
            // Changing line color
            if (i % 2 == 0)
            {
                GUILayout.BeginHorizontal(gsLinePair);
            }
            else
            {
                GUILayout.BeginHorizontal(gsLineOdd);
            }
            Rect rect = EditorGUILayout.GetControlRect();
            GUI.Label(rect, tag);
            GUILayout.EndHorizontal();
        }
        GUILayout.EndVertical();

        // Slot types
        GUILayout.BeginVertical("Box");
        GUI.Label(new Rect(EditorGUILayout.GetControlRect().x, EditorGUILayout.GetControlRect().y, EditorGUILayout.GetControlRect().width, 30), "Slot types:", titleStyle);
        for (int i = 0; i < Database.Instance.slotTypes.Count; i++)
        {
            SlotType slotType = Database.Instance.slotTypes[i];
            // Changing line color
            if (i % 2 == 0)
            {
                GUILayout.BeginHorizontal(gsLinePair);
            }
            else
            {
                GUILayout.BeginHorizontal(gsLineOdd);
            }
            Rect rect = EditorGUILayout.GetControlRect();
            GUI.Label(rect, slotType.slotName);
            GUILayout.EndHorizontal();
        }
        GUILayout.EndVertical();

        // Items
        GUILayout.BeginVertical("Box");
        GUI.Label(new Rect(EditorGUILayout.GetControlRect().x, EditorGUILayout.GetControlRect().y, EditorGUILayout.GetControlRect().width, 30), "Items:", titleStyle);
        for (int i = 0; i < Database.Instance.items.Count; i++)
        {
            Modifier item = Database.Instance.items[i];
            // Changing line color
            if (i % 2 == 0)
            {
                GUILayout.BeginHorizontal(gsLinePair);
            }
            else
            {
                GUILayout.BeginHorizontal(gsLineOdd);
            }
            Rect rect = EditorGUILayout.GetControlRect();
            GUI.Label(rect, item.name);
            GUILayout.EndHorizontal();
        }
        GUILayout.EndVertical();

        // Specialized classes
        GUILayout.BeginVertical("Box");
        GUI.Label(new Rect(EditorGUILayout.GetControlRect().x, EditorGUILayout.GetControlRect().y, EditorGUILayout.GetControlRect().width, 30), "Specialized classes:", titleStyle);
        for (int i = 0; i < Database.Instance.specializedClasses.Count; i++)
        {
            SpecializedClass specializedClass = Database.Instance.specializedClasses[i];
            // Changing line color
            if (i % 2 == 0)
            {
                GUILayout.BeginHorizontal(gsLinePair);
            }
            else
            {
                GUILayout.BeginHorizontal(gsLineOdd);
            }
            Rect rect = EditorGUILayout.GetControlRect();
            GUI.Label(rect, specializedClass.name);
            GUILayout.EndHorizontal();
        }
        GUILayout.EndVertical();

        // Characters
        GUILayout.BeginVertical("Box");
        GUI.Label(new Rect(EditorGUILayout.GetControlRect().x, EditorGUILayout.GetControlRect().y, EditorGUILayout.GetControlRect().width, 30), "Characters:", titleStyle);
        for (int i = 0; i < Database.Instance.characters.Count; i++)
        {
            Character character = Database.Instance.characters[i];
            // Changing line color
            if (i % 2 == 0)
            {
                GUILayout.BeginHorizontal(gsLinePair);
            }
            else
            {
                GUILayout.BeginHorizontal(gsLineOdd);
            }
            Rect rect = EditorGUILayout.GetControlRect();
            GUI.Label(rect, character.name);
            GUILayout.EndHorizontal();
        }
        GUILayout.EndVertical();

        // Teams
        GUILayout.BeginVertical("Box");
        GUI.Label(new Rect(EditorGUILayout.GetControlRect().x, EditorGUILayout.GetControlRect().y, EditorGUILayout.GetControlRect().width, 30), "Teams:", titleStyle);
        for (int i = 0; i < Database.Instance.teams.Count; i++)
        {
            Team team = Database.Instance.teams[i];
            // Changing line color
            if (i % 2 == 0)
            {
                GUILayout.BeginHorizontal(gsLinePair);
            }
            else
            {
                GUILayout.BeginHorizontal(gsLineOdd);
            }
            Rect rect = EditorGUILayout.GetControlRect();
            GUI.Label(rect, team.name);
            GUILayout.EndHorizontal();
        }
        GUILayout.EndVertical();
    }
Exemplo n.º 4
0
 private void removeSpecializedClass(SpecializedClass specializedClass)
 {
     Database.Instance.specializedClasses.Remove(specializedClass);
     AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(specializedClass));
 }
Exemplo n.º 5
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;
    }
Exemplo n.º 6
0
    private void OnEnable()
    {
        // Remove button
        removeTexture = (Texture2D)Resources.Load("Buttons/remove", typeof(Texture2D));
        reloadAttributes();

        // Get Slots
        listSlots = new ReorderableList(serializedObject,
                                        serializedObject.FindProperty("Slots"),
                                        true, true, true, true);

        // Get slots defined in specialized classes
        listSlotsSpecializedClasses = new ReorderableList(serializedObject,
                                                          serializedObject.FindProperty("specializedClasses"),
                                                          false, true, false, false);

        // Get Attributes
        listAttributes = new ReorderableList(serializedObject,
                                             serializedObject.FindProperty("attributes"),
                                             false, true, true, true);

        // Get Attributes Formulas
        listAttributesFormulas = new ReorderableList(serializedObject,
                                                     serializedObject.FindProperty("attributesWithFormulas"),
                                                     false, true, false, false);

        //Get List SpecializedClass
        listSpecializedClass = new ReorderableList(serializedObject,
                                                   serializedObject.FindProperty("specializedClasses"),
                                                   true, true, true, true);

        // Draw Slots
        listSlots.drawElementCallback =
            (Rect rect, int index, bool isActive, bool isFocused) => {
            rect.y += 2;

            slotTypeSelected = character.Slots.IndexOf(character.Slots[index]);
            slotItemSelected = Database.Instance.items.IndexOf(character.Slots[index].modifier);

            EditorGUI.BeginChangeCheck();
            EditorGUI.LabelField(new Rect(rect.x, rect.y, 60, EditorGUIUtility.singleLineHeight), "Slot type:");
            slotTypeSelected = EditorGUI.Popup(new Rect(rect.x + 63, rect.y, 100, EditorGUIUtility.singleLineHeight), slotTypeSelected, Database.Instance.slotTypes.Select(x => x.slotName).ToArray());
            EditorGUI.LabelField(new Rect(rect.x + 170, rect.y, 35, EditorGUIUtility.singleLineHeight), "Item:");
            slotItemSelected = EditorGUI.Popup(new Rect(rect.x + 208, rect.y, rect.width - 238, EditorGUIUtility.singleLineHeight), slotItemSelected, Database.Instance.items.Select(s => (string)s.name).ToArray());
            if (EditorGUI.EndChangeCheck())
            {
                if (slotTypeSelected != 0)
                {
                    character.Slots[index].slotType = Database.Instance.slotTypes[slotTypeSelected];
                }
                if (slotItemSelected != -1)
                {
                    character.Slots[index].modifier = Database.Instance.items[slotItemSelected];
                }
            }

            if (GUI.Button(new Rect(rect.width, rect.y, 16, 16), new GUIContent("", removeTexture), removeStyle))
            {
                character.Slots.RemoveAt(index);
            }
        };

        // Draw Slots defined in specialized classes
        listSlotsSpecializedClasses.drawElementCallback =
            (Rect rect, int index, bool isActive, bool isFocused) => {
            rect.y += 2;

            var element = listSlotsSpecializedClasses.serializedProperty.GetArrayElementAtIndex(index);
            SpecializedClass specializedClass = (SpecializedClass)element.objectReferenceValue;

            int i = 0;
            foreach (Slot slot in specializedClass.slots)
            {
                if (slot.slotType != null && slot.modifier != null)
                {
                    EditorGUI.LabelField(new Rect(rect.x, rect.y + (EditorGUIUtility.singleLineHeight * i), rect.width, EditorGUIUtility.singleLineHeight), slot.slotType + " - " + slot.modifier.name);
                    //listSlotsSpecializedClasses.elementHeight += EditorGUIUtility.singleLineHeight;
                    i++;
                }
            }
        };

        // Set height of Slots defined in specialized classes
        listSlotsSpecializedClasses.elementHeightCallback = (index) =>
        {
            var element = listSlotsSpecializedClasses.serializedProperty.GetArrayElementAtIndex(index);
            SpecializedClass specializedClass = (SpecializedClass)element.objectReferenceValue;

            int i = 0;
            foreach (Slot slot in specializedClass.slots)
            {
                if (slot.slotType != null && slot.modifier != null)
                {
                    i++;
                }
            }
            return(EditorGUIUtility.singleLineHeight * i);
        };

        //Draw specialzed classes
        listSpecializedClass.drawElementCallback =
            (Rect rect, int index, bool isActive, bool isFocused) => {
            rect.y += 2;
            if (character.specializedClasses[index] != null)
            {
                EditorGUI.LabelField(
                    new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight),
                    character.specializedClasses[index].name);
            }


            if (GUI.Button(new Rect(rect.width, rect.y, 16, 16), new GUIContent("", removeTexture), removeStyle))
            {
                character.specializedClasses.RemoveAt(index);
            }
        };

        // Draw attributes
        listAttributes.drawElementCallback =
            (Rect rectL, int index, bool isActive, bool isFocused) => {
            var element = listAttributes.serializedProperty.GetArrayElementAtIndex(index);
            // For update problem
            if (index < character.attributes.Count)
            {
                var textDimensions = GUI.skin.label.CalcSize(new GUIContent(character.attributes[index].attribute.name));

                rectL.y += 2;

                foldout[index] = EditorGUI.Foldout(new Rect(rectL.x, rectL.y, textDimensions.x + 5, rectL.height), foldout[index], character.attributes[index].attribute.name);
                if (!character.attributes[index].attribute.isCore && !character.specializedClasses.Any(x => x.attributes.Find(y => y.attribute.id == character.attributes[index].attribute.id) != null) && GUI.Button(new Rect(rectL.width - 14, rectL.y, 16, 16), new GUIContent("", removeTexture), removeStyle))
                {
                    character.attributes.RemoveAt(index);
                }
                if (foldout[index])
                {
                    rectL.height = EditorGUIUtility.singleLineHeight;
                    rectL.x     += 15;
                    rectL.y     += EditorGUIUtility.singleLineHeight;
                    EditorGUI.BeginChangeCheck();
                    GUI.SetNextControlName("Value");
                    EditorGUI.PropertyField(new Rect(rectL.x, rectL.y, rectL.width - 15, rectL.height), element.FindPropertyRelative("value"));
                    if (GUI.GetNameOfFocusedControl() != "Value" && character.attributes[index].value > character.attributes[index].maxValue)
                    {
                        if (EditorUtility.DisplayDialog("Value error!",
                                                        "The value introduced is greater than the max value", "Ok"))
                        {
                            character.attributes[index].value = 0;
                        }
                    }
                    rectL.y += EditorGUIUtility.singleLineHeight;
                    GUI.SetNextControlName("MinValue");
                    EditorGUI.PropertyField(new Rect(rectL.x, rectL.y, rectL.width - 15, rectL.height), element.FindPropertyRelative("minValue"));
                    if (GUI.GetNameOfFocusedControl() != "MinValue" && character.attributes[index].minValue > character.attributes[index].maxValue)
                    {
                        if (EditorUtility.DisplayDialog("Value error!",
                                                        "The min value introduced is greater than the max value", "Ok"))
                        {
                            character.attributes[index].minValue = 0;
                        }
                    }
                    rectL.y += EditorGUIUtility.singleLineHeight;
                    EditorGUI.PropertyField(new Rect(rectL.x, rectL.y, rectL.width - 15, rectL.height), element.FindPropertyRelative("maxValue"));
                    listAttributes.elementHeight = EditorGUIUtility.singleLineHeight * 4.0f + 4.0f;
                }
                else
                {
                    listAttributes.elementHeight = EditorGUIUtility.singleLineHeight + 4.0f;
                }
            }
        };

        listAttributes.elementHeightCallback += (idx) => {
            if (foldout[idx])
            {
                return(EditorGUIUtility.singleLineHeight * 4.0f + 4.0f);
            }
            else
            {
                return(EditorGUIUtility.singleLineHeight + 4.0f);
            }
        };

        // Draw attributes with formulas
        listAttributesFormulas.drawElementCallback =
            (Rect rectL, int index, bool isActive, bool isFocused) => {
            if (index < character.attributesWithFormulas.Count)
            {
                var element        = character.attributesWithFormulas[index];
                var textDimensions = GUI.skin.label.CalcSize(new GUIContent(element.attribute.name));
                rectL.y += 2;

                EditorGUI.LabelField(new Rect(rectL.x, rectL.y, textDimensions.x, rectL.height), element.attribute.name);
                EditorGUI.LabelField(new Rect(rectL.x + textDimensions.x - 5, rectL.y, 10, rectL.height), " = ");
                EditorGUI.LabelField(new Rect(rectL.x + textDimensions.x + 5, rectL.y, rectL.width - textDimensions.x - 5, rectL.height), element.value.ToString());
            }
        };

        // Slots header
        listSlots.drawHeaderCallback = (Rect rect) => {
            EditorGUI.LabelField(rect, "Slots");
        };

        // Slots defined in specialized classes header
        listSlotsSpecializedClasses.drawHeaderCallback = (Rect rect) => {
            EditorGUI.LabelField(rect, "Slots defined in specialized classes");
        };

        // listAttributes header
        listAttributes.drawHeaderCallback = (Rect rect) => {
            EditorGUI.LabelField(rect, "Attributes");
        };

        // listAttributes with Formulas header
        listAttributesFormulas.drawHeaderCallback = (Rect rect) => {
            EditorGUI.LabelField(rect, "Attributes from Formulas");
        };

        //listSpecializedClass header
        listSpecializedClass.drawHeaderCallback = (Rect rect) => {
            EditorGUI.LabelField(rect, "Specialized Classes");
        };

        // Add slot
        listSlots.onAddDropdownCallback = (Rect buttonRect, ReorderableList l) => {
            character.Slots.Add(new Slot());
        };

        // Add attribute
        listAttributes.onAddDropdownCallback = (Rect buttonRect, ReorderableList l) => {
            var menu = new GenericMenu();
            foreach (Attribute attrib in Database.Instance.attributes)
            {
                if (!attrib.isCore && !attributes.Any(x => x.attribute == attrib) && !character.specializedClasses.Any(x => x.attributes.Find(y => y.attribute.id == attrib.id) != null))
                {
                    menu.AddItem(new GUIContent(attrib.name),
                                 false, clickHandlerAttributes,
                                 attrib);
                }
            }
            menu.ShowAsContext();
        };

        // Add specialized class
        listSpecializedClass.onAddDropdownCallback = (Rect buttonRect, ReorderableList l) => {
            var menu = new GenericMenu();
            foreach (SpecializedClass spec in Database.Instance.specializedClasses)
            {
                menu.AddItem(new GUIContent(spec.name), false, clickHandlerSpecializedClass, spec);
            }
            menu.ShowAsContext();
        };

        // Eliminar atributo
        listAttributes.onCanRemoveCallback = (ReorderableList l) => {
            if (attributes[l.index].attribute.isCore)
            {
                return(false);
            }
            else
            {
                return(true);
            }
        };

        // Remove specialized classes
        listSpecializedClass.onRemoveCallback = (ReorderableList l) => {
            character.specializedClasses.Remove(listSpecializedClass.serializedProperty.GetArrayElementAtIndex(l.index).objectReferenceValue as SpecializedClass);
        };
    }