using T3.Core.Operator.Slots;
using T3.Editor.Gui.Interaction.Variations.Model;
namespace T3.Editor.UiModel.Commands.Variations;
///
/// Removes a set of child-ids from the parameter sets of multiple variations and restores them on
/// undo. Used when a child is disabled-for-snapshots or deleted — its parameters should no longer
/// appear in any snapshot belonging to its composition.
///
internal sealed class RemoveInstancesFromVariationsCommand : ICommand
{
public string Name => "Remove instances from variations";
public bool IsUndoable => true;
private readonly SymbolVariationPool _pool;
private readonly List _removedEntries = [];
internal RemoveInstancesFromVariationsCommand(SymbolVariationPool pool,
IEnumerable symbolChildIds,
IReadOnlyList variations)
{
_pool = pool;
var ids = symbolChildIds as ICollection ?? symbolChildIds.ToList();
foreach (var variation in variations)
{
foreach (var id in ids)
{
if (!variation.ParameterSetsForChildIds.TryGetValue(id, out var parameterSet))
continue;
_removedEntries.Add(new Entry(variation, id, CloneInner(parameterSet)));
}
}
}
public void Do()
{
foreach (var entry in _removedEntries)
entry.Variation.ParameterSetsForChildIds.Remove(entry.ChildId);
_pool.SaveVariationsToFile();
}
public void Undo()
{
foreach (var entry in _removedEntries)
entry.Variation.ParameterSetsForChildIds[entry.ChildId] = CloneInner(entry.ParameterSet);
_pool.SaveVariationsToFile();
}
private static Dictionary CloneInner(Dictionary source)
{
var clone = new Dictionary(source.Count);
foreach (var (inputId, value) in source)
clone[inputId] = value.Clone();
return clone;
}
private readonly record struct Entry(Variation Variation, Guid ChildId, Dictionary ParameterSet);
}