using System; using System.Collections.ObjectModel; using System.Collections.Specialized; using System.Linq; using System.Reactive.Disposables; using Artemis.Core; using Artemis.UI.Shared; using DynamicData.Binding; using ReactiveUI; namespace Artemis.UI.Screens.Device { public class DeviceLedsTabViewModel : ActivatableViewModelBase { private readonly ObservableCollection _selectedLeds; public DeviceLedsTabViewModel(ArtemisDevice device, ObservableCollection selectedLeds) { _selectedLeds = selectedLeds; Device = device; DisplayName = "LEDs"; LedViewModels = new ObservableCollection(Device.Leds.Select(l => new DeviceLedsTabLedViewModel(l, _selectedLeds))); this.WhenActivated(disposables => _selectedLeds.ToObservableChangeSet().Subscribe(_ => UpdateSelectedLeds()).DisposeWith(disposables)); } public ArtemisDevice Device { get; } public ObservableCollection LedViewModels { get; } private void SelectedLedsOnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { UpdateSelectedLeds(); } private void UpdateSelectedLeds() { foreach (DeviceLedsTabLedViewModel deviceLedsTabLedViewModel in LedViewModels) deviceLedsTabLedViewModel.Update(); } } public class DeviceLedsTabLedViewModel : ViewModelBase { private readonly ObservableCollection _selectedLeds; private bool _isSelected; public DeviceLedsTabLedViewModel(ArtemisLed artemisLed, ObservableCollection selectedLeds) { _selectedLeds = selectedLeds; ArtemisLed = artemisLed; Update(); } public ArtemisLed ArtemisLed { get; } public bool IsSelected { get => _isSelected; set { if (!RaiseAndSetIfChanged(ref _isSelected, value)) return; Apply(); } } public void Update() { IsSelected = _selectedLeds.Contains(ArtemisLed); } public void Apply() { if (IsSelected && !_selectedLeds.Contains(ArtemisLed)) _selectedLeds.Add(ArtemisLed); else if (!IsSelected && _selectedLeds.Contains(ArtemisLed)) _selectedLeds.Remove(ArtemisLed); } } }