using Serein.Library.Api; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Serein.NodeFlow.Model.Operation { /// /// 取出节点操作 /// internal class ContainerTakeOutNodeOperation : OperationBase { public override string Theme => nameof(ContainerTakeOutNodeOperation); /// /// 所在画布 /// public string CanvasGuid { get; set; } /// /// 子节点,该数据为此次事件的主节点 /// public string NodeGuid { get; set; } /// /// 父节点 /// private INodeContainer ContainerNode; /// /// 子节点,该数据为此次事件的主节点 /// private IFlowNode Node; public override bool ValidationParameter() { if (!flowModelService.ContainsCanvasModel(CanvasGuid)) { flowEnvironment.WriteLine(Serein.Library.InfoType.WARN, $"节点取出失败,目标画布不存在[{NodeGuid}]"); return false; } // 获取目标节点与容器节点 if (!flowModelService.TryGetNodeModel(NodeGuid, out var nodeModel)) { flowEnvironment.WriteLine(Serein.Library.InfoType.WARN, $"节点取出失败,目标节点不存在[{NodeGuid}]"); return false; } if (nodeModel.ContainerNode is not INodeContainer containerNode) { flowEnvironment.WriteLine(Serein.Library.InfoType.WARN, $"节点取出失败,节点并非容器节点[{nodeModel.Guid}]"); return false; } Node = nodeModel; ContainerNode = containerNode; return true; } public override async Task ExecuteAsync() { if (!ValidationParameter()) return false; var isSuccess = ContainerNode.TakeOutNode(Node); if (isSuccess is true) { await TriggerEvent(() => { // 取出节点,重新放置在画布上 flowEnvironmentEvent.OnNodeTakeOut(new NodeTakeOutEventArgs(CanvasGuid, ContainerNode.Guid, NodeGuid)); }); } return isSuccess; } public override bool Undo() { var isSuccess = ContainerNode.PlaceNode(Node); if (isSuccess is true) { if (ContainerNode is IFlowNode containerFlowNode) { flowEnvironmentEvent.OnNodePlace(new NodePlaceEventArgs(CanvasGuid, NodeGuid, containerFlowNode.Guid)); // 通知UI更改节点放置位置 } } return isSuccess; } public override void ToInfo() { } } }