Skip to content

Commit 274fd76

Browse files
committed
feat: Added integration with MissingScriptType
- added integration with the new MissingScriptType package - refactored custom editors: changed inheritance, remade GenericHeaderEditor into GenericHeaderUtility - moved some code to SolidUtilities so that it can be used in MissingScriptType
1 parent cdee47c commit 274fd76

18 files changed

+106
-219
lines changed

Editor/AssemblyCreator/AssemblyCreatorHelper.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using System.Reflection;
88
using System.Reflection.Emit;
99
using GenericUnityObjects.Util;
10+
using SolidUtilities;
1011
using UnityEngine;
1112
using Util;
1213

@@ -126,7 +127,7 @@ public static (string componentName, int order) GetComponentMenu(Type type)
126127

127128
if ( ! componentName.Contains("<"))
128129
{
129-
componentName = $"{componentName}{TypeUtility.GetNiceArgsOfGenericType(type)}";
130+
componentName = $"{componentName}{TypeHelper.GetNiceArgsOfGenericType(type)}";
130131
}
131132

132133
return (componentName, order);
@@ -162,7 +163,7 @@ public ConcreteClassAssembly(string dirPath, string assemblyName, string classNa
162163

163164
_assemblyBuilder = GetAssemblyBuilder(dirPath, assemblyName);
164165
ModuleBuilder moduleBuilder = GetModuleBuilder(_assemblyBuilder, assemblyName);
165-
TypeBuilder = moduleBuilder.DefineType($"GenericUnityObjects.ConcreteClasses.{className}", TypeAttributes.NotPublic, parentType);
166+
TypeBuilder = moduleBuilder.DefineType($"{Config.ConcreteClassNamespace}.{className}", TypeAttributes.NotPublic, parentType);
166167
}
167168

168169
public void Dispose()

Editor/Drawers/BehaviourSelectorEditor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
using System.Linq;
44
using GenericUnityObjects.Util;
55
using MonoBehaviours;
6-
using SolidUtilities.Editor;
76
using SolidUtilities;
7+
using SolidUtilities.Editor;
88
using UnityEditor;
99
using UnityEngine;
1010

@@ -27,7 +27,7 @@ private void OnEnable()
2727
_typesArray = serializedObject.FindProperty(nameof(BehaviourSelector.TypeRefs));
2828
_genericTypeNameWithoutSuffix = _targetSelector.GenericBehaviourType.Name.StripGenericSuffix();
2929
_argumentNames = new string[_targetSelector.TypeRefs.Length];
30-
_genericArgNames = TypeUtility.GetNiceArgsOfGenericType(_targetSelector.GenericBehaviourType);
30+
_genericArgNames = TypeHelper.GetNiceArgsOfGenericType(_targetSelector.GenericBehaviourType);
3131
_drawer = new TypeReferenceWithBaseTypesDrawer();
3232
}
3333

Lines changed: 15 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,14 @@
77
using UnityEditor;
88
using UnityEngine;
99
using Object = UnityEngine.Object;
10-
11-
#if ODIN_INSPECTOR
12-
using Sirenix.OdinInspector.Editor;
13-
#endif
1410

1511
/// <summary>
1612
/// An extension of Editor that changes name of <see cref="GenericScriptableObject"/> assets in the Inspector header.
1713
/// For all other assets, it draws header like before.
1814
/// </summary>
19-
public class GenericHeaderEditor :
20-
#if ODIN_INSPECTOR
21-
OdinEditor
22-
#else
23-
Editor
24-
#endif
15+
public static class GenericHeaderUtility
2516
{
26-
private static readonly Dictionary<TargetInfo, string> _targetTitlesCache = new Dictionary<TargetInfo, string>();
17+
private static readonly Dictionary<Object, string> _targetTitlesCache = new Dictionary<Object, string>();
2718
private static readonly Dictionary<Type, string> _typeNamesCache = new Dictionary<Type, string>();
2819

2920
private static Func<Editor, string, Rect> _drawHeaderGUI;
@@ -62,35 +53,27 @@ private static Func<Object, string> GetTypeName
6253
return _getTypeName;
6354
}
6455
}
65-
66-
#if ! ODIN_INSPECTOR
67-
protected virtual void OnEnable() { }
68-
69-
protected virtual void OnDisable() { }
70-
#endif
71-
72-
protected override void OnHeaderGUI()
56+
57+
public static void OnHeaderGUI(Editor editor)
7358
{
74-
DrawHeaderGUI(this, GetTitle());
59+
DrawHeaderGUI(editor, GetTitle(editor));
7560
}
7661

