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(); }
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(); }
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(); }
private void removeSpecializedClass(SpecializedClass specializedClass) { Database.Instance.specializedClasses.Remove(specializedClass); AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(specializedClass)); }
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; }
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); }; }