|
|
|
|
using UnityEngine;
|
|
|
|
|
using UnityEditor;
|
|
|
|
|
using System.Text.RegularExpressions;
|
|
|
|
|
using System;
|
|
|
|
|
|
|
|
|
|
namespace NaughtyAttributes.Editor
|
|
|
|
|
{
|
|
|
|
|
[CustomPropertyDrawer(typeof(ResizableTextAreaAttribute))]
|
|
|
|
|
public class ResizableTextAreaPropertyDrawer : PropertyDrawerBase
|
|
|
|
|
{
|
|
|
|
|
protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label)
|
|
|
|
|
{
|
|
|
|
|
if (property.propertyType == SerializedPropertyType.String)
|
|
|
|
|
{
|
|
|
|
|
float labelHeight = EditorGUIUtility.singleLineHeight;
|
|
|
|
|
float textAreaHeight = GetTextAreaHeight(property.stringValue);
|
|
|
|
|
return labelHeight + textAreaHeight;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return GetPropertyHeight(property) + GetHelpBoxHeight();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label)
|
|
|
|
|
{
|
|
|
|
|
EditorGUI.BeginProperty(rect, label, property);
|
|
|
|
|
|
|
|
|
|
if (property.propertyType == SerializedPropertyType.String)
|
|
|
|
|
{
|
|
|
|
|
Rect labelRect = new Rect()
|
|
|
|
|
{
|
|
|
|
|
x = rect.x,
|
|
|
|
|
y = rect.y,
|
|
|
|
|
width = rect.width,
|
|
|
|
|
height = EditorGUIUtility.singleLineHeight
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
EditorGUI.LabelField(labelRect, label.text);
|
|
|
|
|
|
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
|
|
|
|
|
|
|
|
Rect textAreaRect = new Rect()
|
|
|
|
|
{
|
|
|
|
|
x = labelRect.x,
|
|
|
|
|
y = labelRect.y + EditorGUIUtility.singleLineHeight,
|
|
|
|
|
width = labelRect.width,
|
|
|
|
|
height = GetTextAreaHeight(property.stringValue)
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
string textAreaValue = EditorGUI.TextArea(textAreaRect, property.stringValue);
|
|
|
|
|
|
|
|
|
|
if (EditorGUI.EndChangeCheck())
|
|
|
|
|
{
|
|
|
|
|
property.stringValue = textAreaValue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
string message = typeof(ResizableTextAreaAttribute).Name + " can only be used on string fields";
|
|
|
|
|
DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
EditorGUI.EndProperty();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private int GetNumberOfLines(string text)
|
|
|
|
|
{
|
|
|
|
|
string content = Regex.Replace(text, @"\r\n|\n\r|\r|\n", Environment.NewLine);
|
|
|
|
|
string[] lines = content.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
|
|
|
|
|
return lines.Length;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private float GetTextAreaHeight(string text)
|
|
|
|
|
{
|
|
|
|
|
float height = (EditorGUIUtility.singleLineHeight - 3.0f) * GetNumberOfLines(text) + 3.0f;
|
|
|
|
|
return height;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|