public DeviceConfigPanel(DeviceType deviceType, [CanBeNull] TemplateWithArgs <DeviceTemplate> device, [CanBeNull] IEnumerable <TemplateWithArgs <ConsumerTemplate> > consumers) { InitializeComponent(); _deviceType = deviceType; _deviceViewModel = new DeviceConfigViewModel(DeviceConfigContainer, GetDeviceList(_deviceType)); _deviceViewModel.ComboBox.SelectionChanged += DeviceComboBox_OnSelectionChanged; _deviceViewModel.ComboBox.FindAndSelectFirstByString(device?.Template.Identifier, 0); _deviceViewModel.ParamPanel.Context = device?.Args ?? EmptyContext.Instance; _deviceViewModel.ParamPanel.LayoutChanged += ConfigurationPanel_OnLayoutChanged; _deviceViewModel.Current = device?.Template; if (consumers != null) { foreach (var consumer in consumers) { if (string.IsNullOrWhiteSpace(consumer?.Template.Identifier)) { continue; } AppendConsumerConfig(consumer); } } if (!_consumerViewModels.Any()) { AppendConsumerConfig(); } }
public DeviceConfigWindow(DeviceType deviceType, [CanBeNull] TemplateWithArgs <DeviceTemplate> device, [CanBeNull] IEnumerable <TemplateWithArgs <ConsumerTemplate> > consumers) { InitializeComponent(); Title = $"{deviceType.DisplayName} Configuration"; DockPanel.Children.Add(DeviceConfigPanel = new DeviceConfigPanel(deviceType, device, consumers)); DeviceConfigPanel.DeviceChanged += DeviceChanged; DeviceConfigPanel.ConsumerChanged += ConsumerChanged; }
public bool ShowDialog([CanBeNull] out TemplateWithArgs <DeviceTemplate> device, [NotNull] out IReadOnlyList <TemplateWithArgs <ConsumerTemplate> > consumers) { device = null; consumers = EmptyArray <TemplateWithArgs <ConsumerTemplate> > .Instance; var dialogResult = ShowDialog() ?? false; if (!dialogResult) { return(false); } device = _device; consumers = _consumers; return(true); }
private void AppendConsumerConfig(TemplateWithArgs <ConsumerTemplate> consumer = null) { var viewModel = new ConsumerConfigViewModel(GetConsumerList(_deviceType)); viewModel.ComboBox.SelectionChanged += ConsumerComboBox_OnSelectionChanged; viewModel.ComboBox.FindAndSelectFirstByString(consumer?.Template.Identifier, 0); viewModel.ParamPanel.Context = consumer?.Args ?? EmptyContext.Instance; viewModel.ParamPanel.LayoutChanged += ConfigurationPanel_OnLayoutChanged; _consumerViewModels.AddLast(viewModel); ConsumersStackPanel.Children.Add(viewModel.Container); if (_consumerViewModels.Count >= MaxConsumerCount) { AppendConsumerButton.IsEnabled = false; AppendConsumerButton.Content = "MAX"; } }
public static IDictionary <DeviceType, IDevice> InitiateDevices(IEnumerable <DeviceType> deviceTypes, IDictionary <DeviceType, DeviceConfig> devices) { var deviceLookups = new Dictionary <DeviceType, TemplateWithArgs <DeviceTemplate> >(); foreach (var deviceType in deviceTypes) { if (!devices.TryGetValue(deviceType, out var entity) || entity.Device.Id == null) { if (deviceType.IsRequired) { throw new ArgumentException($"Device type '{deviceType.DisplayName}' is required."); } continue; } if (!App.Instance.Registries.Registry <DeviceTemplate>().LookUp(entity.Device.Id, out var deviceTemplate)) { throw new ArgumentException($"Cannot find device by id: {entity.Device.Id}"); } deviceLookups[deviceType] = TemplateWithArgs <DeviceTemplate> .OfNullable(deviceTemplate, deviceTemplate.DeserializeArgs(entity.Device.Args)); } var deviceInstances = new Dictionary <DeviceType, IDevice>(); var success = false; try { foreach (var entry in deviceLookups) { System.Diagnostics.Debug.Assert(entry.Value.Template != null, "entry.Value.Template != null"); deviceInstances[entry.Key] = entry.Value.Template.NewInstance(entry.Value.Args); } success = true; } finally { if (!success) { foreach (var device in deviceInstances.Values) { device.Dispose(); } } } return(deviceInstances); }
/// <summary> /// Get device config and consumer configs. /// </summary> /// <param name="device"></param> /// <param name="consumers"></param> /// <exception cref="InvalidParametersException"></exception> public void GetDeviceAndConsumers(out TemplateWithArgs <DeviceTemplate> device, out IReadOnlyList <TemplateWithArgs <ConsumerTemplate> > consumers) { var invalidDeviceParams = _deviceViewModel.ParamPanel.GetInvalidParams().ToArray(); var invalidConsumerParamsArray = _consumerViewModels.Select(vm => vm.ParamPanel.GetInvalidParams().ToArray()).ToArray(); if (invalidDeviceParams.Any() || (invalidConsumerParamsArray.Sum(p => (int?)p.Length) ?? 0) > 0) { throw new InvalidParametersException(invalidDeviceParams, invalidConsumerParamsArray); } device = TemplateWithArgs <DeviceTemplate> .OfNullable(_deviceViewModel.Current, _deviceViewModel.ParamPanel.Context); var consumerList = new List <TemplateWithArgs <ConsumerTemplate> >(_consumerViewModels.Count); consumerList.AddRange(from viewModel in _consumerViewModels where viewModel.Current != null select new TemplateWithArgs <ConsumerTemplate>(viewModel.Current, viewModel.ParamPanel.Context)); consumers = consumerList; }