尝试将节点流导出为c#代码文件

This commit is contained in:
fengjiayi
2025-07-06 14:34:49 +08:00
parent 162dc7bcf8
commit b25fd9c83c
45 changed files with 1625 additions and 361 deletions

View File

@@ -140,7 +140,7 @@ namespace Serein.NodeFlow.Model
}
object[] args = await this.GetParametersAsync(context, token);
var result = await dd.InvokeAsync(instance, args);
var flowReslt = new FlowResult(this, context, result);
var flowReslt = new FlowResult(this.Guid, context, result);
return flowReslt;
}

View File

@@ -114,7 +114,7 @@ namespace Serein.NodeFlow.Model
{
if (token.IsCancellationRequested)
{
return new FlowResult(this, context);
return new FlowResult(this.Guid, context);
}
// 接收上一节点参数or自定义参数内容
object? parameter;
@@ -128,15 +128,15 @@ namespace Serein.NodeFlow.Model
if (hasNode)
{
context.NextOrientation = ConnectionInvokeType.IsError;
return new FlowResult(this, context);
return new FlowResult(this.Guid, context);
}
if (hasNode)
{
return new FlowResult(this, context);
return new FlowResult(this.Guid, context);
}
if (pd.ArgDataSourceType == ConnectionArgSourceType.GetOtherNodeData)
{
result = context.GetFlowData(argSourceNode).Value; // 使用自定义节点的参数
result = context.GetFlowData(argSourceNode.Guid).Value; // 使用自定义节点的参数
}
else if (pd.ArgDataSourceType == ConnectionArgSourceType.GetOtherNodeDataOfInvoke)
{
@@ -148,7 +148,7 @@ namespace Serein.NodeFlow.Model
}
else
{
result = context.TransmissionData(this).Value; // 条件节点透传上一节点的数据
result = context.TransmissionData(this.Guid).Value; // 条件节点透传上一节点的数据
}
parameter = result; // 使用上一节点的参数
@@ -184,7 +184,7 @@ namespace Serein.NodeFlow.Model
SereinEnv.WriteLine(InfoType.INFO, $"{result} {Expression} -> " + context.NextOrientation);
//return result;
return new FlowResult(this, context, judgmentResult);
return new FlowResult(this.Guid, context, judgmentResult);
}

View File

@@ -94,7 +94,7 @@ namespace Serein.NodeFlow.Model
public override async Task<FlowResult> ExecutingAsync(IDynamicContext context, CancellationToken token)
{
if(token.IsCancellationRequested) return new FlowResult(this, context);
if(token.IsCancellationRequested) return new FlowResult(this.Guid, context);
object? parameter = null;// context.TransmissionData(this); // 表达式节点使用上一节点数据
var pd = MethodDetails.ParameterDetailss[0];
@@ -103,12 +103,12 @@ namespace Serein.NodeFlow.Model
if (hasNode)
{
context.NextOrientation = ConnectionInvokeType.IsError;
return new FlowResult(this, context);
return new FlowResult(this.Guid, context);
}
if (pd.ArgDataSourceType == ConnectionArgSourceType.GetOtherNodeData)
{
// 使用自定义节点的参数
parameter = context.GetFlowData(argSourceNode).Value;
parameter = context.GetFlowData(argSourceNode.Guid).Value;
}
else if (pd.ArgDataSourceType == ConnectionArgSourceType.GetOtherNodeDataOfInvoke)
{
@@ -122,7 +122,7 @@ namespace Serein.NodeFlow.Model
else
{
// 条件节点透传上一节点的数据
parameter = context.TransmissionData(this);
parameter = context.TransmissionData(this.Guid);
}
try
@@ -139,13 +139,13 @@ namespace Serein.NodeFlow.Model
}
context.NextOrientation = ConnectionInvokeType.IsSucceed;
return new FlowResult(this,context, result);
return new FlowResult(this.Guid, context, result);
}
catch (Exception ex)
{
context.NextOrientation = ConnectionInvokeType.IsError;
context.ExceptionOfRuning = ex;
return new FlowResult(this, context);
return new FlowResult(this.Guid, context);
}
}

