Merge pull request #42 from mackysoft/feature/copy-paste-property

Implement copy and paste property
This commit is contained in:
Makihiro 2023-12-31 17:44:18 +09:00 committed by GitHub
commit 343d930155
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 77 additions and 0 deletions

View File

@ -0,0 +1,66 @@
#if UNITY_2019_3_OR_NEWER
using UnityEditor;
using UnityEngine;
namespace MackySoft.SerializeReferenceExtensions.Editor
{
public static class CopyAndPasteProperty
{
const string kCopiedPropertyPathKey = "SerializeReferenceExtensions.CopiedPropertyPath";
const string kClipboardKey = "SerializeReferenceExtensions.CopyAndPasteProperty";
static readonly GUIContent kPasteContent = new GUIContent("Paste Property");
[InitializeOnLoadMethod]
static void Initialize ()
{
EditorApplication.contextualPropertyMenu += OnContextualPropertyMenu;
}
static void OnContextualPropertyMenu (GenericMenu menu, SerializedProperty property)
{
if (property.propertyType == SerializedPropertyType.ManagedReference)
{
// NOTE: When the callback function is called, the SerializedProperty is rewritten to the property that was being moused over at the time,
// so a new SerializedProperty instance must be created.
SerializedProperty clonedProperty = property.Copy();
menu.AddItem(new GUIContent($"Copy \"{property.propertyPath}\" property"), false, Copy, clonedProperty);
string copiedPropertyPath = SessionState.GetString(kCopiedPropertyPathKey, string.Empty);
if (!string.IsNullOrEmpty(copiedPropertyPath))
{
menu.AddItem(new GUIContent($"Paste \"{copiedPropertyPath}\" property"), false, Paste, clonedProperty);
}
else
{
menu.AddDisabledItem(kPasteContent);
}
}
}
static void Copy (object customData)
{
SerializedProperty property = (SerializedProperty)customData;
string json = JsonUtility.ToJson(property.managedReferenceValue);
SessionState.SetString(kCopiedPropertyPathKey, property.propertyPath);
SessionState.SetString(kClipboardKey, json);
}
static void Paste (object customData)
{
SerializedProperty property = (SerializedProperty)customData;
string json = SessionState.GetString(kClipboardKey, string.Empty);
if (string.IsNullOrEmpty(json))
{
return;
}
Undo.RecordObject(property.serializedObject.targetObject, "Paste Property");
JsonUtility.FromJsonOverwrite(json, property.managedReferenceValue);
property.serializedObject.ApplyModifiedProperties();
}
}
}
#endif

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 734d3eb8da4785b49919aea6db62d877
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: