重写脚本解释器的实现,提高其可读性。

This commit is contained in:
fengjiayi
2025-07-13 17:34:03 +08:00
parent 6141d2c1c1
commit 01ab905155
42 changed files with 1747 additions and 715 deletions

View File

@@ -17,6 +17,8 @@ using Serein.Workbench.Tool;
using System.ComponentModel;
using System.Diagnostics;
using Serein.Library.Api;
using Serein.Workbench.Node.ViewModel;
using Serein.Workbench.Themes;
namespace Serein.Workbench.Node.View
{
@@ -39,6 +41,7 @@ namespace Serein.Workbench.Node.View
return pen;
}
}
/// <summary>
/// 入参控件
@@ -135,7 +138,6 @@ namespace Serein.Workbench.Node.View
{
AddOrRemoveParamsAction = RemoveParamAsync;
this.Dispatcher.Invoke(InvalidateVisual);// 触发一次重绘
}
});
}
@@ -157,11 +159,11 @@ namespace Serein.Workbench.Node.View
private void AddParamAsync()
private void AddParamAsync() // 以当前选定入参连接器增加新的入参
{
this.MyNode.Env.FlowEdit.ChangeParameter(MyNode.Guid, true, ArgIndex);
}
private void RemoveParamAsync()
private void RemoveParamAsync() // 移除当前选定的入参连接器
{
this.MyNode.Env.FlowEdit.ChangeParameter(MyNode.Guid, false, ArgIndex);
}
@@ -194,18 +196,41 @@ namespace Serein.Workbench.Node.View
#region
public static readonly DependencyProperty NodeProperty =
/* public static readonly DependencyProperty NodeProperty =
DependencyProperty.Register(nameof(MyNode), typeof(IFlowNode), typeof(JunctionControlBase), new PropertyMetadata(default(IFlowNode)));
//public NodeModelBase NodeModel;
/// <summary>
/// 所在的节点
/// </summary>
public IFlowNode MyNode
{
get { return (IFlowNode)GetValue(NodeProperty); }
set { SetValue(NodeProperty, value); }
}
*/
/// <summary>
/// 对应的节点Control View Model
/// </summary>
public NodeControlViewModelBase NodeViewModel
{
get { return (NodeControlViewModelBase)GetValue(NodeViewModelProperty); }
set { SetValue(NodeViewModelProperty, value); }
}
public static readonly DependencyProperty NodeViewModelProperty =
DependencyProperty.Register(nameof(NodeViewModel), typeof(NodeControlViewModelBase), typeof(JunctionControlBase), new PropertyMetadata(default(IFlowNode)));
/// <summary>
/// 对应的节点Guid
/// </summary>
public string NodeGuid
{
get
{
return NodeViewModel?.NodeModel.Guid ?? string.Empty;
}
}
#endregion
#region
@@ -253,13 +278,8 @@ namespace Serein.Workbench.Node.View
{
if(_isMouseOver != value)
{
if(flowNodeService is not null)
{
flowNodeService.ConnectingData.CurrentJunction = this;
}
_isMouseOver = value;
InvalidateVisual();
}
}
@@ -326,7 +346,11 @@ namespace Serein.Workbench.Node.View
//if (IsMouseOver) return;
IsMouseOver = true;
flowNodeService.ConnectingData.CurrentJunction = this;
InvalidateVisual();
//Debug.WriteLine(NodeGuid);
//this.InvalidateVisual();
}
@@ -339,7 +363,8 @@ namespace Serein.Workbench.Node.View
{
IsMouseOver = false;
e.Handled = true;
flowNodeService.ConnectingData.CurrentJunction = this;
InvalidateVisual();
}

View File

@@ -86,7 +86,7 @@ namespace Serein.Workbench.Node.View
}
if (!StartJunction.MyNode.Equals(CurrentJunction.MyNode)
if (!StartJunction.NodeGuid.Equals(CurrentJunction.NodeGuid)
&& StartJunction.JunctionType.IsCanConnection(CurrentJunction.JunctionType))
{
return true;
@@ -139,23 +139,5 @@ namespace Serein.Workbench.Node.View
}
public static class GlobalJunctionData1
{
//private static ConnectingData? myGlobalData;
//private static object _lockObj = new object();
/// <summary>
/// 创建节点之间控制点的连接行为
/// </summary>
public static ConnectingData MyGlobalConnectingData { get; } = new ConnectingData();
/// <summary>
/// 删除连接视觉效果
/// </summary>
public static void OK()
{
MyGlobalConnectingData.Reset();
}
}
#endregion
}

