Skip to content

Commit ec8db36

Browse files
committed
Refactor some syntax.
Disable updating when component is foldout. Attempt to refresh when the play mode is changed.
1 parent 5156ee7 commit ec8db36

File tree

9 files changed

+48
-38
lines changed

9 files changed

+48
-38
lines changed

UInspectorPlus/ComponentMethodDrawer.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ internal class ComponentMethodDrawer: IReflectorDrawer, IDisposable {
3434
public GenericMenu.MenuFunction OnClose;
3535

3636
public bool ShouldDrawHeader {
37-
get { return drawHeader; }
37+
get => drawHeader;
3838
set {
3939
drawHeader = value;
4040
paramsFolded &= value;
@@ -47,15 +47,15 @@ public bool ShouldDrawHeader {
4747
public object Value => result?.Value;
4848

4949
public bool AllowPrivateFields {
50-
get { return privateFields; }
50+
get => privateFields;
5151
set {
5252
privateFields = value;
5353
InitComponentMethods(false);
5454
}
5555
}
5656

5757
public bool AllowObsolete {
58-
get { return obsolete; }
58+
get => obsolete;
5959
set {
6060
obsolete = value;
6161
InitComponentMethods(false);

UInspectorPlus/Helpers.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,9 @@ private static MethodInfo FindMethod(Type fromType, string methodName, Type dele
616616
);
617617
}
618618

619+
// Special checker to deal with "null" UnityEngine.Object (Internally null, but still exists in Mono heap)
620+
internal static bool IsInvalid(object obj) => obj is UnityObject uObj ? uObj == null : obj == null;
621+
619622
public static IEnumerable<Type> LooseGetTypes(Assembly assembly) {
620623
for(int retries = 0; retries < 2; retries++)
621624
try {

UInspectorPlus/HexEdit.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
namespace UInspectorPlus {
77
internal class HexEdit: InspectorDrawer {
88
[SerializeField] private Vector2 scrollPos;
9-
public byte[] Data { get => target as byte[]; }
9+
public byte[] Data => target as byte[];
1010
public int columns = 16;
1111
private GUIContent temp = new GUIContent();
1212

UInspectorPlus/InspectorChildWindow.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,7 @@ private void OnGUI() {
5151
GUILayout.EndScrollView();
5252
}
5353

54-
private void OnDestroy() {
55-
drawer.Dispose();
56-
}
54+
private void OnDestroy() => drawer.Dispose();
5755

5856
private void OnInspectorUpdate() {
5957
if(EditorGUIUtility.editingTextField)

UInspectorPlus/InspectorDrawer.cs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public static InspectorDrawer GetDrawer(object target, Type targetType, bool sho
5959
public InspectorDrawer(object target, Type targetType, bool shown, bool showProps, bool showPrivateFields, bool showObsolete, bool showMethods) {
6060
this.target = target;
6161
BindingFlags flag = BindingFlags.Static | BindingFlags.Public;
62-
if(target != null)
62+
if(!Helper.IsInvalid(target))
6363
flag |= BindingFlags.Instance;
6464
if(allowPrivate = showPrivateFields)
6565
flag |= BindingFlags.NonPublic;
@@ -104,7 +104,7 @@ public InspectorDrawer(object target, Type targetType, bool shown, bool showProp
104104
AddMethodMenu();
105105
foreach(var d in drawer)
106106
d.OnRequireRedraw += RequireRedraw;
107-
if(target != null)
107+
if(!Helper.IsInvalid(target))
108108
this.shown = Helper.GetState(target, shown);
109109
}
110110

@@ -120,7 +120,7 @@ private void AddMethodMenu() {
120120
public void Draw(bool drawHeader = true, bool readOnly = false) {
121121
if(drawHeader) {
122122
shown = EditorGUILayout.InspectorTitlebar(shown, target as UnityObject);
123-
if(target != null)
123+
if(!Helper.IsInvalid(target))
124124
Helper.StoreState(target, shown);
125125
if(!shown)
126126
return;
@@ -142,9 +142,7 @@ public void Draw(bool drawHeader = true, bool readOnly = false) {
142142

143143
protected virtual void Draw(bool readOnly) {
144144
foreach(var item in drawer) {
145-
var methodDrawer = item as ComponentMethodDrawer;
146-
var fieldDrawer = item as MethodPropertyDrawer;
147-
if(methodDrawer != null) {
145+
if(item is ComponentMethodDrawer methodDrawer) {
148146
EditorGUI.indentLevel--;
149147
EditorGUILayout.BeginHorizontal();
150148
EditorGUILayout.LabelField(GUIContent.none, GUILayout.Width(EditorGUIUtility.singleLineHeight));
@@ -157,7 +155,7 @@ protected virtual void Draw(bool readOnly) {
157155
} else if(item != null) {
158156
if(item.Info != null && !string.IsNullOrEmpty(searchText) && item.Info.Name.IndexOf(searchText, StringComparison.CurrentCultureIgnoreCase) < 0)
159157
continue;
160-
if(fieldDrawer != null)
158+
if(item is MethodPropertyDrawer fieldDrawer)
161159
fieldDrawer.Draw(readOnly);
162160
else
163161
item.Draw();
@@ -184,8 +182,8 @@ private void DrawRequestRefs() {
184182
if(removal != null) MethodPropertyDrawer.drawerRequestingReferences.Remove(removal);
185183
}
186184

187-
public void UpdateValues(bool updateProps) {
188-
if(target == null) return;
185+
public virtual void UpdateValues(bool updateProps) {
186+
if(Helper.IsInvalid(target)) return;
189187
foreach(var drawerItem in drawer) {
190188
var propDrawer = drawerItem as MethodPropertyDrawer;
191189
if(propDrawer == null)
@@ -205,7 +203,7 @@ public virtual void Dispose() {
205203
}
206204

207205
protected void RequireRedraw() {
208-
if(target != null && OnRequireRedraw != null)
206+
if(!Helper.IsInvalid(target) && OnRequireRedraw != null)
209207
OnRequireRedraw();
210208
}
211209
}

UInspectorPlus/InspectorPlus.cs

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,9 @@ private void OnEnable() {
3636
typeMatcher.OnRequestRedraw += Repaint;
3737
}
3838

39-
private void OnDisable() {
40-
typeMatcher.OnRequestRedraw -= Repaint;
41-
}
39+
private void OnDisable() => typeMatcher.OnRequestRedraw -= Repaint;
4240

43-
private void OnDestroy() {
44-
typeMatcher.Dispose();
45-
}
41+
private void OnDestroy() => typeMatcher.Dispose();
4642

4743
private void Initialize() {
4844
if(initialized) return;
@@ -187,13 +183,15 @@ private void UpdateSearchMode() {
187183
EditorPrefs.SetInt("inspectorplus_searchmode", searchMode);
188184
}
189185

190-
private void OnSelectionChange() {
186+
private void OnSelectionChange() => CheckSelection();
187+
188+
private void CheckSelection(bool callFromUpdate = false) {
191189
if(!locked)
192190
instanceIds = Selection.instanceIDs;
193191
var pendingRemoveDrawers = new List<InspectorDrawer[]>();
194192
var pendingAddDrawers = new List<InspectorDrawer[]>();
195193
foreach(var drawer in drawers)
196-
if(drawer.Length <= 0 || drawer[0].target == null || !instanceIds.Contains(Helper.ObjIdOrHashCode(drawer[0].target))) {
194+
if(drawer.Length <= 0 || Helper.IsInvalid(drawer[0].target) || !instanceIds.Contains(Helper.ObjIdOrHashCode(drawer[0].target))) {
197195
pendingRemoveDrawers.Add(drawer);
198196
foreach(var d in drawer) d.Dispose();
199197
}
@@ -202,12 +200,13 @@ private void OnSelectionChange() {
202200
if(drawers.FindIndex(drawer => Helper.ObjIdOrHashCode(drawer[0].target) == instanceID) < 0)
203201
pendingAddDrawers.Add(CreateDrawers(instanceID));
204202
drawers.AddRange(pendingAddDrawers);
205-
UpdateValues();
203+
if(!callFromUpdate)
204+
UpdateValues();
206205
}
207206

208207
private InspectorDrawer[] CreateDrawers(int instanceID) {
209208
var target = EditorUtility.InstanceIDToObject(instanceID);
210-
if(target == null)
209+
if(Helper.IsInvalid(target))
211210
return new InspectorDrawer[0];
212211
var ret = new List<InspectorDrawer>();
213212
try {
@@ -247,13 +246,25 @@ private void IterateDrawers<T>(Action<T> each) where T : IReflectorDrawer {
247246
each(methodDrawer);
248247
}
249248

250-
private void UpdateValues() {
251-
UpdateValues(forceUpdateProps || EditorApplication.isPlaying);
252-
}
249+
private void UpdateValues() => UpdateValues(forceUpdateProps || EditorApplication.isPlaying);
253250

254251
private void UpdateValues(bool updateProps) {
255-
foreach(var drawerGroup in drawers.SelectMany(drawer => drawer))
256-
drawerGroup.UpdateValues(updateProps);
252+
for(int i = 0; i < drawers.Count; i++) {
253+
var drawerGroup = drawers[i];
254+
if(drawerGroup.Length == 0 || Helper.IsInvalid(drawerGroup[0].target)) {
255+
CheckSelection(true);
256+
break;
257+
}
258+
int instanceID = Helper.ObjIdOrHashCode(drawerGroup[0].target);
259+
for(int j = 0; j < drawerGroup.Length; j++) {
260+
if(Helper.IsInvalid(drawerGroup[j].target)) {
261+
drawers[i] = CreateDrawers(instanceID);
262+
break;
263+
}
264+
if(drawerGroup[j].shown)
265+
drawerGroup[j].UpdateValues(updateProps);
266+
}
267+
}
257268
Repaint();
258269
}
259270

UInspectorPlus/ListInspectorDrawer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ protected override void Draw(bool readOnly) {
3737
(target as IList)[i] = arrayContentDrawer[i].Value;
3838
},
3939
drawHeaderCallback = r => GUI.Label(r, target.ToString(), EditorStyles.miniBoldLabel),
40-
onCanAddCallback = l => target != null && !(target as IList).IsFixedSize,
40+
onCanAddCallback = l => !Helper.IsInvalid(target) && !(target as IList).IsFixedSize,
4141
onAddCallback = l => {
4242
ReorderableList.defaultBehaviours.DoAddButton(l);
4343
ListAddItem();

UInspectorPlus/MethodPropertyDrawer.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ private void InitType() {
272272
public void Draw() => Draw(false);
273273

274274
public void Draw(bool readOnly, Rect? rect = null) {
275-
if(target == null && Helper.IsInstanceMember(memberInfo))
275+
if(Helper.IsInvalid(target) && Helper.IsInstanceMember(memberInfo))
276276
return;
277277
readOnly |= isInfoReadonly;
278278
var referenceModeBtn = (!allowReferenceMode && (
@@ -358,7 +358,7 @@ public void Dispose() {
358358
}
359359

360360
private void AddField(UnityObject target) {
361-
if(target == null)
361+
if(Helper.IsInvalid(target))
362362
return;
363363
BindingFlags flag = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public;
364364
if(privateFields)
@@ -627,7 +627,7 @@ private void DrawDirectField(bool readOnly, Rect? rect) {
627627
}
628628

629629
private void DrawUnknownField(bool readOnly, object target, Rect? position = null) {
630-
if(target == null)
630+
if(Helper.IsInvalid(target))
631631
return;
632632
bool clicked;
633633
if(!position.HasValue)

UInspectorPlus/Properties/AssemblyInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,5 @@
3232
// 您可以指定所有的值,或將組建編號或修訂編號設為預設值
3333
//方法是使用 '*',如下所示:
3434
// [assembly: AssemblyVersion("1.0.*")]
35-
[assembly: AssemblyVersion("0.2.0.0")]
36-
[assembly: AssemblyFileVersion("0.2.0.0")]
35+
[assembly: AssemblyVersion("0.5.0.0")]
36+
[assembly: AssemblyFileVersion("0.5.0.0")]

0 commit comments

Comments
 (0)