Skip to content

Commit

Permalink
Merge pull request #42 from mackysoft/feature/copy-paste-property
Browse files Browse the repository at this point in the history
Implement copy and paste property
  • Loading branch information
mackysoft committed Dec 31, 2023
2 parents 1e52b89 + 15a627b commit 343d930
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -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

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 343d930

Please sign in to comment.