First commit for private source control. Older commits available on Github.
This commit is contained in:
79
Assets/Scripts/Editor/Drawers/BaseInteractionDrawer.cs
Normal file
79
Assets/Scripts/Editor/Drawers/BaseInteractionDrawer.cs
Normal file
@@ -0,0 +1,79 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using BriarQueen.Framework.Managers.Interaction.Data;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace BriarQueen.Editor.Drawers
|
||||
{
|
||||
[CustomPropertyDrawer(typeof(BaseInteraction), true)]
|
||||
public class BaseItemInteractionDrawer : PropertyDrawer
|
||||
{
|
||||
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
|
||||
{
|
||||
EditorGUI.BeginProperty(position, label, property);
|
||||
|
||||
if (property.managedReferenceValue == null)
|
||||
{
|
||||
if (GUI.Button(position, "Select Interaction Type"))
|
||||
{
|
||||
ShowTypeMenu(property);
|
||||
}
|
||||
|
||||
EditorGUI.EndProperty();
|
||||
return;
|
||||
}
|
||||
|
||||
var type = property.managedReferenceValue.GetType();
|
||||
var headerRect = new Rect(position.x, position.y, position.width, EditorGUIUtility.singleLineHeight);
|
||||
|
||||
if (GUI.Button(headerRect, type.Name, EditorStyles.popup))
|
||||
{
|
||||
ShowTypeMenu(property);
|
||||
}
|
||||
|
||||
var bodyRect = new Rect(
|
||||
position.x,
|
||||
position.y + EditorGUIUtility.singleLineHeight + 2,
|
||||
position.width,
|
||||
position.height - EditorGUIUtility.singleLineHeight - 2);
|
||||
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUI.PropertyField(bodyRect, property, GUIContent.none, true);
|
||||
EditorGUI.indentLevel--;
|
||||
|
||||
EditorGUI.EndProperty();
|
||||
}
|
||||
|
||||
private void ShowTypeMenu(SerializedProperty property)
|
||||
{
|
||||
var menu = new GenericMenu();
|
||||
|
||||
var types = AppDomain.CurrentDomain.GetAssemblies()
|
||||
.SelectMany(a => a.GetTypes())
|
||||
.Where(t =>
|
||||
!t.IsAbstract &&
|
||||
typeof(BaseInteraction).IsAssignableFrom(t));
|
||||
|
||||
foreach (var type in types)
|
||||
{
|
||||
menu.AddItem(new GUIContent(type.Name), false, () =>
|
||||
{
|
||||
property.serializedObject.Update();
|
||||
property.managedReferenceValue = Activator.CreateInstance(type);
|
||||
property.serializedObject.ApplyModifiedProperties();
|
||||
});
|
||||
}
|
||||
|
||||
menu.ShowAsContext();
|
||||
}
|
||||
|
||||
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
|
||||
{
|
||||
if (property.managedReferenceValue == null)
|
||||
return EditorGUIUtility.singleLineHeight;
|
||||
|
||||
return EditorGUI.GetPropertyHeight(property, true) + EditorGUIUtility.singleLineHeight + 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user