修复了删除参数连接关系时导致调用关系也被删除的bug

This commit is contained in:
fengjiayi
2025-05-30 14:05:20 +08:00
parent 00c0a4d387
commit 9c4e5b2735
5 changed files with 24 additions and 26 deletions

View File

@@ -15,6 +15,7 @@ using System.Threading;
using Serein.Workbench.Services; using Serein.Workbench.Services;
using Serein.Workbench.Tool; using Serein.Workbench.Tool;
using System.ComponentModel; using System.ComponentModel;
using System.Diagnostics;
namespace Serein.Workbench.Node.View namespace Serein.Workbench.Node.View
{ {
@@ -48,7 +49,7 @@ namespace Serein.Workbench.Node.View
this.MouseDown += ParamsArg_OnMouseDown; // 增加或删除 this.MouseDown += ParamsArg_OnMouseDown; // 增加或删除
this.MouseMove += ParamsArgControl_MouseMove; this.MouseMove += ParamsArgControl_MouseMove;
this.MouseLeave += ParamsArgControl_MouseLeave; this.MouseLeave += ParamsArgControl_MouseLeave;
AddOrRemoveParamsTask = AddAsync; AddOrRemoveParamsTask = AddParamAsync;
} }
@@ -120,18 +121,18 @@ namespace Serein.Workbench.Node.View
private void ParamsArgControl_MouseMove(object sender, MouseEventArgs e) private void ParamsArgControl_MouseMove(object sender, MouseEventArgs e)
{ {
isMouseOver = true; isMouseOver = true;
if (cancellationTokenSource.IsCancellationRequested) { if (cts.IsCancellationRequested) {
cancellationTokenSource = new CancellationTokenSource(); cts = new CancellationTokenSource();
Task.Run(async () => Task.Run(async () =>
{ {
await Task.Delay(380); await Task.Delay(380);
}, cancellationTokenSource.Token).ContinueWith((t) => }, cts.Token).ContinueWith((t) =>
{ {
// 如果焦点仍在控件上时,则改变点击事件 // 如果焦点仍在控件上时,则改变点击事件
if (isMouseOver) if (isMouseOver)
{ {
AddOrRemoveParamsTask = RemoveAsync; AddOrRemoveParamsTask = RemoveParamAsync;
this.Dispatcher.Invoke(InvalidateVisual);// 触发一次重绘 this.Dispatcher.Invoke(InvalidateVisual);// 触发一次重绘
} }
@@ -139,24 +140,27 @@ namespace Serein.Workbench.Node.View
} }
} }
private CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
private CancellationTokenSource cts = new CancellationTokenSource();
private void ParamsArgControl_MouseLeave(object sender, MouseEventArgs e) private void ParamsArgControl_MouseLeave(object sender, MouseEventArgs e)
{ {
isMouseOver = false; isMouseOver = false;
AddOrRemoveParamsTask = AddAsync; // 鼠标焦点离开时恢复点击事件 AddOrRemoveParamsTask = AddParamAsync; // 鼠标焦点离开时恢复点击事件
cancellationTokenSource?.Cancel(); cts?.Cancel();
this.Dispatcher.Invoke(InvalidateVisual);// 触发一次重绘 this.Dispatcher.Invoke(InvalidateVisual);// 触发一次重绘
} }
private async Task AddAsync()
private async Task AddParamAsync()
{ {
await this.MyNode.Env.ChangeParameter(MyNode.Guid, true, ArgIndex); await this.MyNode.Env.ChangeParameter(MyNode.Guid, true, ArgIndex);
} }
private async Task RemoveAsync() private async Task RemoveParamAsync()
{ {
await this.MyNode.Env.ChangeParameter(MyNode.Guid, false, ArgIndex); await this.MyNode.Env.ChangeParameter(MyNode.Guid, false, ArgIndex);
} }
@@ -347,7 +351,7 @@ namespace Serein.Workbench.Node.View
{ {
if (e.LeftButton == MouseButtonState.Pressed) if (e.LeftButton == MouseButtonState.Pressed)
{ {
var canvas = WpfFuncTool.GetParentOfType<Canvas>(this); var canvas = WpfFuncTool.GetParentOfType<Canvas>(this);
if (canvas != null) if (canvas != null)
{ {
var cd = flowNodeService.ConnectingData; var cd = flowNodeService.ConnectingData;
@@ -358,6 +362,7 @@ namespace Serein.Workbench.Node.View
cd.StartPoint = this.TranslatePoint(new Point(this.Width / 2, this.Height / 2), canvas); cd.StartPoint = this.TranslatePoint(new Point(this.Width / 2, this.Height / 2), canvas);
var junctionOfConnectionType = this.JunctionType.ToConnectyionType(); var junctionOfConnectionType = this.JunctionType.ToConnectyionType();
//Debug.WriteLine(this.JunctionType);
ConnectionLineShape bezierLine; // 类别 ConnectionLineShape bezierLine; // 类别
Brush brushColor; // 临时线的颜色 Brush brushColor; // 临时线的颜色
if (junctionOfConnectionType == JunctionOfConnectionType.Invoke) if (junctionOfConnectionType == JunctionOfConnectionType.Invoke)

View File

@@ -8,8 +8,6 @@ namespace Serein.Workbench.Node.View
public class ResultJunctionControl : JunctionControlBase public class ResultJunctionControl : JunctionControlBase
{ {
//public override JunctionType JunctionType { get; } = JunctionType.ReturnData;
public ResultJunctionControl() public ResultJunctionControl()
{ {
base.JunctionType = JunctionType.ReturnData; base.JunctionType = JunctionType.ReturnData;

View File

@@ -239,11 +239,13 @@ namespace Serein.Workbench.Node.View
Canvas.Children.Remove(BezierLine); Canvas.Children.Remove(BezierLine);
var env = Start.MyNode.Env; var env = Start.MyNode.Env;
var canvasGuid = Start.MyNode.CanvasDetails.Guid; var canvasGuid = Start.MyNode.CanvasDetails.Guid;
if (Start.JunctionType.ToConnectyionType() == JunctionOfConnectionType.Invoke) var jct = Start.JunctionType.ToConnectyionType();
var jctEnd = End.JunctionType.ToConnectyionType();
if (jct == JunctionOfConnectionType.Invoke)
{ {
env.RemoveConnectInvokeAsync(canvasGuid, Start.MyNode.Guid, End.MyNode.Guid, InvokeType); env.RemoveConnectInvokeAsync(canvasGuid, Start.MyNode.Guid, End.MyNode.Guid, InvokeType);
} }
else if (Start.JunctionType.ToConnectyionType() == JunctionOfConnectionType.Arg) else if (jct == JunctionOfConnectionType.Arg)
{ {
env.RemoveConnectArgSourceAsync(canvasGuid,Start.MyNode.Guid, End.MyNode.Guid, ArgIndex) ; env.RemoveConnectArgSourceAsync(canvasGuid,Start.MyNode.Guid, End.MyNode.Guid, ArgIndex) ;
} }

View File

@@ -41,13 +41,6 @@ namespace Serein.Workbench.Node.View
{ {
DataContext = viewModel; DataContext = viewModel;
InitializeComponent(); InitializeComponent();
#if false
// 初始化定时器
_debounceTimer = new DispatcherTimer();
_debounceTimer.Interval = TimeSpan.FromMilliseconds(500); // 停止输入 500ms 后更新
_debounceTimer.Tick += DebounceTimer_Tick;
#endif
} }

View File

@@ -411,10 +411,10 @@ namespace Serein.Workbench.Views
JunctionControlBase endJunction = IToJunction.ExecuteJunction; JunctionControlBase endJunction = IToJunction.ExecuteJunction;
var removeConnections = Connections.Where(c => var removeConnections = Connections.Where(c =>
c.Start.Equals(startJunction) c.Start.MyNode.Guid == startJunction.MyNode.Guid
&& c.End.Equals(endJunction) && c.End.MyNode.Guid == endJunction.MyNode.Guid
&& (c.Start.JunctionType.ToConnectyionType() == JunctionOfConnectionType.Invoke && (c.Start.JunctionType.ToConnectyionType() == JunctionOfConnectionType.Arg
|| c.End.JunctionType.ToConnectyionType() == JunctionOfConnectionType.Invoke)) || c.End.JunctionType.ToConnectyionType() == JunctionOfConnectionType.Arg))
.ToList(); .ToList();