Skip to content

Commit d2b4abb

Browse files
author
David Kutschke
committed
Added support for readonly fields
1 parent 12bd2d8 commit d2b4abb

20 files changed

+288
-0
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using System;
2+
3+
namespace RuntimeInspectorNamespace
4+
{
5+
[AttributeUsage( AttributeTargets.Field, Inherited = false, AllowMultiple = false )]
6+
public class RuntimeInspectorReadonlyAttribute : Attribute
7+
{
8+
private readonly InspectorField.IsReadonlyGetter m_getter = () => true;
9+
public InspectorField.IsReadonlyGetter Getter { get { return m_getter; } }
10+
11+
public RuntimeInspectorReadonlyAttribute() {}
12+
13+
public RuntimeInspectorReadonlyAttribute( Type classAroundMethod, string methodName )
14+
{
15+
var getter = Delegate.CreateDelegate(
16+
type: typeof( InspectorField.IsReadonlyGetter ),
17+
target: classAroundMethod,
18+
method: methodName,
19+
ignoreCase: false,
20+
throwOnBindFailure: false );
21+
22+
if( getter is InspectorField.IsReadonlyGetter readonlyGetter )
23+
m_getter = readonlyGetter;
24+
}
25+
}
26+
}

Plugins/RuntimeInspector/Scripts/RuntimeInspector/Attributes/RuntimeInspectorReadonlyAttribute.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.

Plugins/RuntimeInspector/Scripts/RuntimeInspector/Fields/ArrayField.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ protected override void GenerateElements()
141141
( (ExpandableInspectorField) elementDrawer ).IsExpanded = true;
142142

143143
elementDrawer.NameRaw = Inspector.ArrayIndicesStartAtOne ? ( ( i + 1 ) + ":" ) : ( i + ":" );
144+
elementDrawer.IsInteractable = IsInteractable;
144145
elements.Add( elementDrawer );
145146
}
146147
}
@@ -165,6 +166,7 @@ protected override void GenerateElements()
165166
if( i < elementsExpandedStates.Count && elementsExpandedStates[i] && elementDrawer is ExpandableInspectorField )
166167
( (ExpandableInspectorField) elementDrawer ).IsExpanded = true;
167168

169+
elementDrawer.IsInteractable = IsInteractable;
168170
elements.Add( elementDrawer );
169171
}
170172
}
@@ -318,5 +320,13 @@ private object GetTemplateElement( object value )
318320

319321
return template;
320322
}
323+
324+
protected override void OnIsInteractableChanged()
325+
{
326+
base.OnIsInteractableChanged();
327+
sizeInput.BackingField.interactable = IsInteractable;
328+
sizeInput.BackingField.textComponent.color = this.GetTextColor();
329+
sizeText.color = this.GetTextColor();
330+
}
321331
}
322332
}

Plugins/RuntimeInspector/Scripts/RuntimeInspector/Fields/BoolField.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,5 +48,12 @@ public override void Refresh()
4848
base.Refresh();
4949
input.isOn = (bool) Value;
5050
}
51+
52+
protected override void OnIsInteractableChanged()
53+
{
54+
base.OnIsInteractableChanged();
55+
input.interactable = IsInteractable;
56+
input.graphic.color = this.GetTextColor();
57+
}
5158
}
5259
}

Plugins/RuntimeInspector/Scripts/RuntimeInspector/Fields/BoundsField.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,13 @@ protected override void OnDepthChanged()
8686
inputExtents.Depth = Depth + 1;
8787
}
8888

89+
protected override void OnIsInteractableChanged()
90+
{
91+
base.OnIsInteractableChanged();
92+
inputCenter.IsInteractable = IsInteractable;
93+
inputExtents.IsInteractable = IsInteractable;
94+
}
95+
8996
public override void Refresh()
9097
{
9198
base.Refresh();

Plugins/RuntimeInspector/Scripts/RuntimeInspector/Fields/ColorField.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ protected override void OnBound( MemberInfo variable )
4040

4141
private void ShowColorPicker( PointerEventData eventData )
4242
{
43+
if( !IsInteractable )
44+
return;
45+
4346
Color value = isColor32 ? (Color) (Color32) Value : (Color) Value;
4447

4548
ColorPicker.Instance.Skin = Inspector.Skin;

Plugins/RuntimeInspector/Scripts/RuntimeInspector/Fields/EnumField.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,5 +160,13 @@ public override void Refresh()
160160
if( valueIndex != -1 )
161161
input.value = valueIndex;
162162
}
163+
164+
protected override void OnIsInteractableChanged()
165+
{
166+
base.OnIsInteractableChanged();
167+
input.interactable = IsInteractable;
168+
input.captionText.color = this.GetTextColor();
169+
dropdownArrow.color = this.GetTextColor();
170+
}
163171
}
164172
}

Plugins/RuntimeInspector/Scripts/RuntimeInspector/Fields/ExposedMethodField.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ protected override void OnDepthChanged()
3535
( (RectTransform) invokeButton.transform ).sizeDelta = new Vector2( -Skin.IndentAmount * Depth, 0f );
3636
}
3737

