改写NodeModelBase类,使其继承Serein.Library.Api下的IFlowNode接口,而实现类迁移到NodeModel项目,方便后续节点运行逻辑修改时不用重新编译类库。

This commit is contained in:
fengjiayi
2025-05-31 12:15:01 +08:00
parent cc0b084c84
commit 84390b574f
36 changed files with 562 additions and 121 deletions

View File

@@ -16,6 +16,7 @@ using Serein.Workbench.Services;
using Serein.Workbench.Tool;
using System.ComponentModel;
using System.Diagnostics;
using Serein.Library.Api;
namespace Serein.Workbench.Node.View
{
@@ -60,15 +61,15 @@ namespace Serein.Workbench.Node.View
#region
public static readonly DependencyProperty NodeProperty =
DependencyProperty.Register(nameof(MyNode), typeof(NodeModelBase), typeof(ParamsArgControl), new PropertyMetadata(default(NodeModelBase)));
DependencyProperty.Register(nameof(MyNode), typeof(IFlowNode), typeof(ParamsArgControl), new PropertyMetadata(default(IFlowNode)));
//public NodeModelBase NodeModel;
/// <summary>
/// 所在的节点
/// </summary>
public NodeModelBase MyNode
public IFlowNode MyNode
{
get { return (NodeModelBase)GetValue(NodeProperty); }
get { return (IFlowNode)GetValue(NodeProperty); }
set { SetValue(NodeProperty, value); }
}
#endregion
@@ -194,15 +195,15 @@ namespace Serein.Workbench.Node.View
#region
public static readonly DependencyProperty NodeProperty =
DependencyProperty.Register(nameof(MyNode), typeof(NodeModelBase), typeof(JunctionControlBase), new PropertyMetadata(default(NodeModelBase)));
DependencyProperty.Register(nameof(MyNode), typeof(IFlowNode), typeof(JunctionControlBase), new PropertyMetadata(default(IFlowNode)));
//public NodeModelBase NodeModel;
/// <summary>
/// 所在的节点
/// </summary>
public NodeModelBase MyNode
public IFlowNode MyNode
{
get { return (NodeModelBase)GetValue(NodeProperty); }
get { return (IFlowNode)GetValue(NodeProperty); }
set { SetValue(NodeProperty, value); }
}
#endregion

View File

@@ -5,6 +5,7 @@ using System.Windows.Controls;
using System.Windows.Data;
using System;
using CommunityToolkit.Mvvm.ComponentModel;
using Serein.Library.Api;
namespace Serein.Workbench.Node.ViewModel
{
@@ -14,9 +15,9 @@ namespace Serein.Workbench.Node.ViewModel
///// <summary>
///// 对应的节点实体类
///// </summary>
public NodeModelBase NodeModel { get; }
public IFlowNode NodeModel { get; }
public NodeControlViewModelBase(NodeModelBase nodeModel)
public NodeControlViewModelBase(IFlowNode nodeModel)
{
NodeModel = nodeModel;

View File

@@ -23,11 +23,11 @@ namespace Serein.Workbench.Node.View
/// <summary>
/// 起始节点
/// </summary>
public NodeModelBase StartNode { get; set; }
public IFlowNode StartNode { get; set; }
/// <summary>
/// 目标节点
/// </summary>
public NodeModelBase EndNode { get; set; }
public IFlowNode EndNode { get; set; }
/// <summary>
/// 来源于起始节点的(控制点)类型
@@ -63,7 +63,7 @@ namespace Serein.Workbench.Node.View
/// <summary>
/// 对应的视图对象
/// </summary>
public NodeModelBase NodeModel { get; set; }
public IFlowNode NodeModel { get; set; }
/// <summary>
///
/// </summary>

View File

@@ -1,5 +1,6 @@
using CommunityToolkit.Mvvm.ComponentModel;
using Serein.Library;
using Serein.Library.Api;
using Serein.NodeFlow.Model;
using Serein.Workbench.Api;
using Serein.Workbench.Services;
@@ -37,7 +38,7 @@ namespace Serein.Workbench.Node.ViewModel
/// 当前所选节点
/// </summary>
[ObservableProperty]
private NodeModelBase _selectNode;
private IFlowNode _selectNode;
[ObservableProperty]
@@ -88,7 +89,7 @@ namespace Serein.Workbench.Node.ViewModel
FlowCallNode.ResetTargetNode();
}
partial void OnSelectNodeChanged(NodeModelBase value)
partial void OnSelectNodeChanged(IFlowNode value)
{
if(value is null)
{

View File

@@ -23,7 +23,7 @@ namespace Serein.Workbench.Node.ViewModel
private UserControl _nodeUIContent;
public UINodeControlViewModel(NodeModelBase nodeModel) : base(nodeModel)
public UINodeControlViewModel(IFlowNode nodeModel) : base(nodeModel)
{
}

View File

@@ -421,7 +421,7 @@ namespace Serein.Workbench.Services
/// <param name="nodeCanvas">节点所在画布</param>
/// <returns></returns>
/// <exception cref="Exception">无法创建节点控件</exception>
private static NodeControlBase CreateNodeControl(Type controlType, Type viewModelType, NodeModelBase model, IFlowCanvas nodeCanvas)
private static NodeControlBase CreateNodeControl(Type controlType, Type viewModelType, IFlowNode model, IFlowCanvas nodeCanvas)
{
if ((controlType is null)
|| viewModelType is null
@@ -489,7 +489,7 @@ namespace Serein.Workbench.Services
/// <summary>
/// 从节点信息转换为Json文本数据
/// </summary>
public string CpoyNodeInfo(List<NodeModelBase> dictSelection)
public string CpoyNodeInfo(List<IFlowNode> dictSelection)
{
// 遍历当前已选节点

View File

@@ -26,18 +26,18 @@ namespace Serein.Workbench.Themes
/// <summary>
/// 保存的节点数据
/// </summary>
private NodeModelBase nodeModel;
private IFlowNode nodeModel;
private IFlowEnvironment flowEnvironment { get; set; }
private class NodeTreeModel
{
public NodeModelBase RootNode { get; set; }
public Dictionary<ConnectionInvokeType, List<NodeModelBase>> ChildNodes { get; set; }
public IFlowNode RootNode { get; set; }
public Dictionary<ConnectionInvokeType, List<IFlowNode>> ChildNodes { get; set; }
}
public void InitAndLoadTree(IFlowEnvironment flowEnvironment, NodeModelBase nodeModel)
public void InitAndLoadTree(IFlowEnvironment flowEnvironment, IFlowNode nodeModel)
{
this.flowEnvironment = flowEnvironment;
this.nodeModel = nodeModel;
@@ -46,11 +46,11 @@ namespace Serein.Workbench.Themes
public TreeViewItem RefreshTree()
{
NodeModelBase rootNodeModel = this.nodeModel;
IFlowNode rootNodeModel = this.nodeModel;
NodeTreeModel nodeTreeModel = new NodeTreeModel
{
RootNode = rootNodeModel,
ChildNodes = new Dictionary<ConnectionInvokeType, List<NodeModelBase>>()
ChildNodes = new Dictionary<ConnectionInvokeType, List<IFlowNode>>()
{
{ConnectionInvokeType.Upstream, []},
{ConnectionInvokeType.IsSucceed, [rootNodeModel]},

View File

@@ -18,14 +18,14 @@ namespace Serein.Workbench.Themes
private Dictionary<string, NodeTreeItemViewControl> globalFlipflopNodes = [];
private Dictionary<string, NodeTreeItemViewControl> unemployedNodes = [];
public void LoadNodeTreeOfStartNode(IFlowEnvironment flowEnvironment, NodeModelBase nodeModel)
public void LoadNodeTreeOfStartNode(IFlowEnvironment flowEnvironment, IFlowNode nodeModel)
{
startNodeGuid = nodeModel.Guid;
StartNodeViewer.InitAndLoadTree(flowEnvironment, nodeModel);
}
#region
public void AddGlobalFlipFlop(IFlowEnvironment flowEnvironment, NodeModelBase nodeModel)
public void AddGlobalFlipFlop(IFlowEnvironment flowEnvironment, IFlowNode nodeModel)
{
if (!globalFlipflopNodes.ContainsKey(nodeModel.Guid))
{
@@ -35,14 +35,14 @@ namespace Serein.Workbench.Themes
GlobalFlipflopNodeListbox.Items.Add(flipflopTreeViewer);
}
}
public void RefreshGlobalFlipFlop(NodeModelBase nodeModel)
public void RefreshGlobalFlipFlop(IFlowNode nodeModel)
{
if (globalFlipflopNodes.TryGetValue(nodeModel.Guid, out var viewer))
{
viewer.RefreshTree();
}
}
public void RemoveGlobalFlipFlop(NodeModelBase nodeModel)
public void RemoveGlobalFlipFlop(IFlowNode nodeModel)
{
if (globalFlipflopNodes.TryGetValue(nodeModel.Guid, out var viewer))
{
@@ -54,7 +54,7 @@ namespace Serein.Workbench.Themes
#region
public void AddUnemployed(IFlowEnvironment flowEnvironment, NodeModelBase nodeModel)
public void AddUnemployed(IFlowEnvironment flowEnvironment, IFlowNode nodeModel)
{
if (!unemployedNodes.ContainsKey(nodeModel.Guid))
{
@@ -64,14 +64,14 @@ namespace Serein.Workbench.Themes
GlobalFlipflopNodeListbox.Items.Add(flipflopTreeViewer);
}
}
public void RefreshUnemployed(NodeModelBase nodeModel)
public void RefreshUnemployed(IFlowNode nodeModel)
{
if (unemployedNodes.TryGetValue(nodeModel.Guid, out var viewer))
{
viewer.RefreshTree();
}
}
public void RemoteUnemployed(NodeModelBase nodeModel)
public void RemoteUnemployed( IFlowNode nodeModel)
{
if (unemployedNodes.TryGetValue(nodeModel.Guid, out var viewer))
{

View File

@@ -1,5 +1,6 @@
using CommunityToolkit.Mvvm.ComponentModel;
using Serein.Library;
using Serein.Library.Api;
using Serein.Workbench.Node.View;
using Serein.Workbench.Services;
using System;
@@ -18,7 +19,7 @@ namespace Serein.Workbench.ViewModels
/// 当前预览的节点
/// </summary>
[ObservableProperty]
private NodeModelBase viewNodeModel;
private IFlowNode viewNodeModel;
public ViewNodeInfoViewModel(FlowNodeService flowNodeService)
{

View File

@@ -36,7 +36,7 @@ namespace Serein.Workbench.Views
private void Grid_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (sender is Grid grid && grid.DataContext is NodeModelBase nodeModel)
if (sender is Grid grid && grid.DataContext is IFlowNode nodeModel)
{
NodeInfoViewModel.ViewNodeModel = nodeModel;
App.GetService<IFlowEnvironment>().NodeLocated(nodeModel.Guid);