View File

@@ -15,7 +15,7 @@ namespace Serein.Workbench.Node.View
#region
public static readonly DependencyProperty ArgIndexProperty =
DependencyProperty.Register("ArgIndex", typeof(int), typeof(ArgJunctionControl), new PropertyMetadata(default(int)));
DependencyProperty.Register(nameof(ArgIndex), typeof(int), typeof(ArgJunctionControl), new PropertyMetadata(default(int)));
/// <summary>
/// 所在的节点

View File

@@ -62,15 +62,15 @@
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<local:ExecuteJunctionControl Grid.Column="0" MyNode="{Binding NodeModel}" x:Name="ExecuteJunctionControl" HorizontalAlignment="Left" Grid.RowSpan="2"/>
<local:ExecuteJunctionControl Grid.Column="0" NodeViewModel="{Binding}" x:Name="ExecuteJunctionControl" HorizontalAlignment="Left" Grid.RowSpan="2"/>
<StackPanel Grid.Column="1" Grid.RowSpan="2" >
<TextBlock Text="{Binding NodeModel.DisplayName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center"/>
</StackPanel>
<local:NextStepJunctionControl Grid.Column="2" MyNode="{Binding NodeModel}" x:Name="NextStepJunctionControl" HorizontalAlignment="Right" Grid.RowSpan="2"/>
<local:NextStepJunctionControl Grid.Column="2" NodeViewModel="{Binding}" x:Name="NextStepJunctionControl" HorizontalAlignment="Right" Grid.RowSpan="2"/>
</Grid>
<themes:MethodDetailsControl Grid.Row="2" x:Name="MethodDetailsControl" MethodDetails="{Binding NodeModel.MethodDetails}"/>
<themes:MethodDetailsControl Grid.Row="2" x:Name="MethodDetailsControl" MethodDetails="{Binding NodeModel.MethodDetails}" NodeViewModel="{Binding}"/>
<Border Grid.Row="2" x:Name="ParameterProtectionMask" Background="#40508D" Opacity="0.5" BorderThickness="0"
Visibility="{Binding NodeModel.DebugSetting.IsProtectionParameter, Mode=TwoWay,
@@ -90,7 +90,7 @@
</Border>
<Border Grid.Column="2" BorderThickness="1">
<local:ResultJunctionControl Grid.Column="2" MyNode="{Binding NodeModel}" x:Name="ResultJunctionControl" HorizontalAlignment="Right"/>
<local:ResultJunctionControl Grid.Column="2" NodeViewModel="{Binding}" x:Name="ResultJunctionControl" HorizontalAlignment="Right"/>
</Border>
</Grid>

View File

@@ -18,10 +18,10 @@ namespace Serein.Workbench.Node.View
{
DataContext = viewModel;
InitializeComponent();
if(ExecuteJunctionControl.MyNode != null)
/*if(ExecuteJunctionControl.MyNode != null)
{
ExecuteJunctionControl.MyNode.Guid = viewModel.NodeModel.Guid;
}
}*/
}
/// <summary>

View File

@@ -37,11 +37,11 @@
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<local:ExecuteJunctionControl Grid.Column="0" MyNode="{Binding NodeModel}" x:Name="ExecuteJunctionControl" HorizontalAlignment="Left" Grid.RowSpan="2"/>
<local:ExecuteJunctionControl Grid.Column="0" NodeViewModel="{Binding}" x:Name="ExecuteJunctionControl" HorizontalAlignment="Left" Grid.RowSpan="2"/>
<Border Grid.Column="1" BorderThickness="1" HorizontalAlignment="Stretch">
<TextBlock Text="{Binding NodeModel.DisplayName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center"/>
</Border>
<local:NextStepJunctionControl Grid.Column="2" MyNode="{Binding NodeModel}" x:Name="NextStepJunctionControl" HorizontalAlignment="Right" Grid.RowSpan="2"/>
<local:NextStepJunctionControl Grid.Column="2" NodeViewModel="{Binding}" x:Name="NextStepJunctionControl" HorizontalAlignment="Right" Grid.RowSpan="2"/>
</Grid>
@@ -55,7 +55,7 @@
<ColumnDefinition Width="20"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<local:ArgJunctionControl Grid.Column="0" x:Name="ArgJunctionControl" ArgIndex="0" MyNode="{Binding NodeModel}" />
<local:ArgJunctionControl Grid.Column="0" x:Name="ArgJunctionControl" ArgIndex="0" NodeViewModel="{Binding}" />
<CheckBox Grid.Column="1" IsChecked="{Binding NodeModel.IsExplicitData, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center"/> <!--Converter={StaticResource BoolToVis}-->
<TextBox Grid.Column="2" MinWidth="50" Text="{Binding NodeModel.ExplicitData, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
HorizontalAlignment="Stretch"
@@ -94,7 +94,7 @@
<TextBox IsEnabled="{Binding IsEnabledOnView}" Grid.Column="0" Background="#FEFAF4" MinWidth="100" Text="{Binding NodeModel.Expression, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
<local:ResultJunctionControl Grid.Column="1" MyNode="{Binding NodeModel}" x:Name="ResultJunctionControl" HorizontalAlignment="Right"/>
<local:ResultJunctionControl Grid.Column="1" NodeViewModel="{Binding}" x:Name="ResultJunctionControl" HorizontalAlignment="Right"/>
</Grid>
</Grid>