View File

@@ -64,7 +64,7 @@ namespace Serein.NodeFlow.Model
throw new FlipflopException(MethodDetails.MethodName + "触发器超时触发。Guid" + Guid);
}
object result = dynamicFlipflopContext.Value;
var flowReslt = new FlowResult(this, context, result);
var flowReslt = new FlowResult(this.Guid, context, result);
return flowReslt;
}

View File

@@ -208,6 +208,14 @@ namespace Serein.NodeFlow.Model
{
TargetNodeGuid = targetNode.Guid;
this.targetNode = targetNode;
if(this.IsShareParam == false)
{
foreach (var item in nodeInfo.ParameterData)
{
}
}
}
else
{
@@ -258,7 +266,7 @@ namespace Serein.NodeFlow.Model
// 此处代码与SereinFlow.Library.FlowNode.ParameterDetails
// ToMethodArgData()方法中判断流程接口节点分支逻辑耦合
// 不要轻易修改
context.AddOrUpdate(targetNode, flowData);
context.AddOrUpdate(targetNode.Guid, flowData);
foreach (ConnectionInvokeType ctType in NodeStaticConfig.ConnectionTypes)
{
if (this.SuccessorNodes[ctType] == null) continue;
@@ -267,7 +275,7 @@ namespace Serein.NodeFlow.Model
if (node.DebugSetting.IsEnable)
{
context.SetPreviousNode(node, this);
context.SetPreviousNode(node.Guid, this.Guid);
}
}
}

View File

@@ -110,18 +110,18 @@ namespace Serein.NodeFlow.Model
/// <returns></returns>
public override async Task<FlowResult> ExecutingAsync(IDynamicContext context, CancellationToken token)
{
if (token.IsCancellationRequested) return new FlowResult(this, context);
if (token.IsCancellationRequested) return new FlowResult(this.Guid, context);
if (string.IsNullOrEmpty(KeyName))
{
context.NextOrientation = ConnectionInvokeType.IsError;
SereinEnv.WriteLine(InfoType.ERROR, $"全局数据的KeyName不能为空[{this.Guid}]");
return new FlowResult(this, context);
return new FlowResult(this.Guid, context);
}
if (DataNode is null)
{
context.NextOrientation = ConnectionInvokeType.IsError;
SereinEnv.WriteLine(InfoType.ERROR, $"全局数据节点没有设置数据来源[{this.Guid}]");
return new FlowResult(this, context);
return new FlowResult(this.Guid, context);
}
try
@@ -135,7 +135,7 @@ namespace Serein.NodeFlow.Model
{
context.NextOrientation = ConnectionInvokeType.IsError;
context.ExceptionOfRuning = ex;
return new FlowResult(this, context);
return new FlowResult(this.Guid, context);
}
}

View File