77-
private string GetTitle()
62+
private static string GetTitle(Editor editor)
7863
{
79-
Type genericType = target.GetType().BaseType;
64+
Type genericType = editor.target.GetType().BaseType;
8065

81-
return targets.Length == 1
82-
? GetOneTitle(genericType)
83-
: GetMixedTitle(genericType);
66+
return editor.targets.Length == 1
67+
? GetOneTitle(genericType, editor.target)
68+
: GetMixedTitle(genericType, editor.targets);
8469
}
8570

86-
private string GetOneTitle(Type genericType)
71+
private static string GetOneTitle(Type genericType, Object target)
8772
{
8873
if (genericType?.IsGenericType != true)
8974
return ObjectNames.GetInspectorTitle(target);
90-
91-
var targetInfo = new TargetInfo(target);
9275

93-
if (_targetTitlesCache.TryGetValue(targetInfo, out string title))
76+
if (_targetTitlesCache.TryGetValue(target, out string title))
9477
return title;
9578

9679
string typeName = GetGenericTypeName(genericType);
@@ -100,14 +83,14 @@ private string GetOneTitle(Type genericType)
10083
return $"({typeName})";
10184

10285
title = $"{ObjectNames.NicifyVariableName(target.name)} ({typeName})";
103-
_targetTitlesCache.Add(targetInfo, title);
86+
_targetTitlesCache.Add(target, title);
10487
return title;
10588
}
10689

107-
private string GetMixedTitle(Type genericType)
90+
private static string GetMixedTitle(Type genericType, Object[] targets)
10891
{
10992
if (genericType?.IsGenericType != true)
110-
return targets.Length + " " + ObjectNames.NicifyVariableName(GetTypeName(target)) + "s";
93+
return targets.Length + " " + ObjectNames.NicifyVariableName(GetTypeName(targets[0])) + "s";
11194

11295
return $"{targets.Length} objects of type {GetGenericTypeName(genericType)}";
11396
}
@@ -122,39 +105,4 @@ private static string GetGenericTypeName(Type genericType)
122105
return typeName;
123106
}
124107
}
125-
126-
internal readonly struct TargetInfo : IEquatable<TargetInfo>
127-
{
128-
public readonly Object Target;
129-
public readonly string Name;
130-
131-
public TargetInfo(Object target)
132-
{
133-
Target = target;
134-
Name = target.name;
135-
}
136-
137-
public override bool Equals(object obj)
138-
{
139-
return obj is TargetInfo info && Equals(info);
140-
}
141-
142-
public bool Equals(TargetInfo p)
143-
{
144-
return (Target == p.Target) && (Name == p.Name);
145-
}
146-
147-
public override int GetHashCode()
148-
{
149-
int hash = 17;
150-
// ReSharper disable once Unity.NoNullPropagation
151-
hash = hash * 23 + Target?.GetHashCode() ?? 0;
152-
hash = hash * 23 + Name.GetHashCode();
153-
return hash;
154-
}
155-
156-
public static bool operator ==(TargetInfo lhs, TargetInfo rhs) => lhs.Equals(rhs);
157-
158-
public static bool operator !=(TargetInfo lhs, TargetInfo rhs) => ! lhs.Equals(rhs);
159-
}
160108
}
File renamed without changes.

Editor/Drawers/GenericScriptableObjectEditor.cs

Lines changed: 0 additions & 83 deletions
This file was deleted.