View File

@@ -3,6 +3,7 @@ using Serein.Library.Api;
using Serein.Workbench.Api;
using Serein.Workbench.Extension;
using Serein.Workbench.Tool;
using Serein.Workbench.ViewModels;
using System;
using System.Net;
using System.Windows;
@@ -260,17 +261,17 @@ namespace Serein.Workbench.Node.View
//
Canvas.Children.Remove(BezierLine);
var env = Start.MyNode.Env;
var canvasGuid = Start.MyNode.CanvasDetails.Guid;
var env = App.GetService<IFlowEnvironment>();
var canvasGuid = ((FlowCanvasViewModel)(Canvas.DataContext)).Model.Guid;
var jct = Start.JunctionType.ToConnectyionType();
var jctEnd = End.JunctionType.ToConnectyionType();
if (jct == JunctionOfConnectionType.Invoke)
{
env.FlowEdit.RemoveInvokeConnect(canvasGuid, Start.MyNode.Guid, End.MyNode.Guid, InvokeType);
env.FlowEdit.RemoveInvokeConnect(canvasGuid, Start.NodeGuid, End.NodeGuid, InvokeType);
}
else if (jct == JunctionOfConnectionType.Arg)
{
env.FlowEdit.RemoveArgSourceConnect(canvasGuid, Start.MyNode.Guid, End.MyNode.Guid, ArgIndex);
env.FlowEdit.RemoveArgSourceConnect(canvasGuid, Start.NodeGuid, End.NodeGuid, ArgIndex);
}
}
@@ -279,10 +280,10 @@ namespace Serein.Workbench.Node.View
/// </summary>
public void Topping()
{
var env = Start.MyNode.Env;
var env = App.GetService<IFlowEnvironment>();
if (Start.JunctionType.ToConnectyionType() == JunctionOfConnectionType.Invoke)
{
env.FlowEdit.SetConnectPriorityInvoke(Start.MyNode.Guid, End.MyNode.Guid, InvokeType);
env.FlowEdit.SetConnectPriorityInvoke(Start.NodeGuid, End.NodeGuid, InvokeType);
}
}

View File

@@ -25,11 +25,11 @@
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<local:ExecuteJunctionControl Grid.Column="0" MyNode="{Binding NodeModel}" x:Name="ExecuteJunctionControl" HorizontalAlignment="Left" Grid.RowSpan="2"/>
<local:ExecuteJunctionControl Grid.Column="0" NodeViewModel="{Binding}" x:Name="ExecuteJunctionControl" HorizontalAlignment="Left" Grid.RowSpan="2"/>
<Border Grid.Column="1" BorderThickness="1" HorizontalAlignment="Stretch">
<TextBlock Text="{Binding NodeModel.DisplayName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center"/>
</Border>
<local:NextStepJunctionControl Grid.Column="2" MyNode="{Binding NodeModel}" x:Name="NextStepJunctionControl" HorizontalAlignment="Right" Grid.RowSpan="2"/>
<local:NextStepJunctionControl Grid.Column="2" NodeViewModel="{Binding}" x:Name="NextStepJunctionControl" HorizontalAlignment="Right" Grid.RowSpan="2"/>
</Grid>
<Grid Grid.Row="1" Background="#FEFAF4">
@@ -38,9 +38,9 @@
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<local:ArgJunctionControl Grid.Column="0" x:Name="ArgJunctionControl" ArgIndex="0" MyNode="{Binding NodeModel}" />
<local:ArgJunctionControl Grid.Column="0" x:Name="ArgJunctionControl" ArgIndex="0" NodeViewModel="{Binding}" />
<TextBox Grid.Column="1" IsEnabled="{Binding IsEnabledOnView}" Text="{Binding NodeModel.Expression, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Stretch"></TextBox>
<local:ResultJunctionControl Grid.Column="2" MyNode="{Binding NodeModel}" x:Name="ResultJunctionControl" HorizontalAlignment="Right"/>
<local:ResultJunctionControl Grid.Column="2" NodeViewModel="{Binding}" x:Name="ResultJunctionControl" HorizontalAlignment="Right"/>
</Grid>
</Grid>

