private IList <MetadataWrapper> ConvertReorderableListOfMetadataToList(MetadataWrapper wrapper) { if (CheckListOfMetadata(wrapper) == false) { return(new List <MetadataWrapper>()); } if (wrapper.Metadata.Count > 1) { throw new NotImplementedException($"ReorderableListOfAttribute attribute should have the lowest priority. Check MetadataWrapperDrawer.Draw method."); } ListOfAttribute.Metadata wrapperMetadata = (wrapper.Metadata[reorderableListOfName] as ListOfAttribute.Metadata); List <Dictionary <string, object> > listOfMetadata = wrapperMetadata.ChildMetadata; int wrapperCount = ((IList)wrapper.Value).Count; if (listOfMetadata == null) { listOfMetadata = new List <Dictionary <string, object> >(wrapperCount); } if (listOfMetadata.Count != wrapperCount) { listOfMetadata.Clear(); for (int i = 0; i < wrapperCount; i++) { listOfMetadata.Add(wrapperMetadata.ChildAttributes.ToDictionary(attribute => attribute.Name, attribute => attribute.GetDefaultMetadata(null))); listOfMetadata[i].Add(reorderableName, new ReorderableElementMetadata()); } } return(GetListOfWrappers(wrapper, listOfMetadata)); }
private Rect DrawExtendableList(Rect rect, MetadataWrapper wrapper, Action <object> changeValueCallback, GUIContent label) { if (wrapper.Value == null || wrapper.Value is IList == false) { if (wrapper.Value != null) { logger.Warn("ExtendableListAttribute can be used only with IList members."); } return(rect); } Type elementType = (wrapper.Metadata[extendableListName] as ExtendableListAttribute.SerializedTypeWrapper).Type; IList list = (IList)wrapper.Value; float currentY = 0; currentY += DrawRecursively(rect, wrapper, extendableListName, changeValueCallback, label).height; ITrainingDrawer addThingsDrawer = DrawerLocator.GetInstantiatorDrawer(elementType); if (addThingsDrawer != null) { currentY += addThingsDrawer.Draw(new Rect(rect.x, rect.y + currentY, rect.width, 0), null, (newValue) => { if (newValue == null) { ReflectionUtils.RemoveFromList(ref list, list.Count - 1); } else { ReflectionUtils.InsertIntoList(ref list, list.Count, newValue); } if (wrapper.Metadata.ContainsKey(listOfName)) { ListOfAttribute.Metadata temp = (ListOfAttribute.Metadata)wrapper.Metadata[listOfName]; temp.ChildMetadata.Add(temp.ChildAttributes.ToDictionary(attribute => attribute.Name, attribute => attribute.GetDefaultMetadata(null))); wrapper.Metadata[listOfName] = temp; } wrapper.Value = list; changeValueCallback(wrapper); }, "").height; } rect.height = currentY; return(rect); }
private Rect DrawListOf(Rect rect, MetadataWrapper wrapper, Action <object> changeValueCallback, GUIContent label) { if (wrapper.Value == null || (wrapper.Value is IList == false)) { if (wrapper.Value != null) { logger.Warn("ListOfAttribute can be used only with IList members."); } return(rect); } ListOfAttribute.Metadata wrapperMetadata = (wrapper.Metadata[listOfName] as ListOfAttribute.Metadata); List <Dictionary <string, object> > listOfMetadatas = wrapperMetadata.ChildMetadata; IList list = (IList)wrapper.Value; if (listOfMetadatas == null) { listOfMetadatas = new List <Dictionary <string, object> >(list.Count); } if (listOfMetadatas.Count != list.Count) { listOfMetadatas.Clear(); for (int i = 0; i < list.Count; i++) { listOfMetadatas.Add(wrapperMetadata.ChildAttributes.ToDictionary(attribute => attribute.Name, attribute => attribute.GetDefaultMetadata(null))); } } Type entryType = ReflectionUtils.GetEntryType(wrapper.Value); List <MetadataWrapper> listOfWrappers = new List <MetadataWrapper>(); for (int i = 0; i < list.Count; i++) { listOfWrappers.Add(new MetadataWrapper() { Metadata = listOfMetadatas[i], ValueDeclaredType = entryType, Value = list[i], }); } if (wrapper.Metadata.Count > 1) { throw new NotImplementedException("ListOf attribute should have the lowest priority. Check MetadataWrapperDrawer.Draw method."); } ITrainingDrawer valueDrawer = DrawerLocator.GetDrawerForValue(wrapper.Value, wrapper.ValueDeclaredType); return(valueDrawer.Draw(rect, listOfWrappers, (newValue) => { List <MetadataWrapper> newListOfWrappers = ((List <MetadataWrapper>)newValue).ToList(); ReflectionUtils.ReplaceList(ref list, newListOfWrappers.Select(childWrapper => childWrapper.Value)); wrapper.Value = list; (wrapper.Metadata[listOfName] as ListOfAttribute.Metadata).ChildMetadata = newListOfWrappers.Select(childWrapper => childWrapper.Metadata).ToList(); changeValueCallback(wrapper); }, label)); }