Files
test/Assets/EditorAttributes/Editor/Scripts/Drawers/MiscellaneousAttributeDrawers/FolderPathDrawer.cs
T

63 lines
1.8 KiB
C#

using System.IO;
using UnityEngine;
using UnityEditor;
using UnityEngine.UIElements;
namespace EditorAttributes.Editor
{
[CustomPropertyDrawer(typeof(FolderPathAttribute))]
public class FolderPathDrawer : PropertyDrawerBase
{
public override VisualElement CreatePropertyGUI(SerializedProperty property)
{
var folderPathAttribute = attribute as FolderPathAttribute;
var root = new VisualElement();
if (property.propertyType != SerializedPropertyType.String)
{
root.Add(new HelpBox("The FolderPath Attribute can only be attached to a string", HelpBoxMessageType.Error));
return root;
}
var folderPath = property.stringValue;
var propertyField = CreatePropertyField(property);
var button = new Button(() => folderPath = EditorUtility.OpenFolderPanel("Select folder", "Assets", ""));
var buttonIcon = new Image() { image = EditorGUIUtility.IconContent("d_Folder Icon").image };
button.style.width = 40f;
button.style.height = 20f;
propertyField.style.flexGrow = 1f;
root.style.flexDirection = FlexDirection.Row;
button.Add(buttonIcon);
root.Add(propertyField);
root.Add(button);
var textField = new TextField();
ExecuteLater(propertyField, () => textField = propertyField.Q<TextField>());
UpdateVisualElement(propertyField, () =>
{
if (folderPathAttribute.GetRelativePath && !string.IsNullOrEmpty(folderPath))
{
string projectRoot = Application.dataPath[..^"Assets".Length];
folderPath = Path.GetRelativePath(projectRoot, folderPath);
}
if (property.hasMultipleDifferentValues)
return;
textField.value = folderPath;
property.stringValue = folderPath;
property.serializedObject.ApplyModifiedProperties();
});
return root;
}
}
}