View File

@@ -43,16 +43,16 @@
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<local:ExecuteJunctionControl Grid.Column="0" MyNode="{Binding NodeModel}" x:Name="ExecuteJunctionControl" HorizontalAlignment="Left" Grid.RowSpan="2"/>
<local:ExecuteJunctionControl Grid.Column="0" NodeViewModel="{Binding}" x:Name="ExecuteJunctionControl" HorizontalAlignment="Left" Grid.RowSpan="2"/>
<StackPanel Grid.Column="1" Grid.RowSpan="2" >
<TextBlock Text="{Binding NodeModel.DisplayName, Mode=TwoWay}" HorizontalAlignment="Center"/>
</StackPanel>
<local:NextStepJunctionControl Grid.Column="2" MyNode="{Binding NodeModel}" x:Name="NextStepJunctionControl" HorizontalAlignment="Right" Grid.RowSpan="2"/>
<local:NextStepJunctionControl Grid.Column="2" NodeViewModel="{Binding}" x:Name="NextStepJunctionControl" HorizontalAlignment="Right" Grid.RowSpan="2"/>
</Grid>
<!--方法描述-->
<themes:MethodDetailsControl x:Name="MethodDetailsControl" Grid.Row="1" MethodDetails="{Binding NodeModel.MethodDetails}" />
<themes:MethodDetailsControl x:Name="MethodDetailsControl" Grid.Row="1" MethodDetails="{Binding NodeModel.MethodDetails}" NodeViewModel="{Binding}"/>
<Border Grid.Row="2" x:Name="ParameterProtectionMask" Background="#40508D" Opacity="0.5" BorderBrush="#0A4651" BorderThickness="0"
Visibility="{Binding NodeModel.DebugSetting.IsProtectionParameter, Converter={StaticResource InvertedBoolConverter},ConverterParameter=Normal}" />
@@ -74,7 +74,7 @@
</Border>
<Border Grid.Column="2" BorderThickness="1">
<local:ResultJunctionControl Grid.Column="2" MyNode="{Binding NodeModel}" x:Name="ResultJunctionControl" HorizontalAlignment="Right"/>
<local:ResultJunctionControl Grid.Column="2" NodeViewModel="{Binding}" x:Name="ResultJunctionControl" HorizontalAlignment="Right"/>
</Border>
</Grid>

View File

@@ -64,7 +64,7 @@
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<local:ExecuteJunctionControl Grid.Column="0" MyNode="{Binding NodeModel}" x:Name="ExecuteJunctionControl" HorizontalAlignment="Left" Grid.RowSpan="2"/>
<local:ExecuteJunctionControl Grid.Column="0" NodeViewModel="{Binding}" x:Name="ExecuteJunctionControl" HorizontalAlignment="Left" Grid.RowSpan="2"/>
<StackPanel Grid.Column="1" Grid.RowSpan="2" Orientation="Horizontal">
<TextBlock Text="{Binding NodeModel.DisplayName, Mode=TwoWay}" HorizontalAlignment="Center"/>
@@ -109,7 +109,7 @@
<TextBlock Text="接口名称" Grid.Row="2" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Center" Width="50"/>
<TextBox Text="{Binding FlowCallNode.ApiGlobalName, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Row="2" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Left" Width="{Binding ElementName=MethodDetailsControl,Path=ActualWidth}"/>
<themes:MethodDetailsControl Grid.Row="3" Grid.ColumnSpan="2" x:Name="MethodDetailsControl">
<themes:MethodDetailsControl Grid.Row="3" Grid.ColumnSpan="2" x:Name="MethodDetailsControl" NodeViewModel="{Binding}">
<themes:MethodDetailsControl.MethodDetails>
<MultiBinding Converter="{StaticResource MethodDetailsSelector}">
<Binding Path="FlowCallNode.IsShareParam" UpdateSourceTrigger="PropertyChanged"/>

View File

