//----------------------------------------------------------------------- // // Copyright (c) Sirenix IVS. All rights reserved. // //----------------------------------------------------------------------- #if UNITY_EDITOR && UNITY_2017_2_OR_NEWER namespace Sirenix.OdinInspector.Editor.Drawers { using Utilities.Editor; using UnityEditor; using UnityEngine; /// /// Vector2Int proprety drawer. /// public sealed class Vector2IntDrawer : OdinValueDrawer, IDefinesGenericMenuItems { /// /// Draws the property. /// protected override void DrawPropertyLayout(GUIContent label) { Rect labelRect; var contentRect = SirenixEditorGUI.BeginHorizontalPropertyLayout(label, out labelRect); { EditorGUI.BeginChangeCheck(); var val = SirenixEditorFields.VectorPrefixSlideRect(labelRect, (Vector2)this.ValueEntry.SmartValue); if (EditorGUI.EndChangeCheck()) { this.ValueEntry.SmartValue = new Vector2Int((int)val.x, (int)val.y); } var showLabels = SirenixEditorFields.ResponsiveVectorComponentFields && contentRect.width >= 185; GUIHelper.PushLabelWidth(SirenixEditorFields.SingleLetterStructLabelWidth); this.ValueEntry.Property.Children[0].Draw(showLabels ? GUIHelper.TempContent("X") : null); this.ValueEntry.Property.Children[1].Draw(showLabels ? GUIHelper.TempContent("Y") : null); GUIHelper.PopLabelWidth(); } SirenixEditorGUI.EndHorizontalPropertyLayout(); } /// /// Populates the generic menu for the property. /// public void PopulateGenericMenu(InspectorProperty property, GenericMenu genericMenu) { Vector2Int value = (Vector2Int)property.ValueEntry.WeakSmartValue; if (genericMenu.GetItemCount() > 0) { genericMenu.AddSeparator(""); } genericMenu.AddItem(new GUIContent("Zero", "Set the vector to (0, 0)"), value == Vector2Int.zero, () => SetVector(property, Vector2Int.zero)); genericMenu.AddItem(new GUIContent("One", "Set the vector to (1, 1)"), value == Vector2Int.one, () => SetVector(property, Vector2Int.one)); genericMenu.AddSeparator(""); genericMenu.AddItem(new GUIContent("Right", "Set the vector to (1, 0)"), value == Vector2Int.right, () => SetVector(property, Vector2Int.right)); genericMenu.AddItem(new GUIContent("Left", "Set the vector to (-1, 0)"), value == Vector2Int.left, () => SetVector(property, Vector2Int.left)); genericMenu.AddItem(new GUIContent("Up", "Set the vector to (0, 1)"), value == Vector2Int.up, () => SetVector(property, Vector2Int.up)); genericMenu.AddItem(new GUIContent("Down", "Set the vector to (0, -1)"), value == Vector2Int.down, () => SetVector(property, Vector2Int.down)); } private void SetVector(InspectorProperty property, Vector2Int value) { property.Tree.DelayActionUntilRepaint(() => { for (int i = 0; i < property.ValueEntry.ValueCount; i++) { property.ValueEntry.WeakValues[i] = value; } }); } } /// /// Vector3Int property drawer. /// public sealed class Vector3IntDrawer : OdinValueDrawer, IDefinesGenericMenuItems { /// /// Draws the property. /// protected override void DrawPropertyLayout(GUIContent label) { Rect labelRect; var contentRect = SirenixEditorGUI.BeginHorizontalPropertyLayout(label, out labelRect); { EditorGUI.BeginChangeCheck(); var val = SirenixEditorFields.VectorPrefixSlideRect(labelRect, (Vector3)this.ValueEntry.SmartValue); if (EditorGUI.EndChangeCheck()) { this.ValueEntry.SmartValue = new Vector3Int((int)val.x, (int)val.y, (int)val.z); } var showLabels = SirenixEditorFields.ResponsiveVectorComponentFields && contentRect.width >= 185; GUIHelper.PushLabelWidth(SirenixEditorFields.SingleLetterStructLabelWidth); this.ValueEntry.Property.Children[0].Draw(showLabels ? GUIHelper.TempContent("X") : null); this.ValueEntry.Property.Children[1].Draw(showLabels ? GUIHelper.TempContent("Y") : null); this.ValueEntry.Property.Children[2].Draw(showLabels ? GUIHelper.TempContent("Z") : null); GUIHelper.PopLabelWidth(); } SirenixEditorGUI.EndHorizontalPropertyLayout(); } /// /// Populates the generic menu for the property. /// public void PopulateGenericMenu(InspectorProperty property, GenericMenu genericMenu) { Vector3Int value = (Vector3Int)property.ValueEntry.WeakSmartValue; if (genericMenu.GetItemCount() > 0) { genericMenu.AddSeparator(""); } genericMenu.AddItem(new GUIContent("Zero", "Set the vector to (0, 0, 0)"), value == Vector3Int.zero, () => SetVector(property, Vector3Int.zero)); genericMenu.AddItem(new GUIContent("One", "Set the vector to (1, 1, 1)"), value == Vector3Int.one, () => SetVector(property, Vector3Int.one)); genericMenu.AddSeparator(""); genericMenu.AddItem(new GUIContent("Right", "Set the vector to (1, 0, 0)"), value == Vector3Int.right, () => SetVector(property, Vector3Int.right)); genericMenu.AddItem(new GUIContent("Left", "Set the vector to (-1, 0, 0)"), value == Vector3Int.left, () => SetVector(property, Vector3Int.left)); genericMenu.AddItem(new GUIContent("Up", "Set the vector to (0, 1, 0)"), value == Vector3Int.up, () => SetVector(property, Vector3Int.up)); genericMenu.AddItem(new GUIContent("Down", "Set the vector to (0, -1, 0)"), value == Vector3Int.down, () => SetVector(property, Vector3Int.down)); genericMenu.AddItem(new GUIContent("Forward", "Set the vector property to (0, 0, 1)"), value == new Vector3Int(0, 0, 1), () => SetVector(property, new Vector3Int(0, 0, 1))); genericMenu.AddItem(new GUIContent("Back", "Set the vector property to (0, 0, -1)"), value == new Vector3Int(0, 0, -1), () => SetVector(property, new Vector3Int(0, 0, -1))); } private void SetVector(InspectorProperty property, Vector3Int value) { property.Tree.DelayActionUntilRepaint(() => { property.ValueEntry.WeakSmartValue = value; }); } } } #endif // UNITY_EDITOR && UNITY_2017_2_OR_NEWER