Files
2026-07-13 13:13:17 +08:00

79 lines
3.0 KiB
C#

#nullable enable
using System.IO;
using Newtonsoft.Json;
using T3.Core.Model;
using T3.Core.Operator;
using T3.Editor.UiModel.Commands;
using T3.Editor.UiModel.Commands.Graph;
using T3.Editor.UiModel.ProjectHandling;
using Vector2 = System.Numerics.Vector2;
// ReSharper disable ForeachCanBeConvertedToQueryUsingAnotherGetEnumerator
// ReSharper disable ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator
namespace T3.Editor.UiModel.Modification;
internal static class GraphOperations
{
public static SymbolUi.Child AddSymbolChild(Symbol symbol, SymbolUi parentUi, Vector2 positionOnCanvas)
{
var addCommand = new AddSymbolChildCommand(parentUi.Symbol, symbol.Id) { PosOnCanvas = positionOnCanvas };
UndoRedoStack.AddAndExecute(addCommand);
var parentSymbol = parentUi.Symbol;
var newSymbolChild = parentSymbol.Children[addCommand.AddedChildId];
// Select new node
return newSymbolChild.GetChildUi();
}
public static bool TryCopyNodesAsJson(Instance composition,
IEnumerable<SymbolUi.Child> selectedChildren,
List<Section> selectedSections, out string resultJsonString)
{
resultJsonString = string.Empty;
if (ProjectView.Focused == null)
return false;
var package = ProjectView.Focused.OpenedProject.Package;
if (!package.TryCreateNewSymbol<object>(out var newContainerUi))
{
Log.Error($"Failed to copy nodes to clipboard. Could not create new symbol.");
return false;
}
var cmd = new CopySymbolChildrenCommand(composition.GetSymbolUi(),
selectedChildren.ToList(),
selectedSections,
newContainerUi,
Vector2.Zero,
copyMode: CopySymbolChildrenCommand.CopyMode.ClipboardTarget);
cmd.Do();
using (var writer = new StringWriter())
{
var jsonWriter = new JsonTextWriter(writer);
jsonWriter.WriteStartArray();
SymbolJson.WriteSymbol(newContainerUi.Symbol, jsonWriter);
SymbolUiJson.WriteSymbolUi(newContainerUi, jsonWriter);
jsonWriter.WriteEndArray();
try
{
resultJsonString = writer.ToString();
}
catch (Exception)
{
Log.Error("Could not copy elements to clipboard. Perhaps a tool like TeamViewer locks it.");
// remove symbol from package as it is only temporary
package.RemoveSymbolUi(newContainerUi);
return false;
}
}
package.RemoveSymbolUi(newContainerUi);
return true;
}
}