@@ -136,6 +136,8 @@ namespace Serein.NodeFlow.Model
this.MethodDetails.ParameterDetailss[i].Name = nodeInfo.ParameterData[i].ArgName;
}
ReloadScript();// 加载时重新解析
IsScriptChanged = false; // 重置脚本改变标志
}
@@ -165,6 +167,8 @@ namespace Serein.NodeFlow.Model
var p = new SereinScriptParser(sb.ToString());
//var p = new SereinScriptParser(Script);
mainNode = p.Parse(); // 开始解析
}
catch (Exception ex)
{
@@ -192,9 +196,9 @@ namespace Serein.NodeFlow.Model
/// <returns></returns>
public async Task<FlowResult> ExecutingAsync(NodeModelBase flowCallNode, IDynamicContext context, CancellationToken token)
{
if (token.IsCancellationRequested) return new FlowResult(this, context);
if (token.IsCancellationRequested) return new FlowResult(this.Guid, context);
var @params = await flowCallNode.GetParametersAsync(context, token);
if (token.IsCancellationRequested) return new FlowResult(this, context);
if (token.IsCancellationRequested) return new FlowResult(this.Guid, context);
//context.AddOrUpdate($"{context.Guid}_{this.Guid}_Params", @params[0]); // 后面再改
@@ -204,7 +208,8 @@ namespace Serein.NodeFlow.Model
if (IsScriptChanged)
{
ReloadScript();// 每次都重新解析
IsScriptChanged = false;
IsScriptChanged = false;
context.Env.WriteLine(InfoType.INFO, $"[{Guid}]脚本解析完成");
}
}
}
@@ -233,7 +238,7 @@ namespace Serein.NodeFlow.Model
var result = await ScriptInterpreter.InterpretAsync(scriptContext, mainNode); // 从入口节点执行
envEvent.FlowRunComplete -= onFlowStop;
return new FlowResult(this, context, result);
return new FlowResult(this.Guid, context, result);
}
#region

View File

@@ -17,7 +17,7 @@ namespace Serein.NodeFlow.Model
public override async Task<FlowResult> ExecutingAsync(IDynamicContext context, CancellationToken token)
{
if (token.IsCancellationRequested) return new FlowResult(this,context);
if (token.IsCancellationRequested) return new FlowResult(this.Guid, context);
if(Adapter is null)
{
@@ -34,13 +34,13 @@ namespace Serein.NodeFlow.Model
}
else
{
var p = context.GetPreviousNode(this);
var p = context.GetPreviousNode(this.Guid);
var data = context.GetFlowData(p).Value;
var iflowContorl = Adapter.GetFlowControl();
iflowContorl.OnExecuting(data);
}
return new FlowResult(this, context);
return new FlowResult(this.Guid, context);
}
}
}

View File

