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