Skip to content

Commit 6133ba4

Browse files
committed
Use workaround for propertyFields
1 parent 736c37d commit 6133ba4

File tree

9 files changed

+176
-90
lines changed

9 files changed

+176
-90
lines changed

.vsconfig

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"version": "1.0",
3+
"components": [
4+
"Microsoft.VisualStudio.Workload.ManagedGame"
5+
]
6+
}

Assets/com.alelievr.NodeGraphProcessor/Editor/GraphInspector.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,16 @@ protected virtual void OnEnable()
2020
graph = target as BaseGraph;
2121
graph.onExposedParameterListChanged += UpdateExposedParameters;
2222
graph.onExposedParameterModified += UpdateExposedParameters;
23-
exposedParameterFactory = new ExposedParameterFieldFactory(graph);
23+
if (exposedParameterFactory == null)
24+
exposedParameterFactory = new ExposedParameterFieldFactory(graph);
2425
}
2526

2627
protected virtual void OnDisable()
2728
{
2829
graph.onExposedParameterListChanged -= UpdateExposedParameters;
2930
graph.onExposedParameterModified -= UpdateExposedParameters;
3031
exposedParameterFactory.Dispose();
32+
exposedParameterFactory = null;
3133
}
3234

3335
public sealed override VisualElement CreateInspectorGUI()
@@ -52,13 +54,9 @@ protected void FillExposedParameters(VisualElement parameterContainer)
5254
if (graph.exposedParameters.Count != 0)
5355
parameterContainer.Add(new Label("Exposed Parameters:"));
5456

