using CommunityToolkit.Mvvm.ComponentModel; using OpenTap; using OpenTapEditor.Provider; using System.Collections.ObjectModel; using System.ComponentModel; using System.Data; using System.Windows; using System.Windows.Controls; namespace OpenTapEditor { /// /// SettingWin.xaml 的交互逻辑 /// [ObservableObject] public partial class SettingWin : Window { private IEnumerable settings; private DutSettings dutSettings; private InstrumentSettings instSettings; private IEnumerable dutComponents; private IEnumerable instComponents; [ObservableProperty] public ObservableCollection duts; [ObservableProperty] public ObservableCollection insts; public SettingWin() { DataContext = this; InitializeComponent(); LoadDUTs(); } public static Type GetEnumerableElementType(Type enumType) { if (enumType.IsArray) return enumType.GetElementType(); var ienumInterface = enumType.GetInterface("IEnumerable`1") ?? enumType; if (ienumInterface != null) return ienumInterface.GetGenericArguments().FirstOrDefault(); return typeof(object); } private void LoadDUTs() { try { var settings = TypeData.GetDerivedTypes() .Where(x => x.CanCreateInstance && (x.GetAttribute()?.Browsable ?? true)); this.settings = settings.OfType(); foreach (var setting in this.settings) { ComponentSettings obj = null; try { obj = ComponentSettings.GetCurrent(setting.Load()); if (obj == null) continue; if (obj is DutSettings ds) { dutSettings = ds; Duts = new ObservableCollection(ds); } else if (obj is InstrumentSettings ist) { instSettings = ist; Insts = new ObservableCollection(ist); } var setgroup = setting.GetAttribute()?.GroupName ?? "Settings"; var name = setting.GetDisplayAttribute().Name; } catch (Exception ex) { //Log.Error(ex); //ComponentSettings.SaveAllCurrentSettings(); } } ITypeData parentType = null; TypeData AsTypeData(ITypeData typedata) { do { if (typedata is TypeData td) return td; typedata = typedata?.BaseType; } while (typedata != null); return null; } dutComponents = TypeData.GetDerivedTypes(TypeData.FromType(GetEnumerableElementType(typeof(DutSettings)))) .Where(x => x.CanCreateInstance) .Where(x => x.GetAttribute()?.Browsable ?? true) .Where(x => parentType == null ? true : TestStepList.AllowChild(AsTypeData(parentType).Type, AsTypeData(x)?.Type)); instComponents = TypeData.GetDerivedTypes(TypeData.FromType(GetEnumerableElementType(typeof(InstrumentSettings)))) .Where(x => x.CanCreateInstance) .Where(x => x.GetAttribute()?.Browsable ?? true) .Where(x => parentType == null ? true : TestStepList.AllowChild(AsTypeData(parentType).Type, AsTypeData(x)?.Type)); // ComponentSettings.SaveAllCurrentSettings(); } catch (Exception ex) { } } private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (e.AddedItems == null || e.AddedItems.Count <= 0) return; if (sender == dutsView) { var obj = (Dut)e.AddedItems[0]; AnnotationCollection annotation = AnnotationCollection.Annotate(obj); StackPanel stack = DutControlProvider.GetControl(annotation); dutSettingPanel.Child = stack; } else { var obj = (Instrument)e.AddedItems[0]; AnnotationCollection annotation = AnnotationCollection.Annotate(obj); StackPanel stack = DutControlProvider.GetControl(annotation); instSettingPanel.Child = stack; } } private void Window_Closing(object sender, CancelEventArgs e) { ComponentSettings.SaveAllCurrentSettings(); } } }