CustomMoveWindow.xaml.cs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. using System;
  2. using System.IO;
  3. using Flowchart;
  4. using System.Linq;
  5. using System.Windows;
  6. using System.Text.Json;
  7. using System.ComponentModel;
  8. using SHJX.Service.Common.Utils;
  9. using System.Text.Encodings.Web;
  10. using System.Collections.Generic;
  11. using SHJX.Service.Model.WorkFlowModules;
  12. using System.Windows.Input;
  13. namespace SHJX.Service.Shell.Views.Manual
  14. {
  15. #region Module
  16. public class SaveLocalJsonData
  17. {
  18. public List<FlowNode> Nodes { get; set; }
  19. public List<Link> Links { get; set; }
  20. }
  21. #endregion
  22. /// <summary>
  23. /// CustomMoveWindow.xaml 的交互逻辑
  24. /// </summary>
  25. public partial class CustomMoveWindow : Window
  26. {
  27. private readonly string pathFile = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "\\userroute\\";
  28. private readonly string fileName = "workflow.json";
  29. private FlowchartModel _model;
  30. private string OpKey { get; init; }
  31. public CustomMoveWindow()
  32. {
  33. Owner = Application.Current.MainWindow;
  34. InitializeComponent();
  35. }
  36. public CustomMoveWindow(string opkey)
  37. {
  38. Owner = Application.Current.MainWindow;
  39. InitializeComponent();
  40. txt_point.Text = opkey;
  41. _editor.Zoom = 0.8;
  42. OpKey = opkey;
  43. _model = CreateModel();
  44. _editor.Controller = new Controller(_editor, _model);
  45. _editor.DragDropTool = new DragDropTool(_editor, _model);
  46. _editor.DragTool = new CustomMoveResizeTool(_editor, _model)
  47. {
  48. MoveGridCell = _editor.GridCellSize
  49. };
  50. _editor.LinkTool = new CustomLinkTool(_editor);
  51. _editor.Selection.PropertyChanged += new PropertyChangedEventHandler(Selection_PropertyChanged);
  52. ItemsControlDragHelper _dragHelper = new(_toolbox, this);
  53. FillToolbox();
  54. }
  55. private FlowchartModel CreateModel()
  56. {
  57. _model = new FlowchartModel();
  58. if (!File.Exists(string.Concat(pathFile, fileName)))
  59. {
  60. return _model;
  61. }
  62. string readInfo = File.ReadAllText(string.Concat(pathFile, fileName));
  63. if (string.IsNullOrWhiteSpace(readInfo))
  64. {
  65. return _model;
  66. }
  67. SaveLocalJsonData data = JsonSerializer.Deserialize<SaveLocalJsonData>(readInfo);
  68. foreach (FlowNode node in data.Nodes)
  69. {
  70. _model.Nodes.Add(node);
  71. }
  72. data.Links.ForEach(link =>
  73. {
  74. FlowNode source = data.Nodes.Where(item => item.Column.Equals(link.Source.Column) && item.Row.Equals(link.Source.Row)).FirstOrDefault();
  75. FlowNode target = data.Nodes.Where(item => item.Column.Equals(link.Target.Column) && item.Row.Equals(link.Target.Row)).FirstOrDefault();
  76. _model.Links.Add(new Link(source, link.SourcePort, target, link.TargetPort));
  77. });
  78. return _model;
  79. }
  80. private void FillToolbox()
  81. {
  82. foreach (NodeKinds nk in Enum.GetValues(typeof(NodeKinds)))
  83. {
  84. FlowNode node = new FlowNode(nk);
  85. FrameworkElement ui = Controller.CreateContent(node);
  86. ui.Width = 80;
  87. ui.Height = 40;
  88. ui.Margin = new Thickness(5);
  89. ui.Tag = nk;
  90. _toolbox.Items.Add(ui);
  91. }
  92. }
  93. private void Selection_PropertyChanged(object sender, PropertyChangedEventArgs e)
  94. {
  95. _ = _editor.Selection.Primary;
  96. }
  97. private void btn_custom_move_Click(object sender, RoutedEventArgs e)
  98. {
  99. FlowNode startNode = _model.Nodes.FirstOrDefault(item => item.Text.Equals("开始"));
  100. if (startNode is null)
  101. {
  102. return;
  103. }
  104. List<string> lists = new();
  105. GetNodeName(ref lists, startNode);
  106. List<CustomMoveStep> moveSteps = new();
  107. foreach (string item in lists)
  108. {
  109. FlowNode node = _model.Nodes.FirstOrDefault(it => it.Text.Equals(item));
  110. if (node is null)
  111. {
  112. continue;
  113. }
  114. if (moveSteps.Any())
  115. {
  116. moveSteps.Last().NextStep = item;
  117. }
  118. CustomMoveStep step = new(item);
  119. moveSteps.Add(step);
  120. }
  121. WorkFlowEventArgs args = new(OpKey, moveSteps);
  122. Messager<WorkFlowEventArgs>.Send("CustomMove", args);
  123. }
  124. private void btn_save_move_Click(object sender, RoutedEventArgs e)
  125. {
  126. SaveLocalJsonData saveLocalJson = new()
  127. {
  128. Nodes = _model.Nodes.ToList(),
  129. Links = _model.Links.ToList()
  130. };
  131. string stepInfo = JsonSerializer.Serialize(saveLocalJson, new JsonSerializerOptions
  132. {
  133. Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
  134. });
  135. DirectoryInfo dir = new(pathFile);
  136. if (!dir.Exists)
  137. {
  138. dir.Create();
  139. }
  140. File.WriteAllText(string.Concat(pathFile, fileName), stepInfo);
  141. }
  142. public void GetNodeName(ref List<string> list, FlowNode node)
  143. {
  144. list.Add(node.Text);
  145. Link startLink = _model.Links.FirstOrDefault(item => item.Source.Row.Equals(node.Row) && item.Source.Column.Equals(node.Column));
  146. if (startLink == null)
  147. {
  148. return;
  149. }
  150. FlowNode nextNode = _model.Nodes.FirstOrDefault(item => item.Row.Equals(startLink.Target.Row) && item.Column.Equals(startLink.Target.Column));
  151. if (nextNode == null)
  152. {
  153. return;
  154. }
  155. GetNodeName(ref list, nextNode);
  156. }
  157. private Key DownKey;
  158. private void Window_KeyDown(object sender, KeyEventArgs e)
  159. {
  160. DownKey = e.Key;
  161. }
  162. private void Window_KeyUp(object sender, KeyEventArgs e)
  163. {
  164. DownKey = Key.None;
  165. }
  166. private void Window_MouseWheel(object sender, MouseWheelEventArgs e)
  167. {
  168. if (DownKey.Equals(Key.LeftCtrl))
  169. {
  170. if (e.Delta > 0)
  171. {
  172. _editor.Zoom += 0.05;
  173. }
  174. else
  175. {
  176. _editor.Zoom -= 0.05;
  177. }
  178. }
  179. }
  180. private void WorkFlowEdit_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  181. {
  182. DragMove();
  183. }
  184. private void btn_edit_close_Click(object sender, RoutedEventArgs e)
  185. {
  186. Close();
  187. }
  188. }
  189. }