@@ -35,11 +35,11 @@
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<local:ExecuteJunctionControl Grid.Column="0" MyNode="{Binding NodeModel}" x:Name="ExecuteJunctionControl" HorizontalAlignment="Left" Grid.RowSpan="2"/>
<local:ExecuteJunctionControl Grid.Column="0" NodeViewModel="{Binding}" x:Name="ExecuteJunctionControl" HorizontalAlignment="Left" Grid.RowSpan="2"/>
<Border Grid.Column="1" BorderThickness="1" HorizontalAlignment="Stretch">
<TextBlock Text="{Binding NodeModel.DisplayName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center"/>
</Border>
<local:NextStepJunctionControl Grid.Column="2" MyNode="{Binding NodeModel}" x:Name="NextStepJunctionControl" HorizontalAlignment="Right" Grid.RowSpan="2"/>
<local:NextStepJunctionControl Grid.Column="2" NodeViewModel="{Binding}" x:Name="NextStepJunctionControl" HorizontalAlignment="Right" Grid.RowSpan="2"/>
</Grid>

View File

@@ -30,11 +30,11 @@
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<local:ExecuteJunctionControl Grid.Column="0" MyNode="{Binding NodeModel}" x:Name="ExecuteJunctionControl" HorizontalAlignment="Left" Grid.RowSpan="2"/>
<local:ExecuteJunctionControl Grid.Column="0" NodeViewModel="{Binding}" x:Name="ExecuteJunctionControl" HorizontalAlignment="Left" Grid.RowSpan="2"/>
<Border Grid.Column="1" BorderThickness="1" HorizontalAlignment="Stretch">
<TextBlock Text="C#脚本节点" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<local:NextStepJunctionControl Grid.Column="2" MyNode="{Binding NodeModel}" x:Name="NextStepJunctionControl" HorizontalAlignment="Right" Grid.RowSpan="2"/>
<local:NextStepJunctionControl Grid.Column="2" NodeViewModel="{Binding}" x:Name="NextStepJunctionControl" HorizontalAlignment="Right" Grid.RowSpan="2"/>
</Grid>

View File

@@ -29,11 +29,11 @@
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<local:ExecuteJunctionControl Grid.Column="0" MyNode="{Binding NodeModel}" x:Name="ExecuteJunctionControl" HorizontalAlignment="Left" Grid.RowSpan="2"/>
<local:ExecuteJunctionControl Grid.Column="0" NodeViewModel="{Binding}" x:Name="ExecuteJunctionControl" HorizontalAlignment="Left" Grid.RowSpan="2"/>
<Border Grid.Column="1" BorderThickness="1" HorizontalAlignment="Stretch">
<TextBlock Text="{Binding NodeModel.DisplayName, Mode=TwoWay}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<local:NextStepJunctionControl Grid.Column="2" MyNode="{Binding NodeModel}" x:Name="NextStepJunctionControl" HorizontalAlignment="Right" Grid.RowSpan="2"/>
<local:NextStepJunctionControl Grid.Column="2" NodeViewModel="{Binding}" x:Name="NextStepJunctionControl" HorizontalAlignment="Right" Grid.RowSpan="2"/>
</Grid>
@@ -54,9 +54,8 @@
<Button Content="加载" Margin="3,0,1,0" Command="{Binding CommandLoadScript}" Height="17.2"></Button>
<Button Content="执行" Margin="3,0,1,0" Command="{Binding CommandExecuting}" Height="17.2"></Button>
<!--<Button Content="刷新 " Command="{Binding CommandCopyDataExp}" Height="17.2" Margin="2,0,0,0"></Button>-->
</StackPanel>
<themes:MethodDetailsControl Grid.Row="1" x:Name="MethodDetailsControl" MethodDetails="{Binding NodeModel.MethodDetails}"/>
<themes:MethodDetailsControl Grid.Row="1" x:Name="MethodDetailsControl" MethodDetails="{Binding NodeModel.MethodDetails}" NodeViewModel="{Binding}"/>
<TextBox Grid.Row="2" MinHeight="20" MinWidth="100" MaxWidth="270" TextWrapping="Wrap" AcceptsReturn="True" IsEnabled="{Binding IsEnabledOnView}" Text="{Binding Script}"></TextBox>
<Grid Grid.Row="3" >
<Grid.ColumnDefinitions>
@@ -68,11 +67,11 @@
<TextBlock Text="result ->" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
<Border Grid.Column="1" BorderThickness="1">
<TextBlock Text="{Binding NodeModel.MethodDetails.ReturnType.FullName, Mode=OneTime}" TextTrimming="CharacterEllipsis" HorizontalAlignment="Left" VerticalAlignment="Center"/>
<TextBlock Text="{Binding NodeModel.MethodDetails.ReturnType}" TextTrimming="CharacterEllipsis" HorizontalAlignment="Left" VerticalAlignment="Center"/>
</Border>
<Border Grid.Column="2" BorderThickness="1">
<local:ResultJunctionControl Grid.Column="2" MyNode="{Binding NodeModel}" x:Name="ResultJunctionControl" HorizontalAlignment="Right"/>
<local:ResultJunctionControl Grid.Column="2" NodeViewModel="{Binding}" x:Name="ResultJunctionControl" HorizontalAlignment="Right"/>
</Border>