Editor/Drawers/GenericUnityObjectHelper.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
namespace GenericUnityObjects.Editor
22
{
33
using System;
4+
using GenericUnityObjects.Util;
45
using SolidUtilities.Editor;
56
using UnityEditor;
67
using UnityEngine;
@@ -21,7 +22,12 @@ public class GenericUnityObjectHelper
2122
/// <param name="target">Target object of custom editor.</param>
2223
public GenericUnityObjectHelper(Object target)
2324
{
24-
_genericType = target.GetType().BaseType;
25+
var targetType = target.GetType();
26+
27+
if (!targetType.FullName.StartsWith(Config.ConcreteClassNamespace))
28+
return;
29+
30+
_genericType = targetType.BaseType;
2531

2632
if (_genericType?.IsGenericType != true)
2733
return;
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
namespace GenericUnityObjects.Editor
2+
{
3+
using UnityEditor;
4+
using UnityEngine;
5+
6+
#if ! DISABLE_GENERIC_OBJECT_EDITOR
7+
[CanEditMultipleObjects]
8+
[CustomEditor(typeof(ScriptableObject), true)]
9+
#endif
10+
public class ScriptableObjectEditor : UnityObjectEditor { }
11+
}
File renamed without changes.
Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
namespace GenericUnityObjects.Editor
22
{
33
using System.Reflection;
4+
using MissingScriptType.Editor;
45
using UnityEditor;
6+
using UnityEditor.Callbacks;
57
using UnityEngine;
68

79
#if EASY_BUTTONS
@@ -17,25 +19,29 @@
1719
#if ! DISABLE_GENERIC_OBJECT_EDITOR
1820
[CanEditMultipleObjects]
1921
[CustomEditor(typeof(MonoBehaviour), true)]
20-
[InitializeOnLoad]
2122
#endif
22-
public class MonoBehaviourEditor :
23+
public class UnityObjectEditor :
2324
#if ODIN_INSPECTOR
2425
OdinEditor
2526
#else
2627
Editor
2728
#endif
2829
{
29-
#if ODIN_INSPECTOR
30-
static MonoBehaviourEditor()
30+
#if ODIN_INSPECTOR && ! DISABLE_GENERIC_OBJECT_EDITOR
31+
[DidReloadScripts(1)]
32+
private static void OnScriptsReload()
3133
{
3234
// a workaround for bug https://bitbucket.org/sirenix/odin-inspector/issues/833/customeditor-with-editorforchildclasses
3335
var odinEditorTypeField = typeof(InspectorTypeDrawingConfig).GetField("odinEditorType", BindingFlags.Static | BindingFlags.NonPublic);
34-
odinEditorTypeField.SetValue(null, typeof(MonoBehaviourEditor));
36+
odinEditorTypeField.SetValue(null, typeof(UnityObjectEditor));
3537
}
3638
#endif
3739

3840
private GenericUnityObjectHelper _helper;
41+
42+
#if MISSING_SCRIPT_TYPE
43+
private MissingScriptTypeUtility _missingScriptUtility;
44+
#endif
3945

4046
#if EASY_BUTTONS
4147
private ButtonsDrawer _buttonsDrawer;
@@ -52,11 +58,24 @@ void OnEnable()
5258
#endif
5359

5460
_helper = new GenericUnityObjectHelper(target);
61+
62+
#if MISSING_SCRIPT_TYPE
63+
try
64+
{
65+
_missingScriptUtility = new MissingScriptTypeUtility(serializedObject);
66+
}
67+
catch { }
68+
#endif
5569

5670
#if EASY_BUTTONS
5771
_buttonsDrawer = new ButtonsDrawer(target);
5872
#endif
5973
}
74+
75+
protected override void OnHeaderGUI()
76+
{
77+
GenericHeaderUtility.OnHeaderGUI(this);
78+
}
6079

6180
public override void OnInspectorGUI()
6281
{
@@ -101,6 +120,10 @@ private void DrawMissingScript()
101120
{
102121
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_Script"));
103122
}
123+
124+
#if MISSING_SCRIPT_TYPE
125+
_missingScriptUtility?.OnInspectorGUI();
126+
#endif
104127
}
105128
}
106129
}
File renamed without changes.

0 commit comments

Comments
 (0)