@@ -89,7 +89,7 @@ namespace Serein.NodeFlow.Model.Operation
return true;
}
public override bool Execute()
public override async Task<bool> ExecuteAsync()
{
if (!ValidationParameter()) return false;
if (!flowModelService.TryGetCanvasModel(CanvasGuid, out FlowCanvas) // 不存在画布
@@ -132,12 +132,12 @@ namespace Serein.NodeFlow.Model.Operation
// flowTaskManagement?.TerminateGlobalFlipflopRuning(flipflopNode); // 假设被连接的是全局触发器,尝试移除
//}
var state = (JunctionOfConnectionType, ChangeType) switch
var state = (JunctionOfConnectionType, ChangeType) switch
{
(JunctionOfConnectionType.Invoke, NodeConnectChangeEventArgs.ConnectChangeType.Create) => CreateInvokeConnection(), // 创建节点之间的调用关系
(JunctionOfConnectionType.Invoke, NodeConnectChangeEventArgs.ConnectChangeType.Remove) => RemoveInvokeConnection(), // 移除节点之间的调用关系
(JunctionOfConnectionType.Arg, NodeConnectChangeEventArgs.ConnectChangeType.Create) => CreateArgConnection(), // 创建节点之间的参数传递关系
(JunctionOfConnectionType.Arg, NodeConnectChangeEventArgs.ConnectChangeType.Remove) => RemoveArgConnection(), // 移除节点之间的参数传递关系
(JunctionOfConnectionType.Invoke, NodeConnectChangeEventArgs.ConnectChangeType.Create) => await CreateInvokeConnection(), // 创建节点之间的调用关系
(JunctionOfConnectionType.Invoke, NodeConnectChangeEventArgs.ConnectChangeType.Remove) => await RemoveInvokeConnection(), // 移除节点之间的调用关系
(JunctionOfConnectionType.Arg, NodeConnectChangeEventArgs.ConnectChangeType.Create) => await CreateArgConnection(), // 创建节点之间的参数传递关系
(JunctionOfConnectionType.Arg, NodeConnectChangeEventArgs.ConnectChangeType.Remove) => await RemoveArgConnection(), // 移除节点之间的参数传递关系
_ => false
};
return state;
@@ -151,7 +151,7 @@ namespace Serein.NodeFlow.Model.Operation
/// <summary>
/// 创建方法调用关系
/// </summary>
private bool CreateInvokeConnection()
private async Task<bool> CreateInvokeConnection()
{
IFlowNode fromNode = FromNode ;
IFlowNode toNode = ToNode;
@@ -224,15 +224,20 @@ namespace Serein.NodeFlow.Model.Operation
}
fromNode.SuccessorNodes[invokeType].Add(toNode); // 添加到起始节点新类别的子分支
toNode.PreviousNodes[invokeType].Add(fromNode); // 添加到目标节点新类别的父分支
flowEnvironmentEvent.OnNodeConnectChanged(
new NodeConnectChangeEventArgs(
FlowCanvas.Guid,
fromNode.Guid, // 从哪个节点开始
toNode.Guid, // 连接到那个节点
JunctionOfConnectionType.Invoke,
invokeType, // 连接线的样式类型
NodeConnectChangeEventArgs.ConnectChangeType.Create // 是创建连接还是删除连接
));
await TriggerEvent(() =>
{
flowEnvironmentEvent.OnNodeConnectChanged(
new NodeConnectChangeEventArgs(
FlowCanvas.Guid,
fromNode.Guid, // 从哪个节点开始
toNode.Guid, // 连接到那个节点
JunctionOfConnectionType.Invoke,
invokeType, // 连接线的样式类型
NodeConnectChangeEventArgs.ConnectChangeType.Create // 是创建连接还是删除连接
));
});
// Invoke
// GetResult
return true;
@@ -248,19 +253,22 @@ namespace Serein.NodeFlow.Model.Operation
/// <summary>
/// 移除方法调用关系
/// </summary>
private bool RemoveInvokeConnection()
private async Task<bool> RemoveInvokeConnection()
{
FromNode.SuccessorNodes[ConnectionInvokeType].Remove(ToNode);
ToNode.PreviousNodes[ConnectionInvokeType].Remove(FromNode);
flowEnvironmentEvent.OnNodeConnectChanged(
new NodeConnectChangeEventArgs(
FlowCanvas.Guid,
FromNode.Guid,
ToNode.Guid,
JunctionOfConnectionType.Invoke,
ConnectionInvokeType,
NodeConnectChangeEventArgs.ConnectChangeType.Remove));
await TriggerEvent(() =>
{
flowEnvironmentEvent.OnNodeConnectChanged(
new NodeConnectChangeEventArgs(
FlowCanvas.Guid,
FromNode.Guid,
ToNode.Guid,
JunctionOfConnectionType.Invoke,
ConnectionInvokeType,
NodeConnectChangeEventArgs.ConnectChangeType.Remove));
});
/* if (string.IsNullOrEmpty(ToNode.MethodDetails.ParameterDetailss[ArgIndex].ArgDataSourceNodeGuid))
@@ -289,7 +297,7 @@ namespace Serein.NodeFlow.Model.Operation
/// 创建参数连接关系
/// </summary>
/// <exception cref="Exception"></exception>
private bool CreateArgConnection()
private async Task<bool> CreateArgConnection()
{
IFlowNode fromNodeControl = ToNode;
IFlowNode toNodeControl = ToNode;
@@ -304,43 +312,27 @@ namespace Serein.NodeFlow.Model.Operation
if (FromNode.Guid == toNodeArgSourceGuid
&& toNodeArgSourceType == ConnectionArgSourceType)
{
SereinEnv.WriteLine(InfoType.INFO, $"节点之间已建立过连接关系,此次操作将不会执行" +
SereinEnv.WriteLine(InfoType.INFO, $"节点之间已建立过连接关系" +
$"起始节点:{FromNode.Guid}" +
$"目标节点:{ToNode.Guid}" +
$"参数索引:{ArgIndex}" +
$"参数类型:{ConnectionArgSourceType}");
/*flowEnvironmentEvent.OnNodeConnectChanged(
new NodeConnectChangeEventArgs(
FlowCanvas.Guid,
FromNode.Guid, // 从哪个节点开始
ToNode.Guid, // 连接到那个节点
ArgIndex, // 连接线的样式类型
JunctionOfConnectionType.Arg,
ConnectionArgSourceType,
NodeConnectChangeEventArgs.ConnectChangeType.Create // 是创建连接还是删除连接
)); // 通知UI */
return true;
}
if (!string.IsNullOrEmpty(toNodeArgSourceGuid)) // 更改关系获取
{
ToNode.MethodDetails.ParameterDetailss[ArgIndex].ArgDataSourceNodeGuid = null;
ToNode.MethodDetails.ParameterDetailss[ArgIndex].ArgDataSourceType = ConnectionArgSourceType.GetPreviousNodeData; // 恢复默认值
flowEnvironmentEvent.OnNodeConnectChanged(
new NodeConnectChangeEventArgs(
FlowCanvas.Guid,
FromNode.Guid,
ToNode.Guid,
ArgIndex,
JunctionOfConnectionType.Arg,
ConnectionArgSourceType.GetPreviousNodeData,
NodeConnectChangeEventArgs.ConnectChangeType.Remove));
}
ToNode.MethodDetails.ParameterDetailss[ArgIndex].ArgDataSourceNodeGuid = FromNode.Guid; // 设置
ToNode.MethodDetails.ParameterDetailss[ArgIndex].ArgDataSourceType = ConnectionArgSourceType;
flowEnvironmentEvent.OnNodeConnectChanged(
await TriggerEvent(() =>
{
flowEnvironmentEvent.OnNodeConnectChanged(
new NodeConnectChangeEventArgs(
FlowCanvas.Guid,
FromNode.Guid, // 从哪个节点开始
ToNode.Guid, // 连接到那个节点
ArgIndex, // 连接线的样式类型
JunctionOfConnectionType.Arg,
ConnectionArgSourceType,
NodeConnectChangeEventArgs.ConnectChangeType.Remove // 是创建连接还是删除连接
)); // 通知UI
});
await TriggerEvent(() =>
{
flowEnvironmentEvent.OnNodeConnectChanged(
new NodeConnectChangeEventArgs(
FlowCanvas.Guid,
FromNode.Guid, // 从哪个节点开始
@@ -350,6 +342,47 @@ namespace Serein.NodeFlow.Model.Operation
ConnectionArgSourceType,
NodeConnectChangeEventArgs.ConnectChangeType.Create // 是创建连接还是删除连接
)); // 通知UI
});
return true;
}
if (!string.IsNullOrEmpty(toNodeArgSourceGuid)) // 更改关系获取
{
ToNode.MethodDetails.ParameterDetailss[ArgIndex].ArgDataSourceNodeGuid = null;
ToNode.MethodDetails.ParameterDetailss[ArgIndex].ArgDataSourceType = ConnectionArgSourceType.GetPreviousNodeData; // 恢复默认值
await TriggerEvent(() =>
{
flowEnvironmentEvent.OnNodeConnectChanged(
new NodeConnectChangeEventArgs(
FlowCanvas.Guid,
FromNode.Guid,
ToNode.Guid,
ArgIndex,
JunctionOfConnectionType.Arg,
ConnectionArgSourceType.GetPreviousNodeData,
NodeConnectChangeEventArgs.ConnectChangeType.Remove));
});
}
ToNode.MethodDetails.ParameterDetailss[ArgIndex].ArgDataSourceNodeGuid = FromNode.Guid; // 设置
ToNode.MethodDetails.ParameterDetailss[ArgIndex].ArgDataSourceType = ConnectionArgSourceType;
await TriggerEvent(() =>
{
flowEnvironmentEvent.OnNodeConnectChanged(
new NodeConnectChangeEventArgs(
FlowCanvas.Guid,
FromNode.Guid, // 从哪个节点开始
ToNode.Guid, // 连接到那个节点
ArgIndex, // 连接线的样式类型
JunctionOfConnectionType.Arg,
ConnectionArgSourceType,
NodeConnectChangeEventArgs.ConnectChangeType.Create // 是创建连接还是删除连接
)); // 通知UI
});
return true;
}
@@ -360,14 +393,15 @@ namespace Serein.NodeFlow.Model.Operation
/// <param name="fromNodeControl"></param>
/// <param name="toNodeControl"></param>
/// <param name="index"></param>
private bool RemoveArgConnection()
private async Task<bool> RemoveArgConnection()
{
ToNode.MethodDetails.ParameterDetailss[ArgIndex].ArgDataSourceNodeGuid = null;
ToNode.MethodDetails.ParameterDetailss[ArgIndex].ArgDataSourceType = ConnectionArgSourceType.GetPreviousNodeData; // 恢复默认值
if (OperatingSystem.IsWindows())
await TriggerEvent(() =>
{
flowEnvironmentEvent.OnNodeConnectChanged(
flowEnvironmentEvent.OnNodeConnectChanged(
new NodeConnectChangeEventArgs(
FlowCanvas.Guid,
FromNode.Guid,
@@ -376,7 +410,8 @@ namespace Serein.NodeFlow.Model.Operation
JunctionOfConnectionType.Arg,
ConnectionArgSourceType.GetPreviousNodeData,
NodeConnectChangeEventArgs.ConnectChangeType.Remove));
}
});
return true;
}

View File

@@ -52,30 +52,31 @@ namespace Serein.NodeFlow.Model.Operation
}
public override bool Execute()
public override Task<bool> ExecuteAsync()
{
if (!ValidationParameter()) return false;
if (!ValidationParameter()) return Task.FromResult(false);
if (IsAdd)
{
if (nodeModel.MethodDetails.AddParamsArg(ParamIndex))
{
return true;
return Task.FromResult(true);
}
else
{
return false;
return Task.FromResult(false);
}
}
else
{
if (nodeModel.MethodDetails.RemoveParamsArg(ParamIndex))
{
return true;
return Task.FromResult(true);
}
else
{
return true;
return Task.FromResult(true);
}
}
}

