using CommunityToolkit.Mvvm.ComponentModel; using Microsoft.Win32; using OpenTap; using SeqEditor.Util; using System.IO; using System.Windows; using System.Windows.Controls; using System.Windows.Data; namespace OpenTapEditor; public enum RuningMode { Stop = 0, Running = 1, RunningInStepMode = 2, RunningInDebugMode = 3, RunningInDebugModeButStep = 4 } /// /// Interaction logic for SequencePanel.xaml /// [ObservableObject] public partial class SequencePanel : UserControl, ITabItem, IStepRunStatus { [ObservableProperty] private TestPlan plan; [ObservableProperty] private ITestStep selectedTestStep; [ObservableProperty] private bool isRunning = false; [ObservableProperty] private bool hasChanged = false; [ObservableProperty] private RuningMode runingMode = RuningMode.Stop; public StepSettingView SettingView { get => settingView; } public string TabName { get { if (string.IsNullOrEmpty(Plan?.Path)) return "New.TapPlan"; return Path.GetFileName(Plan.Path); } set { } } private ManualResetEvent SingleStepHandle = new ManualResetEvent(true); public event EventHandler RunningFinished; public SequencePanel(TestPlan plan) { Plan = plan; InitializeComponent(); // bcSetting.Source = Plan; BindingOperations.SetBinding(CbShowDetailLog, CheckBox.IsCheckedProperty, new Binding(nameof(TestPlan.ShowDetailLog)) { Source = Plan, Mode = BindingMode.TwoWay, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged }); treeView.Plan = Plan; childSeqPanel.SetPlan(Plan); childSeqPanel.SequencePropertyChanged += VariableControl_SequenceChanged; variableControl.SetPlan(Plan); Plan.ChildTestSteps.ChildStepsChanged += ChildTestSteps_ChildStepsChanged; Plan.ChildTestSteps.CollectionChanged += ChildTestSteps_CollectionChanged; } private void VariableControl_SequenceChanged(object? sender, EventArgs e) { HasChanged = true; } private void ChildTestSteps_ChildStepsChanged(TestStepList senderList, TestStepList.ChildStepsChangedAction Action, ITestStep Object, int Index) { HasChanged = true; } private void ChildTestSteps_CollectionChanged(object? sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { HasChanged = true; } private void Button_Click(object sender, RoutedEventArgs e) { var btn = (Button)sender; switch (btn.Tag) { case "运行": RunBtn(); break; case "调试": SeqEditorUI.Instance.RunTestPlan(Plan, treeView.Datasource.SequenceName, RuningMode.RunningInDebugMode); //RunTestPlan(RuningMode.RunningInDebugMode); break; case "单步运行": StepRuning(); break; case "停止": break; default: break; } } private void RunBtn() { if (IsRunning) { if (RuningMode == RuningMode.RunningInStepMode) { RuningMode = RuningMode.Running; SingleStepHandle.Set(); return; } if (RuningMode == RuningMode.RunningInDebugModeButStep) { RuningMode = RuningMode.RunningInDebugMode; SingleStepHandle.Set(); return; } if (RuningMode == RuningMode.RunningInDebugMode) { SingleStepHandle.Set(); return; } } else { SeqEditorUI.Instance.RunTestPlan(Plan, treeView.Datasource.SequenceName, RuningMode.Running); } } private void StepRuning() { if (IsRunning && RuningMode != RuningMode.Running) { if (RuningMode == RuningMode.RunningInDebugMode) { RuningMode = RuningMode.RunningInDebugModeButStep; } SingleStepHandle.Set(); } else { SeqEditorUI.Instance.RunTestPlan(Plan, treeView.Datasource.SequenceName, RuningMode.RunningInStepMode); } } public bool TrySaveTestStep(Func check) { if (!string.IsNullOrEmpty(Plan.Path)) { Plan.Save(Plan.Path); HasChanged = false; OnPropertyChanged(nameof(TabName)); return true; } return TrySaveAs(check); } public bool TrySaveAs(Func check) { SaveFileDialog sfd = new SaveFileDialog() { Filter = "Test Plan|*.TapPlan", DefaultExt = ".TapPlan" }; if (sfd.ShowDialog() == true) { if (check.Invoke(sfd.FileName)) { Plan.Save(sfd.FileName); HasChanged = false; OnPropertyChanged(nameof(TabName)); return true; } } return false; } private void treeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs e) { if (e.NewValue != null) { settingView.UpdateSource((ITestStep)e.NewValue); SelectedTestStep = (ITestStep)e.NewValue; } } private void variableControl_SelectedSequenceChanged(object sender, TestStepList e) { treeView.Datasource = e; settingView.Seq = e; variableControl.SetSeq(e); } public void ComplatedStepId(Guid id) { Dispatcher.BeginInvoke(() => { treeView.ComplatedIds[id] = true; treeView.UpdateStepStatus(); }); } public void CurrentStepId(Guid id) { Dispatcher.BeginInvoke(() => { treeView.ComplatedIds.TryRemove(id, out _); treeView.UpdateStepStatus(); treeView.RunningStepId = id; }); } private void self_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) { } public void Close() { variableControl.SetPlan(null); settingView = null; Plan = null; treeView.Unload(); } }