public ArrayOption GetOptionsForMember(BaseMightyMember mightyMember, BaseArrayAttribute attribute) { if (!m_optionsCache.Contains(mightyMember)) { EnableDrawer(mightyMember, attribute); } return(m_optionsCache[mightyMember].Value); }
public override void DrawArray(BaseMightyMember mightyMember, BaseArrayAttribute baseAttribute, IArrayElementDrawer drawer, BaseDrawerAttribute drawerAttribute) { var property = mightyMember.Property; if (property.isArray) { var attribute = (ReorderableListAttribute)baseAttribute; if (!ArrayCache.Contains(mightyMember)) { InitDrawer(mightyMember, baseAttribute); } var(optionInfo, decoratorAttributes, decoratorDrawers) = ArrayCache[mightyMember]; var option = optionInfo.Value; var decoratorLength = decoratorAttributes.Length; EditorGUILayout.BeginVertical(); for (var i = 0; i < decoratorLength; i++) { decoratorDrawers[i].BeginDrawArray(mightyMember, decoratorAttributes[i]); } if (!option.Contains(ArrayOption.HideLabel)) { if (!option.Contains(ArrayOption.LabelInHeader)) { for (var i = 0; i < decoratorLength; i++) { decoratorDrawers[i].BeginDrawHeader(mightyMember, decoratorAttributes[i]); } if (!EditorDrawUtility.DrawFoldout(property)) { EditorGUILayout.EndVertical(); for (var i = 0; i < decoratorLength; i++) { decoratorDrawers[i].EndDrawHeader(mightyMember, decoratorAttributes[i]); } for (var i = 0; i < decoratorLength; i++) { decoratorDrawers[i].EndDrawArray(mightyMember, decoratorAttributes[i]); } return; } for (var i = 0; i < decoratorLength; i++) { decoratorDrawers[i].EndDrawHeader(mightyMember, decoratorAttributes[i]); } } } else { property.isExpanded = true; } if (!option.Contains(ArrayOption.DontIndent)) { m_indentCache[mightyMember] = EditorGUI.indentLevel; EditorDrawUtility.BeginLayoutIndent(); EditorGUI.indentLevel = 0; EditorGUILayout.BeginVertical(); } if (!m_reorderableCache.Contains(mightyMember)) { ReorderableList reorderableList = new ReorderableList(property.serializedObject, property, !option.Contains(ArrayOption.ReadOnly), option.Contains(ArrayOption.LabelInHeader) || !option.Contains(ArrayOption.HideSizeField), attribute.DrawButtons, attribute.DrawButtons) { drawHeaderCallback = rect => { var drawLabel = option.Contains(ArrayOption.LabelInHeader); if (!drawLabel && option.Contains(ArrayOption.HideSizeField)) { return; } for (var i = 0; i < decoratorLength; i++) { rect = decoratorDrawers[i].BeginDrawHeader(rect, mightyMember, decoratorAttributes[i]); } if (!drawLabel) { var enabled = GUI.enabled; GUI.enabled = !option.Contains(ArrayOption.DisableSizeField); EditorDrawUtility.DrawArraySizeField(rect, property); GUI.enabled = enabled; } else { EditorGUI.LabelField(rect, property.displayName); } var newRect = new Rect(rect.x, rect.y + EditorGUIUtility.singleLineHeight, rect.width, 0); for (var i = 0; i < decoratorLength; i++) { newRect = decoratorDrawers[i].EndDrawHeader(newRect, mightyMember, decoratorAttributes[i]); } }, drawElementCallback = (rect, index, isActive, isFocused) => { rect.y += 2f; var newRect = new Rect(rect.x, rect.y + 21, rect.width, 0); for (var i = 0; i < decoratorLength; i++) { newRect = decoratorDrawers[i].BeginDrawElement(newRect, mightyMember, i, decoratorAttributes[i]); } if (drawer != null) { var height = drawer.GetElementHeight(mightyMember, index, drawerAttribute); drawer.DrawElement(new Rect(rect.x, rect.y, rect.width, height), mightyMember, index, drawerAttribute); } else { EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), property.GetArrayElementAtIndex(index)); } for (var i = 0; i < decoratorLength; i++) { newRect = decoratorDrawers[i].EndDrawElement(newRect, mightyMember, i, decoratorAttributes[i]); } }, elementHeightCallback = (index) => { var height = drawer?.GetElementHeight(mightyMember, index, drawerAttribute) ?? 20; for (var i = 0; i < decoratorLength; i++) { height += decoratorDrawers[i].GetElementHeight(mightyMember, i, decoratorAttributes[i]); } return(height); } }; m_reorderableCache[mightyMember] = reorderableList; } m_reorderableCache[mightyMember].DoLayoutList(); if (!option.Contains(ArrayOption.DontIndent)) { EditorGUI.indentLevel = m_indentCache[mightyMember]; EditorDrawUtility.EndLayoutIndent(); EditorGUILayout.EndVertical(); } for (var i = 0; i < decoratorLength; i++) { decoratorDrawers[i].EndDrawArray(mightyMember, decoratorAttributes[i]); } EditorGUILayout.EndVertical(); } else { EditorDrawUtility.DrawHelpBox($"{baseAttribute.GetType().Name} can be used only on arrays or lists"); EditorDrawUtility.DrawPropertyField(property); } }
public override void DrawArray(BaseMightyMember mightyMember, BaseArrayAttribute baseAttribute, IArrayElementDrawer drawer, BaseDrawerAttribute drawerAttribute) { var property = mightyMember.Property; if (!property.isArray) { EditorDrawUtility.DrawHelpBox($"{typeof(ButtonArrayAttribute).Name} can be used only on arrays or lists"); EditorDrawUtility.DrawPropertyField(property); return; } if (!ArrayCache.Contains(mightyMember)) { InitDrawer(mightyMember, baseAttribute); } var(optionInfo, decoratorAttributes, decoratorDrawers) = ArrayCache[mightyMember]; var option = optionInfo.Value; var decoratorLength = decoratorAttributes.Length; for (var i = 0; i < decoratorLength; i++) { decoratorDrawers[i].BeginDrawArray(mightyMember, decoratorAttributes[i]); } for (var i = 0; i < decoratorLength; i++) { decoratorDrawers[i].BeginDrawHeader(mightyMember, decoratorAttributes[i]); } if (!option.Contains(ArrayOption.HideLabel) && !EditorDrawUtility.DrawFoldout(property)) { for (var i = 0; i < decoratorLength; i++) { decoratorDrawers[i].EndDrawHeader(mightyMember, decoratorAttributes[i]); } for (var i = 0; i < decoratorLength; i++) { decoratorDrawers[i].EndDrawArray(mightyMember, decoratorAttributes[i]); } return; } if (option.Contains(ArrayOption.HideLabel)) { property.isExpanded = true; } else if (!option.Contains(ArrayOption.DontIndent)) { EditorGUI.indentLevel++; } for (var i = 0; i < decoratorLength; i++) { decoratorDrawers[i].EndDrawHeader(mightyMember, decoratorAttributes[i]); } GUILayout.BeginVertical(GUIStyleUtility.ButtonArray, GUILayout.MinHeight(35)); var indent = EditorGUI.indentLevel; EditorGUI.indentLevel = 0; if (property.arraySize == 0) { GUILayout.FlexibleSpace(); if (EditorDrawUtility.DrawAddButton()) { property.InsertArrayElementAtIndex(0); property.serializedObject.ApplyModifiedProperties(); } GUILayout.FlexibleSpace(); } EditorDrawUtility.DrawArrayBody(property, index => { var element = property.GetArrayElementAtIndex(index); for (var i = 0; i < decoratorLength; i++) { decoratorDrawers[i].BeginDrawElement(mightyMember, index, decoratorAttributes[i]); } GUILayout.BeginHorizontal(GUILayout.MinHeight(33)); GUILayout.BeginVertical(GUILayout.Width(1)); GUILayout.FlexibleSpace(); GUILayout.BeginHorizontal(); if (EditorDrawUtility.DrawRemoveButton()) { property.DeleteArrayElementAtIndex(index); property.serializedObject.ApplyModifiedProperties(); GUILayout.EndHorizontal(); for (var i = 0; i < decoratorLength; i++) { decoratorDrawers[i].EndDrawElement(mightyMember, index, decoratorAttributes[i]); } return; } if (EditorDrawUtility.DrawAddButton()) { property.InsertArrayElementAtIndex(index); property.serializedObject.ApplyModifiedProperties(); } GUILayout.EndHorizontal(); GUILayout.FlexibleSpace(); GUILayout.EndVertical(); GUILayout.BeginVertical(); GUILayout.FlexibleSpace(); if (drawer != null) { drawer.DrawElement(mightyMember, index, drawerAttribute); } else if (option.Contains(ArrayOption.HideElementLabel)) { EditorGUILayout.PropertyField(element, GUIContent.none); } else { EditorGUILayout.PropertyField(element); } GUILayout.FlexibleSpace(); GUILayout.EndVertical(); GUILayout.EndHorizontal(); for (var i = 0; i < decoratorLength; i++) { decoratorDrawers[i].EndDrawElement(mightyMember, index, decoratorAttributes[i]); } }); EditorGUI.indentLevel = indent; GUILayout.EndVertical(); if (!option.Contains(ArrayOption.HideLabel) && !option.Contains(ArrayOption.DontIndent)) { EditorGUI.indentLevel--; } for (var i = 0; i < decoratorLength; i++) { decoratorDrawers[i].EndDrawArray(mightyMember, decoratorAttributes[i]); } }
public void DrawArray(MightySerializedField serializedField, BaseArrayAttribute attribute, IArrayElementDrawer drawerAttributeDrawer, BasePropertyDrawerAttribute drawerAttribute) => DrawArray(serializedField, (T)attribute, drawerAttributeDrawer, drawerAttribute);