示例#1
0
        public static TElement Construct <TProperty, TElement, TFieldType, TContainer, TValue>(
            TProperty property,
            ref TContainer container,
            ref TValue value,
            InspectorContext context
            )
            where TProperty : IProperty <TContainer, TValue>
            where TElement : BaseField <TFieldType>, new()
            where TValue : struct
        {
            var element = ConstructBase <TProperty, TContainer, TElement, TFieldType, TValue>(property);

            if (TranslatorFactory <TValue> .TryGetUpdater(element, out var t))
            {
                var offset = context.GetOffsetOfField(property.GetName());
                var index  = context.GetCurrentIndex();
                var setter = context.DataProvider;
                t.SetUpdaters(element, setter, offset, index);
            }
            else
            {
                UnityEngine.Debug.Log($"No data translator registered between {typeof(TValue).Name} and {typeof(TFieldType).Name}");
            }

            if (context.GetParent(out var parent))
            {
                parent.contentContainer.Add(element);
            }

            if (property.IsContainer)
            {
                context.PushParent(element);
            }
            return(element);
        }
示例#2
0
        private static void SetDataUpdater <TEnumType, TValue>(EnumField element, string name, InspectorContext context)
            where TValue : struct
        {
            var offset = context.GetOffsetOfField(name);
            var setter = context.DataProvider;

            if (null == setter)
            {
                element.SetEnabled(false);
            }
            else
            {
                element.RegisterValueChangedCallback(evt =>
                {
                    setter.SetDataAtOffset((TValue)(object)evt.newValue, offset);
                });

                element.userData = new GuiUpdaters.EnumFieldUpdater <TEnumType, TValue>(
                    setter,
                    offset,
                    element,
                    new Translator <Enum, TValue>
                {
                    ToField = v => (Enum)Enum.ToObject(typeof(TEnumType), v),
                    ToValue = v => (TValue)(v as IConvertible).ToType(typeof(TValue), null)
                });
            }
        }