// Copyright (c) 2012-2024 Wojciech Figat. All rights reserved. using System; namespace FlaxEditor.Surface.Undo { /// /// Edit Visject Surface node values collection undo action. /// /// class EditNodeValuesAction : IUndoAction { private VisjectSurface _surface; private ContextHandle _context; private readonly uint _nodeId; private readonly bool _graphEdited; private readonly bool _resize; private object[] _before; private object[] _after; public EditNodeValuesAction(SurfaceNode node, object[] before, bool graphEdited) { if (before == null) throw new ArgumentNullException(nameof(before)); if (node?.Values == null) throw new ArgumentNullException(nameof(node)); _resize = before.Length != node.Values.Length; if (_resize && (node.Archetype.Flags & NodeFlags.VariableValuesSize) == 0) throw new ArgumentException(nameof(before)); _surface = node.Surface; _context = new ContextHandle(node.Context); _nodeId = node.ID; _before = before; _after = (object[])node.Values.Clone(); _graphEdited = graphEdited; } /// public string ActionString => "Edit node"; /// public void Do() { var context = _context.Get(_surface); if (_after == null) throw new Exception("Missing values."); var node = context.FindNode(_nodeId); if (node == null) throw new Exception("Missing node."); node.SetIsDuringValuesEditing(true); if (_resize) node.Values = (object[])_after.Clone(); else Array.Copy(_after, node.Values, _after.Length); node.OnValuesChanged(); context.MarkAsModified(_graphEdited); node.SetIsDuringValuesEditing(false); } /// public void Undo() { var context = _context.Get(_surface); if (_before == null) throw new Exception("Missing values."); var node = context.FindNode(_nodeId); if (node == null) throw new Exception("Missing node."); node.SetIsDuringValuesEditing(true); if (_resize) node.Values = (object[])_before.Clone(); else Array.Copy(_before, node.Values, _before.Length); node.OnValuesChanged(); context.MarkAsModified(_graphEdited); node.SetIsDuringValuesEditing(false); } /// public void Dispose() { _surface = null; _before = null; _after = null; } } }