View File

@@ -25,7 +25,7 @@
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<local:ExecuteJunctionControl Grid.Column="0" MyNode="{Binding NodeModel}" x:Name="ExecuteJunctionControl" HorizontalAlignment="Left" Grid.RowSpan="2"/>
<local:ExecuteJunctionControl Grid.Column="0" NodeViewModel="{Binding}" x:Name="ExecuteJunctionControl" HorizontalAlignment="Left" Grid.RowSpan="2"/>
<Border Grid.Column="1" BorderThickness="1" HorizontalAlignment="Stretch">
<TextBlock Text="{Binding NodeModel.DisplayName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center"/>
</Border>

View File

@@ -83,22 +83,32 @@ namespace Serein.Workbench.Node.ViewModel
}
/// <summary>
/// 选择画布发生改变
/// </summary>
/// <param name="value"></param>
partial void OnSelectCanvasChanged(FlowCanvasViewModel value)
{
FlowCallNode.ResetTargetNode();
FlowCallNode.ResetTargetNode(); // 改变画布直接重置
}
/// <summary>
/// 选择的节点发生改变
/// </summary>
/// <param name="value"></param>
partial void OnSelectNodeChanged(IFlowNode value)
{
if(value is null)
{
FlowCallNode.ResetTargetNode();
FlowCallNode.ResetTargetNode(); // 如果是不选择了,则重置一下
return;
}
FlowCallNode.SetTargetNode(value.Guid);
FlowCallNode.SetTargetNode(value.Guid); // 重新设置目标节点
}
/// <summary>
/// 刷新可选画布
/// </summary>
private void RershCanvass()
{
var canvass = flowNodeService.FlowCanvass.Select(f => (FlowCanvasViewModel)f.DataContext).ToArray(); // .Where(f => f.Model.PublicNodes.Count > 0)

View File

@@ -345,10 +345,6 @@ namespace Serein.Workbench.Services
}
#endregion
//if (nodeModel.ControlType == NodeControlType.FlowCall)
//{
// Console.WriteLine("test");
//}
#region

View File

@@ -19,13 +19,13 @@
<Style TargetType="{x:Type local:MethodDetailsControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:MethodDetailsControl}">
<ControlTemplate x:Name="MethodControlTemplate" TargetType="{x:Type local:MethodDetailsControl}">
<!--根据方法入参数量生成相应的控件-->
<ItemsControl ItemsSource="{Binding MethodDetails.ParameterDetailss, RelativeSource={RelativeSource TemplatedParent}}" Background="#E3FDFD" >
<ItemsControl.ItemTemplate>
<DataTemplate DataType="serein:ParameterData">
<Grid DataContext="{Binding}">
<Grid DataContext="{Binding}" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="auto"/>
@@ -35,12 +35,15 @@
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<!--连接控制器-->
<view:ArgJunctionControl x:Name="ArgJunctionControl" Grid.Column="0" ArgIndex="{Binding Index}" MyNode="{Binding NodeModel}" />
<!--参数索引提示-->
<!--<TextBlock Grid.Column="1" Text="{Binding Index,StringFormat=agr{0}}" Margin="2,0,2,0" VerticalAlignment="Center"/>-->
<view:ArgJunctionControl x:Name="ArgJunctionControl" Grid.Column="0" ArgIndex="{Binding Index}"
NodeViewModel="{Binding NodeViewModel,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MethodDetailsControl}}}" />
<!--是否设置为显式参数-->
<CheckBox Grid.Column="2" IsChecked="{Binding IsExplicitData, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="2,0,2,0" VerticalContentAlignment="Center"/>
<CheckBox Grid.Column="1" IsChecked="{Binding IsExplicitData, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="2,0,2,0" VerticalContentAlignment="Center"/>
<!--参数类型提示-->
<TextBlock Grid.Column="2" Text="{Binding DataType}" Margin="2,0,2,0" VerticalAlignment="Center"/>
<!--入参参数名称-->

