//********************************** Banshee Engine (www.banshee3d.com) **************************************************// //**************** Copyright (c) 2019 Marko Pintera (marko.pintera@gmail.com). All rights reserved. **********************// using bs; namespace bs.Editor { /** @addtogroup Inspector * @{ */ /// /// Displays GUI for a serializable property containing a value in degrees. /// [CustomInspector(typeof(Degree))] public class InspectableDegree : InspectableField { private GUIFloatField guiFloatField; private InspectableState state; private InspectableFieldStyleInfo style; /// /// Creates a new inspectable float GUI for the specified property. /// /// Context shared by all inspectable fields created by the same parent. /// Name of the property, or some other value to set as the title. /// Full path to this property (includes name of this property and all parent properties). /// Determines how deep within the inspector nesting hierarchy is this field. Some fields may /// contain other fields, in which case you should increase this value by one. /// Parent layout that all the field elements will be added to. /// Serializable property referencing the field whose contents to display. /// Information that can be used for customizing field rendering and behaviour. public InspectableDegree(InspectableContext context, string title, string path, int depth, InspectableFieldLayout layout, SerializableProperty property, InspectableFieldStyleInfo style) : base(context, title, path, SerializableProperty.FieldType.Object, depth, layout, property) { this.style = style; } /// protected internal override void Initialize(int layoutIndex) { if (property != null) { guiFloatField = new GUIFloatField(new GUIContent(title)); if (style != null) { if (style.StepStyle != null && style.StepStyle.Step != 0) guiFloatField.Step = style.StepStyle.Step; if (style.RangeStyle != null) guiFloatField.SetRange(style.RangeStyle.Min, style.RangeStyle.Max); } guiFloatField.OnChanged += OnFieldValueChanged; guiFloatField.OnConfirmed += () => { OnFieldValueConfirm(); StartUndo(); }; guiFloatField.OnFocusLost += OnFieldValueConfirm; guiFloatField.OnFocusGained += StartUndo; layout.AddElement(layoutIndex, guiFloatField); } } /// public override InspectableState Refresh(int layoutIndex) { if (guiFloatField != null && !guiFloatField.HasInputFocus) guiFloatField.Value = property.GetValue().Degrees; InspectableState oldState = state; if (state.HasFlag(InspectableState.Modified)) state = InspectableState.NotModified; return oldState; } /// public override void SetHasFocus(string subFieldName = null) { guiFloatField.Focus = true; } /// /// Triggered when the user inputs a new floating point value. /// /// New value of the float field. private void OnFieldValueChanged(float newValue) { property.SetValue(new Degree(newValue)); state |= InspectableState.ModifyInProgress; } /// /// Triggered when the user confirms input in the float field. /// private void OnFieldValueConfirm() { if (state.HasFlag(InspectableState.ModifyInProgress)) state |= InspectableState.Modified; EndUndo(); } } /** @} */ }