55-
SerializedObject so = new SerializedObject(graph);
56-
var exposedParameters = so.FindProperty(nameof(graph.exposedParameters));
57-
5857
foreach (var param in graph.exposedParameters)
5958
{
6059
var field = exposedParameterFactory.GetParameterValueField(param, (newValue) => {
61-
Debug.Log("changed: " + param.value + " => " + newValue);
6260
param.value = newValue;
6361
serializedObject.ApplyModifiedProperties();
6462
graph.NotifyExposedParameterValueChanged(param);

Assets/com.alelievr.NodeGraphProcessor/Editor/Utils/ExposedParameterDrawer.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,11 @@ protected VisualElement CreateValProperty(SerializedProperty property, string di
3737
protected SerializedProperty GetNameProperty(SerializedProperty property) => property.FindPropertyRelative(nameof(ExposedParameter.name));
3838

3939
protected void ApplyModifiedProperties(SerializedProperty property)
40-
=> property.serializedObject.ApplyModifiedProperties();
40+
{
41+
property.serializedObject.ApplyModifiedProperties();
42+
property.serializedObject.Update();
43+
property.serializedObject.ApplyModifiedProperties();
44+
}
4145
}
4246

4347
[CustomPropertyDrawer(typeof(FloatParameter))]
@@ -144,7 +148,7 @@ protected VisualElement CreateHideInInspectorField(SerializedProperty settingsPr
144148
return p;
145149
}
146150

147-
protected static BaseGraph GetGraph(SerializedProperty property) => property.serializedObject.targetObject as BaseGraph;
151+
protected static BaseGraph GetGraph(SerializedProperty property) => property.serializedObject.FindProperty("graph").objectReferenceValue as BaseGraph;
148152
protected static ExposedParameter GetParameter(SerializedProperty settingsProperty)
149153
{
150154
var guid = settingsProperty.FindPropertyRelative(nameof(ExposedParameter.Settings.guid)).stringValue;

Assets/com.alelievr.NodeGraphProcessor/Editor/Views/BaseGraphView.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,12 @@ public class BaseGraphView : GraphView, IDisposable
116116
[NonSerialized]
117117
protected NodeInspectorObject nodeInspector;
118118

119+
/// <summary>
120+
/// Workaround object for creating exposed parameter property fields.
121+
/// </summary>
122+
public ExposedParameterFieldFactory exposedParameterFactory { get; private set; }
123+
119124
public SerializedObject serializedGraph { get; private set; }
120-
public SerializedProperty serializedNodes { get; private set; }
121-
public SerializedProperty serializedParameters { get; private set; }
122125

123126
public BaseGraphView(EditorWindow window)
124127
{
@@ -666,6 +669,8 @@ public void Initialize(BaseGraph graph)
666669

667670
this.graph = graph;
668671

672+
exposedParameterFactory = new ExposedParameterFieldFactory(graph);
673+
669674
UpdateSerializedProperties();
670675

671676
connectorListener = CreateEdgeConnectorListener();
@@ -706,8 +711,6 @@ public void ClearGraphElements()
706711
void UpdateSerializedProperties()
707712
{
708713
serializedGraph = new SerializedObject(graph);
709-
serializedNodes = serializedGraph.FindProperty(nameof(BaseGraph.nodes));
710-
serializedParameters = serializedGraph.FindProperty(nameof(BaseGraph.exposedParameters));
711714
}
712715

713716
/// <summary>
@@ -1286,6 +1289,7 @@ public void Dispose()
12861289
Undo.undoRedoPerformed -= ReloadView;
12871290
Object.DestroyImmediate(nodeInspector);
12881291
NodeProvider.UnloadGraph(graph);
1292+
exposedParameterFactory.Dispose();
12891293
}
12901294

12911295
#endregion

Assets/com.alelievr.NodeGraphProcessor/Editor/Views/ExposedParameterFieldFactory.cs

Lines changed: 60 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using UnityEngine;
22
using UnityEditor;
33
using UnityEditor.UIElements;
4+
using UnityEngine.UIElements;
45
using System;
56
using System.Collections.Generic;
67

@@ -21,11 +22,6 @@ public class ExposedParameterWorkaround : ScriptableObject
2122
[SerializeReference]
2223
public List<ExposedParameter> parameters = new List<ExposedParameter>();
2324
public BaseGraph graph;
24-
25-
public ExposedParameterWorkaround()
26-
{
27-
Debug.Log("re-create workaround");
28-
}
2925
}
3026

3127
BaseGraph graph;
@@ -34,38 +30,84 @@ public ExposedParameterWorkaround()
3430
SerializedObject serializedObject;
3531
SerializedProperty serializedParameters;
3632

37-
public ExposedParameterFieldFactory(BaseGraph graph)
33+
Dictionary<ExposedParameter, object> oldParameterValues = new Dictionary<ExposedParameter, object>();
34+
Dictionary<ExposedParameter, ExposedParameter.Settings> oldParameterSettings = new Dictionary<ExposedParameter, ExposedParameter.Settings>();
35+
36+
public ExposedParameterFieldFactory(BaseGraph graph, List<ExposedParameter> customParameters = null)
3837
{
3938
this.graph = graph;
4039

4140
exposedParameterObject = ScriptableObject.CreateInstance<ExposedParameterWorkaround>();
4241
exposedParameterObject.graph = graph;
4342
serializedObject = new SerializedObject(exposedParameterObject);
44-
serializedParameters = serializedObject.FindProperty(nameof(ExposedParameterWorkaround.parameters));
45-
UpdateSerializedProperties();
43+
UpdateSerializedProperties(customParameters);
4644
}
4745

48-
void UpdateSerializedProperties()
46+
public void UpdateSerializedProperties(List<ExposedParameter> parameters = null)
4947
{
50-
exposedParameterObject.parameters = graph.exposedParameters;
48+
if (parameters != null)
49+
exposedParameterObject.parameters = parameters;
50+
else
51+
exposedParameterObject.parameters = graph.exposedParameters;
5152
serializedObject.Update();
5253
serializedParameters = serializedObject.FindProperty(nameof(ExposedParameterWorkaround.parameters));
53-
Debug.Log(serializedParameters.arraySize);
5454
}
5555

56-
public PropertyField GetParameterValueField(ExposedParameter parameter, Action<object> valueChangedCallback)
56+
public VisualElement GetParameterValueField(ExposedParameter parameter, Action<object> valueChangedCallback)
5757
{
5858
serializedObject.Update();
5959
int propIndex = FindPropertyIndex(parameter);
6060
var field = new PropertyField(serializedParameters.GetArrayElementAtIndex(propIndex));
61-
62-
field.schedule.Execute(() => {
63-
if (!parameter.value.Equals(exposedParameterObject.parameters[propIndex].value))
64-
valueChangedCallback(exposedParameterObject.parameters[propIndex].value);
65-
}).Every(50);
6661
field.Bind(serializedObject);
6762

68-
return field;
63+
VisualElement view = new VisualElement();
64+
view.Add(field);
65+
66+
oldParameterValues[parameter] = parameter.value;
67+
view.Add(new IMGUIContainer(() =>
68+
{
69+
if (oldParameterValues.TryGetValue(parameter, out var value))
70+
{
71+
if (parameter.value != null && !parameter.value.Equals(value))
72+
valueChangedCallback(parameter.value);
73+
}
74+
oldParameterValues[parameter] = parameter.value;
75+
}));
76+
77+
return view;
78+
}
79+
80+
public VisualElement GetParameterSettingsField(ExposedParameter parameter, Action<object> valueChangedCallback)
81+
{
82+
serializedObject.Update();
83+
int propIndex = FindPropertyIndex(parameter);
84+
var serializedParameter = serializedParameters.GetArrayElementAtIndex(propIndex);
85+
var serializedSettings = serializedParameter.FindPropertyRelative(nameof(ExposedParameter.settings));
86+
var settingsField = new PropertyField(serializedSettings);
87+
settingsField.Bind(serializedObject);
88+
89+
VisualElement view = new VisualElement();
90+
view.Add(settingsField);
91+
92+
// TODO: see if we can replace this with an event
93+
oldParameterSettings[parameter] = parameter.settings;
94+
view.Add(new IMGUIContainer(() =>
95+
{
96+
if (oldParameterSettings.TryGetValue(parameter, out var settings))
97+
{
98+
if (!settings.Equals(parameter.settings))
99+
valueChangedCallback(parameter.settings);
100+
}
101+
oldParameterSettings[parameter] = parameter.settings;
102+
}));
103+
104+
return view;
105+
}
106+
107+
public void ResetOldParameter(ExposedParameter parameter)
108+
{
109+
oldParameterValues.Remove(parameter);
110+
oldParameterSettings.Remove(parameter);
69111
}
70112

71113
int FindPropertyIndex(ExposedParameter param) => exposedParameterObject.parameters.FindIndex(p => p == param);

Assets/com.alelievr.NodeGraphProcessor/Editor/Views/ExposedParameterPropertyView.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,15 @@ public class ExposedParameterPropertyView : VisualElement
1313

1414
public Toggle hideInInspector { get; private set; }
1515

16-
public ExposedParameterPropertyView(BaseGraphView graphView, ExposedParameter param, SerializedProperty serializedParam)
16+
public ExposedParameterPropertyView(BaseGraphView graphView, ExposedParameter param)
1717
{
1818
baseGraphView = graphView;
1919
parameter = param;
2020

21-
var settings = serializedParam.FindPropertyRelative("settings");
21+
var field = graphView.exposedParameterFactory.GetParameterSettingsField(param, (newValue) => {
22+
param.settings = newValue as ExposedParameter.Settings;
23+
});
2224

23-
var field = new PropertyField(settings);
24-
field.Bind(serializedParam.serializedObject);
2525
Add(field);
2626
}
2727
}

Assets/com.alelievr.NodeGraphProcessor/Editor/Views/ExposedParameterView.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,9 @@ protected virtual void UpdateParameterList()
7676
{
7777
content.Clear();
7878

79-
for (int i = 0; i < graphView.serializedParameters.arraySize; i++)
79+
foreach (var param in graphView.graph.exposedParameters)
8080
{
81-
var param = graphView.graph.exposedParameters[i];
82-
var serializedParam = graphView.serializedParameters.GetArrayElementAtIndex(i);
83-
84-
var row = new BlackboardRow(new ExposedParameterFieldView(graphView, param), new ExposedParameterPropertyView(graphView, param, serializedParam));
81+
var row = new BlackboardRow(new ExposedParameterFieldView(graphView, param), new ExposedParameterPropertyView(graphView, param));
8582
row.expanded = param.settings.expanded;
8683
row.RegisterCallback<GeometryChangedEvent>(e => {
8784
param.settings.expanded = row.expanded;

Assets/com.alelievr.NodeGraphProcessor/Runtime/Elements/ExposedParameter.cs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,19 @@ public class Settings
1515

1616
[SerializeField]
1717
internal string guid = null;
18+
19+
public override bool Equals(object obj)
20+
{
21+
if (obj is Settings s && s != null)
22+
return Equals(s);
23+
else
24+
return false;
25+
}
26+
27+
public virtual bool Equals(Settings param)
28+
=> isHidden == param.isHidden && expanded == param.expanded;
29+
30+
public override int GetHashCode() => base.GetHashCode();
1831
}
1932

2033
public string guid; // unique id to keep track of the parameter
@@ -116,6 +129,19 @@ public override bool Equals(object obj)
116129
}
117130

118131
public override int GetHashCode() => guid.GetHashCode();
132+
133+
public ExposedParameter Clone()
134+
{
135+
var clonedParam = Activator.CreateInstance(GetType()) as ExposedParameter;
136+
137+
clonedParam.guid = guid;
138+
clonedParam.name = name;
139+
clonedParam.input = input;
140+
clonedParam.settings = settings;
141+
clonedParam.value = value;
142+
143+
return clonedParam;
144+
}
119145
}
120146

121147
// Due to polymorphic constraints with [SerializeReference] we need to explicitly create a class for
@@ -133,6 +159,9 @@ public enum ColorMode
133159
public class ColorSettings : Settings
134160
{
135161
public ColorMode mode;
162+
163+
public override bool Equals(Settings param)
164+
=> base.Equals(param) && mode == ((ColorSettings)param).mode;
136165
}
137166

138167
[SerializeField] Color val;
@@ -156,6 +185,9 @@ public class FloatSettings : Settings
156185
public FloatMode mode;
157186
public float min = 0;
158187
public float max = 1;
188+
189+
public override bool Equals(Settings param)
190+
=> base.Equals(param) && mode == ((FloatSettings)param).mode && min == ((FloatSettings)param).min && max == ((FloatSettings)param).max;
159191
}
160192

161193
[SerializeField] float val;
@@ -177,6 +209,9 @@ public enum Vector2Mode
177209
public class Vector2Settings : Settings
178210
{
179211
public Vector2Mode mode;
212+
213+
public override bool Equals(Settings param)
214+
=> base.Equals(param) && mode == ((Vector2Settings)param).mode;
180215
}
181216

182217
[SerializeField] Vector2 val;
@@ -216,6 +251,9 @@ public class IntSettings : Settings
216251
public IntMode mode;
217252
public int min;
218253
public int max;
254+
255+
public override bool Equals(Settings param)
256+
=> base.Equals(param) && mode == ((IntSettings)param).mode && min == ((IntSettings)param).min && max == ((IntSettings)param).max;
219257
}
220258

221259
[SerializeField] int val;
@@ -319,6 +357,9 @@ public enum GradientColorMode
319357
public class GradientSettings : Settings
320358
{
321359
public GradientColorMode mode;
360+
361+
public override bool Equals(Settings param)
362+
=> base.Equals(param) && mode == ((GradientSettings)param).mode;
322363
}
323364

324365
[SerializeField] Gradient val;

0 commit comments

Comments
 (0)