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); }
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) }); } }