static VisualElement BuildEnumFieldEditor(EnumValueReference enumConstant, Action <Enum> onNewEnumValue)
        {
            var enumEditor = new EnumField(enumConstant.ValueAsEnum());

            enumEditor.RegisterValueChangedCallback(evt =>
            {
                onNewEnumValue(evt.newValue);
            });
            return(enumEditor);
        }
        static VisualElement BuildSearcherEnumEditor(EnumValueReference enumConstant, Type enumType, Action <Enum> onNewEnumValue)
        {
            var value      = enumConstant.ValueAsEnum();
            var enumEditor = new Button {
                text = value.ToString()
            };

            enumEditor.clickable.clickedWithEventInfo += e =>
            {
                SearcherService.ShowEnumValues("Pick a value", enumType, e.originalMousePosition, (v, i) =>
                {
                    enumEditor.text = v.ToString();
                    onNewEnumValue(v);
                });
            };
            return(enumEditor);
        }
        static VisualElement BuildEnumEditor(IConstantEditorBuilder builder, EnumValueReference enumConstant)
        {
            void TriggerOnValueChange(Enum newEnumValue)
            {
                var oldValue = enumConstant;
                var newValue = new EnumValueReference(newEnumValue);

                using (var evt = ChangeEvent <EnumValueReference> .GetPooled(oldValue, newValue))
                    builder.OnValueChanged(evt);
            }

            Type          enumType = enumConstant.EnumType.Resolve();
            VisualElement editor   = enumType == typeof(KeyCode)
                ? BuildSearcherEnumEditor(enumConstant, enumType, TriggerOnValueChange)
                : BuildEnumFieldEditor(enumConstant, TriggerOnValueChange);

            editor?.SetEnabled(!builder.ConstantIsLocked);
            return(editor);
        }