Files
tooll3--t3/Editor/UiModel/Commands/Variations/UpdateVariationParametersCommand.cs
2026-07-13 13:13:17 +08:00

53 lines
2.1 KiB
C#

using T3.Core.Operator.Slots;
using T3.Editor.Gui.Interaction.Variations.Model;
namespace T3.Editor.UiModel.Commands.Variations;
/// <summary>
/// Replaces a variation's ParameterSetsForChildIds with a new snapshot. Used when the user
/// "updates" an existing snapshot/preset to capture the current instance parameters. Stores both
/// before/after snapshots so undo/redo round-trips cleanly.
/// </summary>
internal sealed class UpdateVariationParametersCommand : ICommand
{
public string Name => "Update variation";
public bool IsUndoable => true;
private readonly SymbolVariationPool _pool;
private readonly Variation _variation;
private readonly Dictionary<Guid, Dictionary<Guid, InputValue>> _previousParameterSets;
private readonly Dictionary<Guid, Dictionary<Guid, InputValue>> _newParameterSets;
internal UpdateVariationParametersCommand(SymbolVariationPool pool,
Variation variation,
Dictionary<Guid, Dictionary<Guid, InputValue>> newParameterSets)
{
_pool = pool;
_variation = variation;
_previousParameterSets = Clone(variation.ParameterSetsForChildIds);
_newParameterSets = Clone(newParameterSets);
}
public void Do() => Apply(_newParameterSets);
public void Undo() => Apply(_previousParameterSets);
private void Apply(Dictionary<Guid, Dictionary<Guid, InputValue>> source)
{
_variation.ParameterSetsForChildIds = Clone(source);
_pool.SaveVariationsToFile();
}
private static Dictionary<Guid, Dictionary<Guid, InputValue>> Clone(Dictionary<Guid, Dictionary<Guid, InputValue>> source)
{
var result = new Dictionary<Guid, Dictionary<Guid, InputValue>>(source.Count);
foreach (var (childId, inner) in source)
{
var clonedInner = new Dictionary<Guid, InputValue>(inner.Count);
foreach (var (inputId, value) in inner)
clonedInner[inputId] = value.Clone();
result[childId] = clonedInner;
}
return result;
}
}