View File

@@ -1,8 +1,11 @@
using Serein.Library.Api;
using Microsoft.VisualBasic.FileIO;
using Serein.Library.Api;
using Serein.Library.Utils;
using Serein.NodeFlow.Services;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mime;
using System.Text;
using System.Threading.Tasks;
@@ -72,12 +75,16 @@ namespace Serein.NodeFlow.Model.Operation
return true;
}
public override bool Execute()
public override async Task<bool> ExecuteAsync()
{
if (!ValidationParameter()) return false;
ContainerNode.PlaceNode(Node);
flowEnvironmentEvent.OnNodePlace(new NodePlaceEventArgs(CanvasGuid, NodeGuid, ContainerNodeGuid)); // 通知UI更改节点放置位置
await TriggerEvent(() =>
{
flowEnvironmentEvent.OnNodePlace(new NodePlaceEventArgs(CanvasGuid, NodeGuid, ContainerNodeGuid)); // 通知UI更改节点放置位置
});
return true;
}

View File

@@ -61,12 +61,15 @@ namespace Serein.NodeFlow.Model.Operation
return true;
}
public override bool Execute()
public override async Task<bool> ExecuteAsync()
{
if (!ValidationParameter()) return false;
ContainerNode.TakeOutNode(Node);
flowEnvironmentEvent.OnNodeTakeOut(new NodeTakeOutEventArgs(CanvasGuid, NodeGuid)); // 重新放置在画布上
await TriggerEvent(() =>
{
flowEnvironmentEvent.OnNodeTakeOut(new NodeTakeOutEventArgs(CanvasGuid, NodeGuid)); // 重新放置在画布上
});
return true;
}

