BDU/ATS/Views/StepsManager.xaml.cs

312 lines
11 KiB
C#

using ATS.Models;
using ATS.Tools;
using ATS.Windows;
using PropertyChanged;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Timer = System.Timers.Timer;
namespace ATS.Views
{
/// <summary>
/// StepsManager.xaml 的交互逻辑
/// </summary>
public partial class StepsManager : UserControl, INotifyPropertyChanged
{
public static StepsManager? Instance { get; private set; }
private string _title = "主程序 NewProgram.ats";
public string Title
{
get => _title;
set
{
if (_title != value)
{
_title = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Title)));
}
}
}
/// <summary>
/// 更新 Title 显示,根据当前状态自动判断显示主程序或子程序名称
/// </summary>
public void UpdateTitle(string? subProgramName = null)
{
if (!string.IsNullOrEmpty(subProgramName))
{
// 如果传入了子程序名称,显示子程序标题
Title = $"子程序 {subProgramName}";
}
else
{
// 否则显示主程序标题
var tmp = MainWindow.Instance?.CurrentFilePath?.Split("\\");
if (tmp != null && tmp.Length > 1)
{
Title = "主程序 " + tmp[^1];
}
else
{
Title = "主程序 " + (tmp?.LastOrDefault() ?? "NewProgram.ats");
}
}
}
public ProgramModel Program => MainWindow.Instance.Program ?? new();
public object SelectedItem => ProgramDataGrid.SelectedItem;
public int SelectedIndex
{
get { return ProgramDataGrid.SelectedIndex; }
set { ProgramDataGrid.SelectedIndex = value; }
}
public bool IsAdmin => MainWindow.Instance.User.Role > 0;
private List<StepModel> tmpCopyList = [];
#region
private void ReOrderProgramList()
{
for (int i = 0; i < Program.StepCollection.Count; i++)
{
Program.StepCollection[i].Index = i + 1;
}
}
#endregion
public StepsManager()
{
Instance = this;
InitializeComponent();
DataContext = this;
MainWindow.Instance.PropertyChanged += (s, e) =>
{
if (e.PropertyName == nameof(MainWindow.Program))
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Program)));
}
else if (e.PropertyName == nameof(MainWindow.CurrentFilePath))
{
// 当主程序文件路径变化时,更新 Title
UpdateTitle();
}
};
// 初始化 Title
UpdateTitle();
}
private void StepEdit_Click(object sender, RoutedEventArgs e)
{
if (MainWindow.Instance.User.Role < 1)
{
MessageBox.Show("当前登录用户无权限");
return;
}
if (MainWindow.Instance.SelectedStep != null)
{
MainWindow.Instance.SelectedStep = null;
}
if (ProgramDataGrid.SelectedItem is StepModel selectedStep)
{
// 如果是子程序类型,进入子程序编辑模式
if (selectedStep.StepType == "子程序" && selectedStep.SubProgram != null)
{
// 使用步骤的 Name 作为子程序的显示名称
string subProgramName = selectedStep.Name ?? "未命名子程序";
MainWindow.Instance.EnterSubProgramMode(
selectedStep.SubProgram, // 传递子程序模型
subProgramName, // 传递子程序名称(来自步骤名称)
selectedStep // 传递父步骤引用,用于保存时回写
);
// 更新 StepsManager 的 Title 显示子程序名称
UpdateTitle(subProgramName);
}
else
{
// 原有逻辑:编辑普通步骤
MainWindow.Instance.SelectedStep = new(selectedStep);
if (MainWindow.Instance.SelectedStep.Method != null)
{
if (MainWindow.Instance.SelectedStep.StepType == "循环开始")
{
MainWindow.Instance.SelectedStep.Method.Parameters[0].Value = MainWindow.Instance.SelectedStep.LoopCount;
}
else
{
foreach (var para in MainWindow.Instance.SelectedStep.Method.Parameters)
{
var tmppara = Program.Parameters.FirstOrDefault(x => x.ID == para.VariableID);
if (tmppara == null) continue;
para.VariableName = tmppara.Name;
}
}
}
else if (MainWindow.Instance.SelectedStep.SubProgram != null)
{
foreach (var para in MainWindow.Instance.SelectedStep.SubProgram.Parameters)
{
var tmppara = Program.Parameters.FirstOrDefault(x => x.ID == para.VariableID);
if (tmppara == null) continue;
para.VariableName = tmppara.Name;
}
}
}
}
}
private async void StepDelete_Click(object sender, RoutedEventArgs e)
{
if (MainWindow.Instance.User.Role < 1)
{
MessageBox.Show("当前登录用户无权限");
return;
}
MessageBoxResult result = MessageBox.Show($"确定执行删除操作?", "提示", MessageBoxButton.YesNo, MessageBoxImage.Question);
if (result == MessageBoxResult.Yes)
{
List<StepModel> tmpList = [];
foreach (var item in ProgramDataGrid.SelectedItems)
{
if (item is StepModel selectedStep)
{
tmpList.Add(selectedStep);
}
}
List<int> deleteIndexList = [.. tmpList.OrderBy(x => x.Index).Select(x => x.Index)];
foreach (var item in tmpList)
{
Program.StepCollection.Remove(item);
}
await Task.Yield();
if (tmpList.Count == 1)
{
Log.Success($"用户 [ {MainWindow.Instance.User.UserName} ] 删除步骤 [ {tmpList[0].Index} ] ");
}
else if (tmpList.Count > 1)
{
Log.Success($"用户 [ {MainWindow.Instance.User.UserName} ] 删除步骤 [ {string.Join("", deleteIndexList)} ] ");
}
ReOrderProgramList();
}
}
private void StepCopy_Click(object sender, RoutedEventArgs e)
{
tmpCopyList.Clear();
foreach (var item in ProgramDataGrid.SelectedItems)
{
if (item is StepModel selectedStep)
{
tmpCopyList.Add(selectedStep);
}
}
}
private void StepPaste_Click(object sender, RoutedEventArgs e)
{
if (MainWindow.Instance.User.Role < 1)
{
MessageBox.Show("当前登录用户无权限");
return;
}
var insertIndex = SelectedIndex + 1;
List<int> copyIndexList = [.. tmpCopyList.OrderBy(x => x.Index).Select(x => x.Index)];
foreach (var item in tmpCopyList)
{
Program.StepCollection.Insert(insertIndex, new(item) { ID = Guid.NewGuid() });
insertIndex++;
}
if (tmpCopyList.Count == 1)
{
Log.Success($"用户 [ {MainWindow.Instance.User.UserName} ] 粘贴步骤 [ {tmpCopyList[0].Index} ] 到 [ {insertIndex} ] ");
}
else if (tmpCopyList.Count > 1)
{
Log.Success($"用户 [ {MainWindow.Instance.User.UserName} ] 粘贴步骤 [ {string.Join("", copyIndexList)} ] 到 [ {insertIndex + 1 - tmpCopyList.Count} - {insertIndex} ] ");
}
ReOrderProgramList();
}
private void SetOrCancelBroken_Click(object sender, RoutedEventArgs e)
{
foreach (var item in ProgramDataGrid.SelectedItems)
{
if (item is StepModel selectedStep)
{
selectedStep.isBrokenpoint = selectedStep.isBrokenpoint == null|| selectedStep.isBrokenpoint == false ? true : false;
}
}
}
private void StepManager_KeyDown(object sender, KeyEventArgs e)
{
switch (e.Key)
{
case Key.Delete:
StepDelete_Click(sender, e);
break;
case Key.C:
if (Keyboard.Modifiers == ModifierKeys.Control)
{
StepCopy_Click(sender, e);
}
break;
case Key.V:
if (Keyboard.Modifiers == ModifierKeys.Control)
{
StepPaste_Click(sender, e);
}
break;
}
}
// 在 StepsManager 中添加
public ProgramModel CurrentProgram
{
get => (ProgramModel)GetValue(CurrentProgramProperty);
set => SetValue(CurrentProgramProperty, value);
}
public static readonly DependencyProperty CurrentProgramProperty =
DependencyProperty.Register("CurrentProgram", typeof(ProgramModel), typeof(StepsManager),
new PropertyMetadata(null, OnCurrentProgramChanged));
private static void OnCurrentProgramChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var stepsManager = (StepsManager)d;
// 更新绑定
stepsManager.DataContext = e.NewValue;
}
}
}