static object DoRecursiveField(object obj) { var doGuiObj = obj as IDoGUI; if (doGuiObj != null) { GUILayout.EndHorizontal(); using (new PrefixLabelIndentScope()) { doGuiObj.DoGUI(); } GUILayout.BeginHorizontal(); } else { var type = obj.GetType(); var multiLine = TypeUtility.IsMultiLine(type); if (multiLine) { GUILayout.EndHorizontal(); using (new PrefixLabelIndentScope()) { DoFields(obj, type); } GUILayout.BeginHorizontal(); } else { var tmp = PrefixLabelSetting.width; PrefixLabelSetting.width = 0f; DoFields(obj, type); GUILayout.FlexibleSpace(); PrefixLabelSetting.width = tmp; } } return(obj); }
static object ListField <T>(object v, Type type, Func <T, int, string, object> customElementGUI) { var list = v as IList; var hasElem = (list != null) && list.Count > 0; var elemType = TypeUtility.GetListInterface(type).GetGenericArguments().First(); var addIdx = -1; var deleteIdx = -1; using (new GUILayout.VerticalScope("box")) { if (v == null) { WarningLabelNoStyle("List is null."); } else if (!hasElem) { WarningLabelNoStyle("List is empty."); } else { for (var i = 0; i < list.Count; ++i) { var label = TypeUtility.IsMultiLine(elemType) ? $"Element {i}" : null; using (new IndentScope(20f)) { list[i] = (customElementGUI != null) ? customElementGUI((T)list, i, label) : Field(list[i], elemType, label); } var result = PopupOnLastRect(ListPopupButtonNames, 1); switch (result) { case 0: addIdx = i + 1; break; case 1: deleteIdx = i; break; } } } if (addIdx >= 0) { list = AddElement(list, elemType, list[addIdx - 1], addIdx); } if (deleteIdx >= 0) { list = DeleteElement(list, elemType, deleteIdx); } // +/- button using (new GUILayout.HorizontalScope()) { GUILayout.FlexibleSpace(); var width = GUILayout.Width(20f); if (GUILayout.Button("+", width)) { if (list == null) { list = (IList)Activator.CreateInstance(type, 0); } var baseElem = hasElem ? list[list.Count - 1] : null; list = AddElement(list, elemType, baseElem, list.Count); } using (new EnabledScope(hasElem)) { if (GUILayout.Button("-", width)) { list = DeleteElement(list, elemType, list.Count - 1); } } } } return(list); }