View File

@@ -30,7 +30,7 @@ namespace Serein.NodeFlow.Model.Operation
return true;
}
public override bool Execute()
public override async Task<bool> ExecuteAsync()
{
if(!ValidationParameter()) return false;
@@ -38,7 +38,11 @@ namespace Serein.NodeFlow.Model.Operation
cavasnModel.LoadInfo(CanvasInfo);
flowModelService.AddCanvasModel(cavasnModel);
this.flowCanvasDetails = cavasnModel; ;
flowEnvironmentEvent.OnCanvasCreated(new CanvasCreateEventArgs(cavasnModel));
await TriggerEvent(() =>
{
flowEnvironmentEvent.OnCanvasCreated(new CanvasCreateEventArgs(cavasnModel));
});
return true;
}

View File

@@ -66,7 +66,7 @@ namespace Serein.NodeFlow.Model.Operation
return true;
}
public override bool Execute()
public override async Task<bool> ExecuteAsync()
{
if (!ValidationParameter()) return false; // 执行时验证
@@ -101,7 +101,11 @@ namespace Serein.NodeFlow.Model.Operation
flowModelService.AddNodeModel(nodeModel);
this.flowNode = nodeModel;
flowEnvironmentEvent.OnNodeCreated(new NodeCreateEventArgs(flowCanvasDetails.Guid, nodeModel, Position));
await TriggerEvent(() =>
{
flowEnvironmentEvent.OnNodeCreated(new NodeCreateEventArgs(flowCanvasDetails.Guid, nodeModel, Position));
});
return true;
}

