mirror of
https://gitee.com/langsisi_admin/serein-flow
synced 2026-03-19 16:06:33 +08:00
完成mvvm模式下,画布、节点编辑的基本重构
This commit is contained in:
@@ -1,21 +1,27 @@
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using Serein.Library;
|
||||
using Serein.Library.Api;
|
||||
using Serein.Workbench.Api;
|
||||
using Serein.Workbench.Node.View;
|
||||
using Serein.Workbench.Services;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Input;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
|
||||
namespace Serein.Workbench.ViewModels
|
||||
{
|
||||
public partial class FlowCanvasViewModel : ObservableObject
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 画布当前选中的节点
|
||||
/// </summary>
|
||||
public NodeControlBase CurrentSelectNodeControl { get; set; }
|
||||
|
||||
public NodeControlBase CurrentSelectNode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 正在创建节点方法调用关系
|
||||
@@ -29,29 +35,13 @@ namespace Serein.Workbench.ViewModels
|
||||
[ObservableProperty]
|
||||
private bool _isConnectionArgSourceNode;
|
||||
|
||||
/// <summary>
|
||||
/// 画布显示名称
|
||||
/// </summary>
|
||||
[ObservableProperty]
|
||||
private string _name;
|
||||
|
||||
/// <summary>
|
||||
/// 画布ID
|
||||
/// </summary>
|
||||
[ObservableProperty]
|
||||
private string _canvasGuid;
|
||||
|
||||
/// <summary>
|
||||
/// 画布数据实体
|
||||
/// </summary>
|
||||
[ObservableProperty]
|
||||
private FlowCanvasModel _model;
|
||||
private FlowCanvasDetails _model;
|
||||
|
||||
|
||||
|
||||
public FlowCanvasViewModel()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using CommunityToolkit.Mvvm.Input;
|
||||
using Serein.Workbench.Api;
|
||||
using Serein.Workbench.Models;
|
||||
using Serein.Workbench.Node.View;
|
||||
using Serein.Workbench.Services;
|
||||
using Serein.Workbench.Views;
|
||||
using System;
|
||||
@@ -20,13 +22,17 @@ namespace Serein.Workbench.ViewModels
|
||||
/// </summary>
|
||||
public partial class FlowEditViewModel : ObservableObject
|
||||
{
|
||||
public ObservableCollection<FlowCanvasModel> Tabs { get; set; } = [];
|
||||
public ObservableCollection<FlowEditorTabModel> CanvasTabs { get; set; } = [];
|
||||
public ICommand AddTabCommand { get; set; }
|
||||
public ICommand RemoveTabCommand { get; set; }
|
||||
public ICommand RenameTabCommand { get; set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 当前选择的画布
|
||||
/// </summary>
|
||||
[ObservableProperty]
|
||||
private FlowCanvasModel _selectedTab;
|
||||
private FlowEditorTabModel _selectedTab;
|
||||
|
||||
private readonly FlowNodeService flowNodeService;
|
||||
|
||||
@@ -34,39 +40,42 @@ namespace Serein.Workbench.ViewModels
|
||||
{
|
||||
this.flowNodeService = flowNodeService;
|
||||
AddTabCommand = new RelayCommand(AddTab);
|
||||
RemoveTabCommand = new RelayCommand(RemoveTab, CanRemoveTab);
|
||||
RemoveTabCommand = new RelayCommand(RemoveTab);
|
||||
|
||||
flowNodeService.OnCreateFlowCanvasView += OnCreateFlowCanvasView; // 运行环境创建了画布
|
||||
flowNodeService.OnRemoveFlowCanvasView += OnRemoveFlowCanvasView; // 运行环境移除了画布
|
||||
flowNodeService.OnCreateFlowCanvasView += OnCreateFlowCanvasView; // 创建了画布
|
||||
flowNodeService.OnRemoveFlowCanvasView += OnRemoveFlowCanvasView; // 移除了画布
|
||||
this.PropertyChanged += OnPropertyChanged;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void OnPropertyChanged(object? value, PropertyChangedEventArgs e)
|
||||
{
|
||||
if (nameof(SelectedTab).Equals(e.PropertyName) && value is FlowCanvasModel model)
|
||||
{
|
||||
flowNodeService.CurrentSelectCanvas = model.Content; // 选中的视图发生改变
|
||||
}
|
||||
if (this.SelectedTab is null) return;
|
||||
flowNodeService.CurrentSelectCanvas = this.SelectedTab.Content;
|
||||
}
|
||||
|
||||
#region 响应环境事件
|
||||
private void OnCreateFlowCanvasView(FlowCanvasView FlowCanvasView)
|
||||
private void OnCreateFlowCanvasView(FlowCanvasView canvas)
|
||||
{
|
||||
var model = new FlowCanvasModel { Content = FlowCanvasView, Name = FlowCanvasView.ViewModel.Name };
|
||||
Tabs.Add(model);
|
||||
var model = new FlowEditorTabModel(canvas);
|
||||
CanvasTabs.Add(model);
|
||||
SelectedTab = model;
|
||||
}
|
||||
private void OnRemoveFlowCanvasView(string canvasGuid)
|
||||
private void OnRemoveFlowCanvasView(FlowCanvasView canvas)
|
||||
{
|
||||
var tab = Tabs.FirstOrDefault(t => t.Content.ViewModel.Model.Guid.Equals(canvasGuid, StringComparison.OrdinalIgnoreCase));
|
||||
var tab = CanvasTabs.FirstOrDefault(c => c.Content.Guid.Equals(canvas.Guid));
|
||||
if (tab is null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Tabs.Remove(tab);
|
||||
Tabs.Remove(SelectedTab);
|
||||
if(Tabs.Count > 0 && Tabs[^1] is FlowCanvasModel view )
|
||||
CanvasTabs.Remove(tab);
|
||||
|
||||
if (CanvasTabs.Count > 0 && CanvasTabs[^1] is FlowEditorTabModel c)
|
||||
{
|
||||
SelectedTab = view;
|
||||
SelectedTab = c;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
@@ -75,10 +84,9 @@ namespace Serein.Workbench.ViewModels
|
||||
private void AddTab() => flowNodeService.CreateFlowCanvas();
|
||||
private void RemoveTab()
|
||||
{
|
||||
if (Tabs.Count > 0 && SelectedTab != null) flowNodeService.RemoveFlowCanvas();
|
||||
if (CanvasTabs.Count > 0 && SelectedTab != null) flowNodeService.RemoveFlowCanvas();
|
||||
}
|
||||
|
||||
private bool CanRemoveTab() => SelectedTab != null;
|
||||
|
||||
|
||||
|
||||
@@ -86,12 +94,12 @@ namespace Serein.Workbench.ViewModels
|
||||
/// 进入编辑模式
|
||||
/// </summary>
|
||||
/// <param name="tab"></param>
|
||||
public void StartEditingTab(FlowCanvasModel tab)
|
||||
public void StartEditingTab(FlowEditorTabModel tab)
|
||||
{
|
||||
if (tab != null)
|
||||
{
|
||||
tab.IsEditing = true;
|
||||
OnPropertyChanged(nameof(Tabs)); // 刷新Tabs集合,以便更新UI
|
||||
OnPropertyChanged(nameof(CanvasTabs)); // 刷新Tabs集合,以便更新UI
|
||||
}
|
||||
}
|
||||
|
||||
@@ -100,13 +108,13 @@ namespace Serein.Workbench.ViewModels
|
||||
/// </summary>
|
||||
/// <param name="tab"></param>
|
||||
/// <param name="newName"></param>
|
||||
public void EndEditingTab(FlowCanvasModel tab, string newName)
|
||||
public void EndEditingTab(FlowEditorTabModel tab, string? newName = null)
|
||||
{
|
||||
if (tab != null)
|
||||
{
|
||||
tab.IsEditing = false;
|
||||
tab.Name = newName; // 设置新名称
|
||||
OnPropertyChanged(nameof(Tabs)); // 刷新Tabs集合
|
||||
if(tab.Name != newName && !string.IsNullOrWhiteSpace(newName)) tab.Name = newName; // 名称合法时设置新名称
|
||||
OnPropertyChanged(nameof(CanvasTabs)); // 刷新Tabs集合
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using Serein.Workbench.Api;
|
||||
using Serein.Workbench.Models;
|
||||
using Serein.Workbench.Services;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
@@ -13,10 +14,12 @@ namespace Serein.Workbench.ViewModels
|
||||
internal partial class FlowWorkbenchViewModel : ObservableObject
|
||||
{
|
||||
private readonly IFlowEEForwardingService flowEEForwardingService;
|
||||
private readonly IWorkbenchEventService workbenchEventService;
|
||||
|
||||
public FlowWorkbenchViewModel(IFlowEEForwardingService flowEEForwardingService)
|
||||
public FlowWorkbenchViewModel(IFlowEEForwardingService flowEEForwardingService, IWorkbenchEventService workbenchEventService)
|
||||
{
|
||||
this.flowEEForwardingService = flowEEForwardingService;
|
||||
this.workbenchEventService = workbenchEventService;
|
||||
//flowEEForwardingService.OnDllLoad += FlowEEForwardingService_OnDllLoad;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,23 +21,33 @@ namespace Serein.Workbench.ViewModels
|
||||
/// 加载远程项目
|
||||
/// </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 StartCurrentCanvasFlowCommand { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// 停止当前画布流程
|
||||
/// </summary>
|
||||
public ICommand StopCurrentCanvasFlowCommand { get; private set; }
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 打开环境输出窗口
|
||||
/// </summary>
|
||||
public ICommand OpenEnvOutWindowCommand { get; private set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 打开动态编译窗口
|
||||
/// </summary>
|
||||
@@ -49,13 +59,33 @@ namespace Serein.Workbench.ViewModels
|
||||
{
|
||||
this.environment = environment;
|
||||
|
||||
SaveProjectCommand = new RelayCommand(SaveProject);
|
||||
SaveProjectCommand = new RelayCommand(SaveProject); // 保存项目
|
||||
LoadLocalProjectCommand = new RelayCommand(LoadLocalProject); // 加载本地项目
|
||||
LoadRemoteProjectCommand = new RelayCommand(LoadRemoteProject); // 加载远程项目
|
||||
|
||||
CreateFlowCanvasCommand = new RelayCommand(CreateFlowCanvas); // 增加画布
|
||||
RemoteFlowCanvasCommand = new RelayCommand(RemoteFlowCanvas); // 移除画布
|
||||
|
||||
StartCurrentCanvasFlowCommand = new RelayCommand(StartCurrentCanvasFlow); // 运行当前流程
|
||||
StopCurrentCanvasFlowCommand = new RelayCommand(StopCurrentCanvasFlow); // 停止当前流程
|
||||
|
||||
OpenEnvOutWindowCommand = new RelayCommand(OpenEnvOutWindow); // 打开运行输出窗口
|
||||
OpenDynamicCompilerCommand = new RelayCommand(OpenDynamicCompiler); // 打开动态编译仓库窗口
|
||||
}
|
||||
|
||||
public void SaveProject()
|
||||
{
|
||||
|
||||
private void SaveProject() {
|
||||
environment.SaveProject(); // 保存项目
|
||||
}
|
||||
private void LoadLocalProject() {
|
||||
//environment.LoadProject(); // 加载项目
|
||||
}
|
||||
private void LoadRemoteProject() { }
|
||||
private void CreateFlowCanvas() { }
|
||||
private void RemoteFlowCanvas() { }
|
||||
private void StartCurrentCanvasFlow() { }
|
||||
private void StopCurrentCanvasFlow() { }
|
||||
private void OpenDynamicCompiler() { }
|
||||
private void OpenEnvOutWindow() { }
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user