重新设计流程画布Canvas与节点Node的关联

This commit is contained in:
fengjiayi
2025-03-24 15:44:34 +08:00
parent cf7760ef84
commit b1a9679138
15 changed files with 322 additions and 55 deletions

View File

@@ -1,4 +1,6 @@
using CommunityToolkit.Mvvm.ComponentModel;
using Serein.Library;
using Serein.Workbench.Node.View;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -9,6 +11,12 @@ namespace Serein.Workbench.ViewModels
{
public partial class FlowCanvasViewModel : ObservableObject
{
/// <summary>
/// 画布当前选中的节点
/// </summary>
public NodeControlBase CurrentSelectNodeControl { get; set; }
/// <summary>
/// 正在创建节点方法调用关系
/// </summary>
@@ -33,6 +41,12 @@ namespace Serein.Workbench.ViewModels
[ObservableProperty]
private string _canvasGuid;
/// <summary>
/// 画布数据实体
/// </summary>
[ObservableProperty]
private FlowCanvasModel _model;
public FlowCanvasViewModel()

View File

@@ -1,6 +1,7 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Serein.Workbench.Models;
using Serein.Workbench.Services;
using Serein.Workbench.Views;
using System;
using System.Collections.Generic;
@@ -10,6 +11,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
namespace Serein.Workbench.ViewModels
{
@@ -18,7 +20,7 @@ namespace Serein.Workbench.ViewModels
/// </summary>
public partial class FlowEditViewModel : ObservableObject
{
public ObservableCollection<FlowCanvasModel> Tabs { get; set; }
public ObservableCollection<FlowCanvasModel> Tabs { get; set; } = [];
public ICommand AddTabCommand { get; set; }
public ICommand RemoveTabCommand { get; set; }
public ICommand RenameTabCommand { get; set; }
@@ -27,39 +29,59 @@ namespace Serein.Workbench.ViewModels
private FlowCanvasModel _selectedTab;
private int _addCount = 0;
private readonly FlowNodeService flowNodeService;
public FlowEditViewModel()
public FlowEditViewModel(FlowNodeService flowNodeService)
{
Tabs = new ObservableCollection<FlowCanvasModel>();
this.flowNodeService = flowNodeService;
AddTabCommand = new RelayCommand(AddTab);
RemoveTabCommand = new RelayCommand(RemoveTab, CanRemoveTab);
// 初始化时添加一个默认的Tab
AddTab(); // 添加一个默认选项卡
flowNodeService.OnCreateFlowCanvasView += OnCreateFlowCanvasView; // 环境创建了节点
flowNodeService.OnRemoveFlowCanvasView += OnRemoveFlowCanvasView;
this.PropertyChanged += OnPropertyChanged;
}
private void AddTab()
private void OnPropertyChanged(object? value, PropertyChangedEventArgs e)
{
var flowCanvasView = new FlowCanvasView(); // 创建FlowCanvasView实例
Tabs.Add(new FlowCanvasModel { Content = flowCanvasView ,Name = $"New Tab {_addCount++}"});
SelectedTab = Tabs[Tabs.Count - 1]; // 选择刚添加的Tab
}
private void RemoveTab()
{
if (Tabs.Count > 0 && SelectedTab != null)
if (nameof(SelectedTab).Equals(e.PropertyName) && value is FlowCanvasModel model)
{
Tabs.Remove(SelectedTab);
SelectedTab = Tabs.Count > 0 ? Tabs[Tabs.Count - 1] : null;
flowNodeService.CurrentSelectCanvas = model.Content; // 选中的视图发生改变
}
}
private bool CanRemoveTab()
#region
private void OnCreateFlowCanvasView(FlowCanvasView FlowCanvasView)
{
return SelectedTab != null;
var model = new FlowCanvasModel { Content = FlowCanvasView, Name = FlowCanvasView.ViewModel.Name };
Tabs.Add(model);
}
private void OnRemoveFlowCanvasView(string canvasGuid)
{
var tab = Tabs.FirstOrDefault(t => t.Content.ViewModel.Model.Guid.Equals(canvasGuid, StringComparison.OrdinalIgnoreCase));
if (tab is null)
{
return;
}
Tabs.Remove(tab);
Tabs.Remove(SelectedTab);
if(Tabs.Count > 0 && Tabs[^1] is FlowCanvasModel view )
{
SelectedTab = view;
}
}
#endregion
private void AddTab() => flowNodeService.CreateFlowCanvas();
private void RemoveTab()
{
if (Tabs.Count > 0 && SelectedTab != null) flowNodeService.RemoveFlowCanvas();
}
private bool CanRemoveTab() => SelectedTab != null;
/// <summary>
/// 进入编辑模式

View File

@@ -2,6 +2,7 @@
using Serein.Library;
using Serein.Workbench.Api;
using Serein.Workbench.Models;
using Serein.Workbench.Services;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;

View File

@@ -1,12 +1,61 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Serein.Library.Api;
using System.Windows.Input;
namespace Serein.Workbench.ViewModels
{
public class MainMenuBarViewModel : ObservableObject
{
public MainMenuBarViewModel()
private readonly IFlowEnvironment environment;
/// <summary>
/// 保存项目
/// </summary>
public ICommand SaveProjectCommand { get; private set; }
/// <summary>
/// 加载本地文件
/// </summary>
public ICommand LoadLocalProjectCommand { get; private set; }
/// <summary>
/// 加载远程项目
/// </summary>
public ICommand LoadRemoteProjectCommand { get; private set; }
/// <summary>
/// 增加流程图
/// </summary>
public ICommand CreateFlowCanvasCommand { get; private set; }
/// <summary>
/// 增加流程图
/// </summary>
public ICommand RemoteFlowCanvasCommand { get; private set; }
/// <summary>
/// 打开环境输出窗口
/// </summary>
public ICommand OpenEnvOutWindowCommand { get; private set; }
/// <summary>
/// 打开动态编译窗口
/// </summary>
public ICommand OpenDynamicCompilerCommand { get; private set; }
public MainMenuBarViewModel(IFlowEnvironment environment)
{
this.environment = environment;
SaveProjectCommand = new RelayCommand(SaveProject);
}
public void SaveProject()
{
}
}
}