コード例 #1
0
        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));
        }
コード例 #2
0
ファイル: MetadataWrapperDrawer.cs プロジェクト: vued/Creator
        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);
        }
コード例 #3
0
ファイル: MetadataWrapperDrawer.cs プロジェクト: vued/Creator
        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));
        }