View File

@@ -1,5 +1,7 @@
using Serein.Library;
using Serein.Workbench.Node;
using Serein.Workbench.Node.View;
using Serein.Workbench.Node.ViewModel;
using System.Collections;
using System.Globalization;
using System.Windows;
@@ -98,9 +100,21 @@ namespace Serein.Workbench.Themes
set { SetValue(MethodDetailsProperty, value); }
}
public static readonly DependencyProperty MethodDetailsProperty = DependencyProperty.Register(nameof(MethodDetails), typeof(MethodDetails),
typeof(MethodDetailsControl), new PropertyMetadata(null, new PropertyChangedCallback(OnPropertyChange)));
public NodeControlViewModelBase NodeViewModel
{
get { return (NodeControlViewModelBase)GetValue(NodeViewModelProperty); }
set { SetValue(NodeViewModelProperty, value); }
}
public static readonly DependencyProperty NodeViewModelProperty = DependencyProperty.Register(nameof(NodeViewModel), typeof(NodeControlViewModelBase),
typeof(MethodDetailsControl), new PropertyMetadata(null, new PropertyChangedCallback(OnPropertyChange)));
#endregion

View File

@@ -190,8 +190,8 @@ namespace Serein.Workbench.Views
var connectionControl = Connections.FirstOrDefault(c =>
{
if (c.Start.MyNode.Guid != e.FromNodeGuid
|| c.End.MyNode.Guid != e.ToNodeGuid)
if (c.Start.NodeGuid != e.FromNodeGuid
|| c.End.NodeGuid != e.ToNodeGuid)
{
return false; // 不是当前连接
}
@@ -312,33 +312,6 @@ namespace Serein.Workbench.Views
RefreshAllLine();
}
/// <summary>
/// 当前画布创建了节点
/// </summary>
/// <param name="nodeControl"></param>
/* private void OnCreateNode(NodeControlBase nodeControl)
{
if (!nodeControl.FlowCanvas.Guid.Equals(Guid)) // 防止事件传播到其它画布
{
return;
}
var p = nodeControl.ViewModel.NodeModel.Position;
PositionOfUI position = new PositionOfUI(p.X, p.Y);
if (TryPlaceNodeInRegion(nodeControl, position, out var regionControl)) // 判断添加到区域容器
{
// 通知运行环境调用加载节点子项的方法
_ = flowEnvironment.PlaceNodeToContainerAsync(Guid,
nodeControl.ViewModel.NodeModel.Guid, // 待移动的节点
regionControl.ViewModel.NodeModel.Guid); // 目标的容器节点
}
else
{
// 并非添加在容器中,直接放置节点
Api.Add(nodeControl); // 添加到对应的画布上
}
}*/
/// <summary>
/// 尝试判断是否为区域,如果是,将节点放置在区域中
@@ -388,15 +361,11 @@ namespace Serein.Workbench.Views
#region
private IFlowCanvas Api => this;
public string Guid
{
get
{
return ViewModel.Model.Guid;
}
}
/// <inheritdoc/>
public string Guid => ViewModel.Model.Guid;
public string Name => ViewModel.Model.Name;
/// <inheritdoc/>
public new string Name => ViewModel.Model.Name;
FlowCanvasDetails IFlowCanvas.Model => ViewModel.Model;
void IFlowCanvas.Remove(NodeControlBase nodeControl)
{
@@ -559,8 +528,8 @@ namespace Serein.Workbench.Views
JunctionControlBase endJunction = IToJunction.ExecuteJunction;
var removeConnections = Connections.Where(c =>
c.Start.MyNode.Guid == startJunction.MyNode.Guid
&& c.End.MyNode.Guid == endJunction.MyNode.Guid
c.Start.NodeGuid == startJunction.NodeGuid
&& c.End.NodeGuid == endJunction.NodeGuid
&& (c.Start.JunctionType.ToConnectyionType() == JunctionOfConnectionType.Arg
|| c.End.JunctionType.ToConnectyionType() == JunctionOfConnectionType.Arg))
.ToList();
@@ -941,8 +910,8 @@ namespace Serein.Workbench.Views
flowEnvironment.FlowEdit.ConnectInvokeNode(
canvasGuid,
cd.StartJunction.MyNode.Guid,
cd.CurrentJunction.MyNode.Guid,
cd.StartJunction.NodeGuid,
cd.CurrentJunction.NodeGuid,
cd.StartJunction.JunctionType,
cd.CurrentJunction.JunctionType,
cd.ConnectionInvokeType);
@@ -952,23 +921,31 @@ namespace Serein.Workbench.Views
#region
else if (cd.Type == JunctionOfConnectionType.Arg)
{
var canvasGuid = this.Guid;
var argIndex = 0;
var startNodeGuid = "";
var toNodeGuid = "";
if (cd.StartJunction is ArgJunctionControl argJunction1)
{
startNodeGuid = cd.CurrentJunction.NodeGuid;
argIndex = argJunction1.ArgIndex;
toNodeGuid = argJunction1.NodeGuid;
}
else if (cd.CurrentJunction is ArgJunctionControl argJunction2)
{
startNodeGuid = cd.StartJunction.NodeGuid;
startNodeGuid = cd.StartJunction.NodeGuid;
argIndex = argJunction2.ArgIndex;
toNodeGuid = argJunction2.NodeGuid;
}
var canvasGuid = this.Guid;
flowEnvironment.FlowEdit.ConnectArgSourceNode(
canvasGuid,
cd.StartJunction.MyNode.Guid,
cd.CurrentJunction.MyNode.Guid,
cd.StartJunction.JunctionType,
cd.CurrentJunction.JunctionType,
startNodeGuid,
toNodeGuid,
JunctionType.ReturnData,
JunctionType.ArgData,
cd.ConnectionArgSourceType,
argIndex);
}
@@ -1335,7 +1312,7 @@ namespace Serein.Workbench.Views
nodeControl.MouseLeftButtonDown += Block_MouseLeftButtonDown;
nodeControl.MouseMove += Block_MouseMove;
nodeControl.MouseLeftButtonUp += Block_MouseLeftButtonUp;
}
@@ -1367,11 +1344,18 @@ namespace Serein.Workbench.Views
if (IsSelectControl)
return;
if(sender is not NodeControlBase nodeControlMain)
{
return;
}
flowNodeService.CurrentSelectNodeControl = nodeControlMain;
if (IsControlDragging && !flowNodeService.ConnectingData.IsCreateing) // 如果正在拖动控件
{
Point currentPosition = e.GetPosition(FlowChartCanvas); // 获取当前鼠标位置
if (selectNodeControls.Count > 0 && sender is NodeControlBase nodeControlMain && selectNodeControls.Contains(nodeControlMain))
if (selectNodeControls.Count > 0 && selectNodeControls.Contains(nodeControlMain))
{
// 进行批量移动
// 获取旧位置
@@ -1419,28 +1403,24 @@ namespace Serein.Workbench.Views
}
else
{ // 单个节点移动
if (sender is not NodeControlBase nodeControl)
{
return;
}
double deltaX = currentPosition.X - startControlDragPoint.X; // 计算X轴方向的偏移量
double deltaY = currentPosition.Y - startControlDragPoint.Y; // 计算Y轴方向的偏移量
double newLeft = Canvas.GetLeft(nodeControl) + deltaX; // 新的左边距
double newTop = Canvas.GetTop(nodeControl) + deltaY; // 新的上边距
double newLeft = Canvas.GetLeft(nodeControlMain) + deltaX; // 新的左边距
double newTop = Canvas.GetTop(nodeControlMain) + deltaY; // 新的上边距
// 如果被移动的控件接触到画布边缘,则限制移动范围
var canvasModel = nodeControl.FlowCanvas.Model;
var canvasWidth = canvasModel.Width - nodeControl.ActualWidth - 10;
var canvasHeight= canvasModel.Height - nodeControl.ActualHeight - 10;
var canvasModel = nodeControlMain.FlowCanvas.Model;
var canvasWidth = canvasModel.Width - nodeControlMain.ActualWidth - 10;
var canvasHeight= canvasModel.Height - nodeControlMain.ActualHeight - 10;
newLeft = newLeft < 5 ? 5 : newLeft > canvasWidth ? canvasWidth : newLeft;
newTop = newTop < 5 ? 5 : newTop > canvasHeight ? canvasHeight : newTop;
var node = nodeControl.ViewModel.NodeModel;
var node = nodeControlMain.ViewModel.NodeModel;
node.Position.X = newLeft;
node.Position.Y = newTop;
//this.flowEnvironment.MoveNode(Guid, nodeControl.ViewModel.NodeModel.Guid, newLeft, newTop); // 移动节点
nodeControl.UpdateLocationConnections();
nodeControlMain.UpdateLocationConnections();
}
startControlDragPoint = currentPosition; // 更新起始点位置
}