using System; using System.IO; using Flowchart; using System.Linq; using System.Windows; using System.Text.Json; using System.ComponentModel; using SHJX.Service.Common.Utils; using System.Text.Encodings.Web; using System.Collections.Generic; using SHJX.Service.Model.WorkFlowModules; using System.Windows.Input; namespace SHJX.Service.Shell.Views.Manual { #region Module public class SaveLocalJsonData { public List Nodes { get; set; } public List Links { get; set; } } #endregion /// /// CustomMoveWindow.xaml 的交互逻辑 /// public partial class CustomMoveWindow : Window { private readonly string pathFile = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "\\userroute\\"; private readonly string fileName = "workflow.json"; private FlowchartModel _model; private string OpKey { get; init; } public CustomMoveWindow() { Owner = Application.Current.MainWindow; InitializeComponent(); } public CustomMoveWindow(string opkey) { Owner = Application.Current.MainWindow; InitializeComponent(); txt_point.Text = opkey; _editor.Zoom = 0.8; OpKey = opkey; _model = CreateModel(); _editor.Controller = new Controller(_editor, _model); _editor.DragDropTool = new DragDropTool(_editor, _model); _editor.DragTool = new CustomMoveResizeTool(_editor, _model) { MoveGridCell = _editor.GridCellSize }; _editor.LinkTool = new CustomLinkTool(_editor); _editor.Selection.PropertyChanged += new PropertyChangedEventHandler(Selection_PropertyChanged); ItemsControlDragHelper _dragHelper = new(_toolbox, this); FillToolbox(); } private FlowchartModel CreateModel() { _model = new FlowchartModel(); if (!File.Exists(string.Concat(pathFile, fileName))) { return _model; } string readInfo = File.ReadAllText(string.Concat(pathFile, fileName)); if (string.IsNullOrWhiteSpace(readInfo)) { return _model; } SaveLocalJsonData data = JsonSerializer.Deserialize(readInfo); foreach (FlowNode node in data.Nodes) { _model.Nodes.Add(node); } data.Links.ForEach(link => { FlowNode source = data.Nodes.Where(item => item.Column.Equals(link.Source.Column) && item.Row.Equals(link.Source.Row)).FirstOrDefault(); FlowNode target = data.Nodes.Where(item => item.Column.Equals(link.Target.Column) && item.Row.Equals(link.Target.Row)).FirstOrDefault(); _model.Links.Add(new Link(source, link.SourcePort, target, link.TargetPort)); }); return _model; } private void FillToolbox() { foreach (NodeKinds nk in Enum.GetValues(typeof(NodeKinds))) { FlowNode node = new FlowNode(nk); FrameworkElement ui = Controller.CreateContent(node); ui.Width = 80; ui.Height = 40; ui.Margin = new Thickness(5); ui.Tag = nk; _toolbox.Items.Add(ui); } } private void Selection_PropertyChanged(object sender, PropertyChangedEventArgs e) { _ = _editor.Selection.Primary; } private void btn_custom_move_Click(object sender, RoutedEventArgs e) { FlowNode startNode = _model.Nodes.FirstOrDefault(item => item.Text.Equals("开始")); if (startNode is null) { return; } List lists = new(); GetNodeName(ref lists, startNode); List moveSteps = new(); foreach (string item in lists) { FlowNode node = _model.Nodes.FirstOrDefault(it => it.Text.Equals(item)); if (node is null) { continue; } if (moveSteps.Any()) { moveSteps.Last().NextStep = item; } CustomMoveStep step = new(item); moveSteps.Add(step); } WorkFlowEventArgs args = new(OpKey, moveSteps); Messager.Send("CustomMove", args); } private void btn_save_move_Click(object sender, RoutedEventArgs e) { SaveLocalJsonData saveLocalJson = new() { Nodes = _model.Nodes.ToList(), Links = _model.Links.ToList() }; string stepInfo = JsonSerializer.Serialize(saveLocalJson, new JsonSerializerOptions { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping }); DirectoryInfo dir = new(pathFile); if (!dir.Exists) { dir.Create(); } File.WriteAllText(string.Concat(pathFile, fileName), stepInfo); } public void GetNodeName(ref List list, FlowNode node) { list.Add(node.Text); Link startLink = _model.Links.FirstOrDefault(item => item.Source.Row.Equals(node.Row) && item.Source.Column.Equals(node.Column)); if (startLink == null) { return; } FlowNode nextNode = _model.Nodes.FirstOrDefault(item => item.Row.Equals(startLink.Target.Row) && item.Column.Equals(startLink.Target.Column)); if (nextNode == null) { return; } GetNodeName(ref list, nextNode); } private Key DownKey; private void Window_KeyDown(object sender, KeyEventArgs e) { DownKey = e.Key; } private void Window_KeyUp(object sender, KeyEventArgs e) { DownKey = Key.None; } private void Window_MouseWheel(object sender, MouseWheelEventArgs e) { if (DownKey.Equals(Key.LeftCtrl)) { if (e.Delta > 0) { _editor.Zoom += 0.05; } else { _editor.Zoom -= 0.05; } } } private void WorkFlowEdit_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { DragMove(); } private void btn_edit_close_Click(object sender, RoutedEventArgs e) { Close(); } } }