View File

@@ -1,5 +1,6 @@
using Serein.Library;
using Serein.Library.Api;
using Serein.Library.Utils;
using Serein.NodeFlow.Services;
using Serein.NodeFlow.Tool;
using System;
@@ -25,7 +26,7 @@ namespace Serein.NodeFlow.Model.Operation
/// <summary>
/// 执行操作
/// </summary>
bool Execute();
Task<bool> ExecuteAsync();
/// <summary>
/// 撤销操作
/// </summary>
@@ -46,6 +47,12 @@ namespace Serein.NodeFlow.Model.Operation
[AutoInjection]
protected FlowModelService flowModelService;
/// <summary>
/// 节点管理服务
/// </summary>
[AutoInjection]
protected UIContextOperation uiContextOperation;
/// <summary>
/// 流程依赖服务
/// </summary>
@@ -75,7 +82,7 @@ namespace Serein.NodeFlow.Model.Operation
/// <summary>
/// 执行
/// </summary>
public abstract bool Execute();
public abstract Task<bool> ExecuteAsync();
/// <summary>
/// 撤销
@@ -96,6 +103,23 @@ namespace Serein.NodeFlow.Model.Operation
public abstract void ToInfo();
protected async Task TriggerEvent(Action action)
{
/* if (OperatingSystem.IsWindows())
{
}*/
if (uiContextOperation is null)
{
action?.Invoke();
}
else
{
await uiContextOperation.InvokeAsync(() =>
{
action?.Invoke();
});
}
}
}

View File

@@ -31,7 +31,7 @@ namespace Serein.NodeFlow.Model.Operation
return true;
}
public override bool Execute()
public override async Task<bool> ExecuteAsync()
{
if (!ValidationParameter()) return false;
@@ -46,7 +46,11 @@ namespace Serein.NodeFlow.Model.Operation
flowModelService.RemoveCanvasModel(flowCanvasDetails);
flowCanvasDetailsInfo = flowCanvasDetails.ToInfo();
flowEnvironmentEvent.OnCanvasRemoved(new CanvasRemoveEventArgs(flowCanvasDetails.Guid));
await TriggerEvent(() =>
{
flowEnvironmentEvent.OnCanvasRemoved(new CanvasRemoveEventArgs(flowCanvasDetails.Guid));
});
return true;
}

