UpdateProperty_Change.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using PixiEditor.ChangeableDocument.Changeables.Graph;
  2. using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
  3. using PixiEditor.ChangeableDocument.ChangeInfos.NodeGraph;
  4. namespace PixiEditor.ChangeableDocument.Changes.NodeGraph;
  5. internal class UpdatePropertyValue_Change : Change
  6. {
  7. private readonly Guid _nodeId;
  8. private readonly string _propertyName;
  9. private object? _value;
  10. private object? previousValue;
  11. [GenerateMakeChangeAction]
  12. public UpdatePropertyValue_Change(Guid nodeId, string property, object? value)
  13. {
  14. _nodeId = nodeId;
  15. _propertyName = property;
  16. _value = value;
  17. }
  18. public override bool InitializeAndValidate(Document target)
  19. {
  20. if(target.TryFindNode<Node>(_nodeId, out var node))
  21. {
  22. return node.HasInputProperty(_propertyName);
  23. }
  24. return false;
  25. }
  26. public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply, out bool ignoreInUndo)
  27. {
  28. var node = target.NodeGraph.Nodes.First(x => x.Id == _nodeId);
  29. var property = node.GetInputProperty(_propertyName);
  30. previousValue = GetValue(property);
  31. _value = SetValue(property, _value);
  32. ignoreInUndo = false;
  33. return new PropertyValueUpdated_ChangeInfo(_nodeId, _propertyName, _value);
  34. }
  35. public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document target)
  36. {
  37. var node = target.NodeGraph.Nodes.First(x => x.Id == _nodeId);
  38. var property = node.GetInputProperty(_propertyName);
  39. SetValue(property, previousValue);
  40. return new PropertyValueUpdated_ChangeInfo(_nodeId, _propertyName, previousValue);
  41. }
  42. private static object SetValue(InputProperty property, object? value)
  43. {
  44. if (property is IFuncInputProperty fieldInput)
  45. {
  46. fieldInput.SetFuncConstantValue(value);
  47. }
  48. else
  49. {
  50. if (value is int && property.ValueType.IsEnum)
  51. {
  52. value = Enum.ToObject(property.ValueType, value);
  53. }
  54. property.NonOverridenValue = value;
  55. }
  56. return value;
  57. }
  58. private static object? GetValue(InputProperty property)
  59. {
  60. if (property is IFuncInputProperty fieldInput)
  61. {
  62. return fieldInput.GetFuncConstantValue();
  63. }
  64. return property.NonOverridenValue;
  65. }
  66. }