Skip to content

Commit 184c24d

Browse files
committed
Update project to Unity 2021.x; implement SerializeReference-based context menu operations (Copy, Paster, Duplicate)
1 parent 298c0cf commit 184c24d

26 files changed

Lines changed: 750 additions & 120 deletions

Assets/Editor Toolbox/Editor/ContextMenu.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using UnityEditor;
2+
using UnityEngine;
3+
4+
namespace Toolbox.Editor.ContextMenu
5+
{
6+
internal interface IContextMenuOperation
7+
{
8+
bool IsVisible(SerializedProperty property);
9+
bool IsEnabled(SerializedProperty property);
10+
void Perform(SerializedProperty property);
11+
12+
GUIContent Label { get; }
13+
}
14+
}

Assets/Editor Toolbox/Editor/ContextMenu/IContextMenuOperation.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Editor Toolbox/Editor/ContextMenu/Management.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
using System.Collections.Generic;
2+
3+
using UnityEditor;
4+
5+
namespace Toolbox.Editor.ContextMenu.Management
6+
{
7+
using Toolbox.Editor.ContextMenu.Operations;
8+
9+
[InitializeOnLoad]
10+
internal static class ToolboxContextMenuManager
11+
{
12+
private static readonly List<IContextMenuOperation> registeredOperations;
13+
14+
static ToolboxContextMenuManager()
15+
{
16+
registeredOperations = new List<IContextMenuOperation>()
17+
{
18+
new CopySerializeReferenceOperation(),
19+
new PasteSerializeReferenceOperation(),
20+
new DuplicateSerializeReferenceArrayElementOperation()
21+
};
22+
23+
EditorApplication.contextualPropertyMenu -= OnContextMenuOpening;
24+
EditorApplication.contextualPropertyMenu += OnContextMenuOpening;
25+
}
26+
27+
public static void AppendOpertation(IContextMenuOperation operation)
28+
{
29+
registeredOperations.Add(operation);
30+
}
31+
32+
public static bool RemoveOperation(IContextMenuOperation operation)
33+
{
34+
return registeredOperations.Remove(operation);
35+
}
36+
37+
private static void OnContextMenuOpening(GenericMenu menu, SerializedProperty property)
38+
{
39+
foreach (var operation in registeredOperations)
40+
{
41+
if (!operation.IsVisible(property))
42+
{
43+
continue;
44+
}
45+
46+
var label = operation.Label;
47+
if (!operation.IsEnabled(property))
48+
{
49+
menu.AddDisabledItem(label);
50+
continue;
51+
}
52+
53+
menu.AddItem(label, false, () =>
54+
{
55+
operation.Perform(property);
56+
});
57+
}
58+
}
59+
}
60+
}

Assets/Editor Toolbox/Editor/ContextMenuController.cs.meta renamed to Assets/Editor Toolbox/Editor/ContextMenu/Management/ToolboxContextMenuManager.cs.meta

File renamed without changes.

Assets/Editor Toolbox/Editor/ContextMenu/Operations.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Editor Toolbox/Editor/ContextMenu/Operations/SerializeReference.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
using UnityEditor;
2+
using UnityEngine;
3+
4+
namespace Toolbox.Editor.ContextMenu.Operations
5+
{
6+
internal class CopySerializeReferenceOperation : IContextMenuOperation
7+
{
8+
internal static CopySerializedRererenceCache Cache { get; private set; }
9+
10+
public bool IsVisible(SerializedProperty property)
11+
{
12+
#if UNITY_2021_3_OR_NEWER
13+
return property != null && property.propertyType == SerializedPropertyType.ManagedReference;
14+
#else
15+
return false;
16+
#endif
17+
}
18+
19+
public bool IsEnabled(SerializedProperty property)
20+
{
21+
return true;
22+
}
23+
24+
public void Perform(SerializedProperty property)
25+
{
26+
#if UNITY_2021_3_OR_NEWER
27+
var value = property.managedReferenceValue;
28+
if (value != null)
29+
{
30+
var referenceType = value.GetType();
31+
var data = JsonUtility.ToJson(value);
32+
Cache = new CopySerializedRererenceCache(referenceType, data);
33+
return;
34+
}
35+
36+
Cache = new CopySerializedRererenceCache(null, null);
37+
#endif
38+
}
39+
40+
public GUIContent Label => new GUIContent("Copy Serialize Reference");
41+
42+
[InitializeOnLoadMethod]
43+
private static void Initialize()
44+
{
45+
Cache = null;
46+
}
47+
}
48+
}

Assets/Editor Toolbox/Editor/ContextMenu/Operations/SerializeReference/CopySerializeReferenceOperation.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)