View File

@@ -50,7 +50,7 @@ namespace Serein.NodeFlow.Model.Operation
return true;
}
public override bool Execute()
public override async Task<bool> ExecuteAsync()
{
if (!ValidationParameter()) return false;
@@ -74,8 +74,10 @@ namespace Serein.NodeFlow.Model.Operation
connectionType, // 对应的连接关系
NodeConnectChangeEventArgs.ConnectChangeType.Remove); // 移除连线
EventArgs.Add(e); // 缓存事件参数
flowEnvironmentEvent.OnNodeConnectChanged(e);
await TriggerEvent(() =>
{
flowEnvironmentEvent.OnNodeConnectChanged(e);
});
}
}
@@ -102,7 +104,10 @@ namespace Serein.NodeFlow.Model.Operation
connectionType, // 对应的连接关系
NodeConnectChangeEventArgs.ConnectChangeType.Remove); // 移除连线
EventArgs.Add(e); // 缓存事件参数
flowEnvironmentEvent.OnNodeConnectChanged(e);
await TriggerEvent(() =>
{
flowEnvironmentEvent.OnNodeConnectChanged(e);
});
}
}
}
@@ -136,7 +141,10 @@ namespace Serein.NodeFlow.Model.Operation
connectionType, // 对应的连接关系
NodeConnectChangeEventArgs.ConnectChangeType.Remove); // 移除连线
EventArgs.Add(e); // 缓存事件参数
flowEnvironmentEvent.OnNodeConnectChanged(e);
await TriggerEvent(() =>
{
flowEnvironmentEvent.OnNodeConnectChanged(e);
});
}
}
}
@@ -153,12 +161,16 @@ namespace Serein.NodeFlow.Model.Operation
{
// 存在UI上下文操作当前运行环境极有可能运行在有UI线程的平台上
// 为了避免直接修改 ObservableCollection 集合导致异常产生故而使用UI线程上下文操作运行
flowEnvironment.UIContextOperation?.Invoke(() =>
await TriggerEvent(() =>
{
flowCanvasDetails?.Nodes.Remove(flowNode);
});
}
flowEnvironmentEvent.OnNodeRemoved(new NodeRemoveEventArgs(CanvasGuid, NodeGuid));
await TriggerEvent(() =>
{
flowEnvironmentEvent.OnNodeRemoved(new NodeRemoveEventArgs(CanvasGuid, NodeGuid));
});
return true;
}

View File

@@ -46,9 +46,9 @@ namespace Serein.NodeFlow.Model.Operation
/// <summary>
/// 成为首项
/// </summary>
public override bool Execute()
public override Task<bool> ExecuteAsync()
{
if(!ValidationParameter()) return false;
if(!ValidationParameter()) return Task.FromResult(false);
if (FromNode.SuccessorNodes.TryGetValue(ConnectionType, out var nodes))
{
@@ -60,7 +60,7 @@ namespace Serein.NodeFlow.Model.Operation
nodes.Insert(0, ToNode);
}
}
return true;
return Task.FromResult(true);
}
/// <summary>

View File

@@ -34,7 +34,7 @@ namespace Serein.NodeFlow.Model.Operation
}
return true;
}
public override bool Execute()
public override async Task<bool> ExecuteAsync()
{
if (!ValidationParameter()) return false;
@@ -45,7 +45,11 @@ namespace Serein.NodeFlow.Model.Operation
}
CanvasModel.StartNode = NewStartNodeModel;
flowEnvironmentEvent.OnStartNodeChanged(new StartNodeChangeEventArgs(CanvasModel.Guid, OldStartNodeModel?.Guid, NewStartNodeModel.Guid));
await TriggerEvent(() =>
{
flowEnvironmentEvent.OnStartNodeChanged(new StartNodeChangeEventArgs(CanvasModel.Guid, OldStartNodeModel?.Guid, NewStartNodeModel.Guid));
});
return true;
}