Skip to content

Commit fb28645

Browse files
committed
Added option to keep values of target when setting parent, changed standard behavior in GUI
1 parent 2b0274b commit fb28645

3 files changed

Lines changed: 27 additions & 12 deletions

File tree

Editor/SOVariant.cs

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,9 @@ public SOVariant(T targetObject)
4040
LoadData(targetObject);
4141
}
4242

43-
public bool SetParent(T parent)
43+
public bool SetParent(T parent, bool setToParentData = true)
4444
{
45-
if (_target is null)
45+
if (_target == null)
4646
return false;
4747

4848
if (parent)
@@ -71,16 +71,19 @@ public bool SetParent(T parent)
7171
RemoveFromChildrenData(AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(_parent)), targetGUID);
7272

7373
this._parent = parent;
74+
_overridden = new List<string>();
7475

7576
if (parent)
7677
{
7778
AddToChildrenData(AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(parent)), targetGUID);
7879

79-
InitialiseNewParent();
80+
if (setToParentData)
81+
InitialiseNewParent();
82+
else
83+
InitialiseNewParentOverrides();
8084
}
8185

82-
_overridden = new List<string>();
83-
SaveData(new List<string>());
86+
SaveData(_overridden);
8487
return true;
8588
}
8689

@@ -241,6 +244,18 @@ private void InitialiseNewParent()
241244
}
242245
}
243246

247+
private void InitialiseNewParentOverrides()
248+
{
249+
foreach (FieldInfo fieldInfo in FieldInfoHelper.GetAllFields(_parent.GetType()))
250+
{
251+
object parentValue = FieldInfoHelper.GetFieldRecursively(_parent.GetType(), fieldInfo.Name).GetValue(_parent);
252+
object targetValue = FieldInfoHelper.GetFieldRecursively(_target.GetType(), fieldInfo.Name).GetValue(_target);
253+
254+
if(parentValue != targetValue)
255+
_overridden.Add(fieldInfo.Name);
256+
}
257+
}
258+
244259
private void PropagateValuesToChildren(T target, string targetGUID, ref List<string> children,
245260
AssetImporter importer, List<string> changedValues)
246261
{

Editor/SOVariantAttributeProcessor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public class SOVariantAttributeProcessor<T> : OdinPropertyProcessor<T> where T :
3131

3232
void ParentSetter(T parent)
3333
{
34-
if(!_soVariant.SetParent(parent))
34+
if(!_soVariant.SetParent(parent, false))
3535
return;
3636

3737
_soVariant._overridden = null;

Editor/SOVariantHelper.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@ namespace Giezi.Tools
1717
{
1818
public static class SOVariantHelper<T> where T : ScriptableObject
1919
{
20-
public static bool SetParent(T child, T parent)
20+
public static bool SetParent(T child, T parent, bool setToParentValue=true)
2121
{
2222
AssertIsSOVariant(parent);
2323
AssertIsSOVariant(child);
2424

2525
SOVariant<T> soVariant = new SOVariant<T>(child);
26-
return soVariant.SetParent(parent);
26+
return soVariant.SetParent(parent, setToParentValue);
2727
}
2828

2929
public static void ChangeFieldOverrideState(T target, string name, bool isOverridden)
@@ -51,25 +51,25 @@ public static void SetFieldOverrideAndSetValue(T target, string name, object val
5151
soVariant.ChangeValue(name, value);
5252
}
5353

54-
public static void SetParentOverrideValue(T child, T parent, string name, object value)
54+
public static void SetParentOverrideValue(T child, T parent, string name, object value, bool setToParentValue=true)
5555
{
5656
AssertIsSOVariant(parent);
5757
AssertIsSOVariant(child);
5858

5959
SOVariant<T> soVariant = new SOVariant<T>(child);
60-
soVariant.SetParent(parent);
60+
soVariant.SetParent(parent, setToParentValue);
6161

6262
soVariant.NotifyOverrideChangeInState(name, true);
6363
soVariant.ChangeValue(name, value);
6464
}
6565

66-
public static void SetParentOverrideValues(T child, T parent, Dictionary<string, object> values)
66+
public static void SetParentOverrideValues(T child, T parent, Dictionary<string, object> values, bool setToParentValue=true)
6767
{
6868
AssertIsSOVariant(parent);
6969
AssertIsSOVariant(child);
7070

7171
SOVariant<T> soVariant = new SOVariant<T>(child);
72-
soVariant.SetParent(parent);
72+
soVariant.SetParent(parent, setToParentValue);
7373

7474
foreach (KeyValuePair<string, object> value in values)
7575
{

0 commit comments

Comments
 (0)