38+
protected override void OnIsInteractableChanged()
39+
{
40+
base.OnIsInteractableChanged();
41+
invokeButton.interactable = IsInteractable;
42+
}
43+
3844
public void SetBoundMethod( ExposedMethod boundMethod )
3945
{
4046
this.boundMethod = boundMethod;

Plugins/RuntimeInspector/Scripts/RuntimeInspector/Fields/InspectorField.cs

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ public abstract class InspectorField : MonoBehaviour, ITooltipContent
1111
public delegate object Getter();
1212
public delegate void Setter( object value );
1313

14+
public delegate bool IsReadonlyGetter();
15+
1416
#pragma warning disable 0649
1517
[SerializeField]
1618
protected LayoutElement layoutElement;
@@ -88,6 +90,43 @@ public int Depth
8890
private bool m_isVisible = true;
8991
public bool IsVisible { get { return m_isVisible; } }
9092

93+
private bool m_isInteractableSelf = true;
94+
private bool m_isInteractableInHierarchy = true;
95+
96+
public bool IsInteractable
97+
{
98+
get { return m_isInteractableInHierarchy && m_isInteractableSelf; }
99+
set { IsInteractableInHierarchy = value; }
100+
}
101+
102+
protected bool IsInteractableInHierarchy
103+
{
104+
get { return m_isInteractableInHierarchy; }
105+
set
106+
{
107+
bool oldValue = IsInteractable;
108+
m_isInteractableInHierarchy = value;
109+
if (oldValue != IsInteractable)
110+
{
111+
OnIsInteractableChanged();
112+
}
113+
}
114+
}
115+
116+
protected bool IsInteractableSelf
117+
{
118+
get { return m_isInteractableSelf; }
119+
set
120+
{
121+
bool oldValue = IsInteractable;
122+
m_isInteractableSelf = value;
123+
if (oldValue != IsInteractable)
124+
{
125+
OnIsInteractableChanged();
126+
}
127+
}
128+
}
129+
91130
public string Name
92131
{
93132
get { if( variableNameText ) return variableNameText.text; return string.Empty; }
@@ -109,6 +148,7 @@ public string NameRaw
109148

110149
private Getter getter;
111150
private Setter setter;
151+
private IsReadonlyGetter isReadonlyGetter;
112152

113153
public virtual void Initialize()
114154
{
@@ -175,6 +215,10 @@ public void BindTo( Type variableType, string variableName, Getter getter, Sette
175215
this.getter = getter;
176216
this.setter = setter;
177217

218+
var attr = variable?.GetCustomAttribute<RuntimeInspectorReadonlyAttribute>();
219+
if( attr != null )
220+
isReadonlyGetter = attr.Getter;
221+
178222
OnBound( variable );
179223
}
180224

@@ -247,6 +291,17 @@ public virtual void Refresh()
247291
RefreshValue();
248292
}
249293

294+
protected virtual void OnIsInteractableChanged()
295+
{
296+
if( variableNameText )
297+
{
298+
if( IsInteractable )
299+
variableNameText.color = Skin.TextColor;
300+
else
301+
variableNameText.color = Skin.InactiveTextColor;
302+
}
303+
}
304+
250305
private void RefreshValue()
251306
{
252307
try
@@ -264,6 +319,16 @@ private void RefreshValue()
264319
else
265320
m_value = null;
266321
}
322+
323+
if( isReadonlyGetter != null )
324+
{
325+
try
326+
{
327+
IsInteractableSelf = !isReadonlyGetter();
328+
}
329+
catch
330+
{}
331+
}
267332
}
268333
}
269334

@@ -429,6 +494,13 @@ protected override void OnDepthChanged()
429494
elements[i].Depth = Depth + 1;
430495
}
431496

497+
protected override void OnIsInteractableChanged()
498+
{
499+
base.OnIsInteractableChanged();
500+
for( int i = 0; i < elements.Count; i++ )
501+
elements[i].IsInteractable = IsInteractable;
502+
}
503+
432504
protected void RegenerateElements()
433505
{
434506
if( elements.Count > 0 || exposedMethods.Count > 0 )
@@ -501,6 +573,7 @@ public InspectorField CreateDrawerForComponent( Component component, string vari
501573
variableName = component.GetType().Name + " component";
502574

503575
variableDrawer.BindTo( component.GetType(), string.Empty, () => component, ( value ) => { } );
576+
variableDrawer.IsInteractable = IsInteractable;
504577
variableDrawer.NameRaw = variableName;
505578

506579
elements.Add( variableDrawer );
@@ -531,6 +604,7 @@ public InspectorField CreateDrawer( Type variableType, string variableName, Gett
531604
if( variableDrawer != null )
532605
{
533606
variableDrawer.BindTo( variableType, variableName == null ? null : string.Empty, getter, setter );
607+
variableDrawer.IsInteractable = IsInteractable;
534608
if( variableName != null )
535609
variableDrawer.NameRaw = variableName;
536610

Plugins/RuntimeInspector/Scripts/RuntimeInspector/Fields/NumberField.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,5 +86,12 @@ public override void Refresh()
8686
if( !numberHandler.ValuesAreEqual( Value, prevVal ) )
8787
input.Text = numberHandler.ToString( Value );
8888
}
89+
90+
protected override void OnIsInteractableChanged()
91+
{
92+
base.OnIsInteractableChanged();
93+
input.BackingField.interactable = IsInteractable;
94+
input.BackingField.textComponent.color = this.GetTextColor();
95+
}
8996
}
9097
}

0 commit comments

Comments
 (0)