using System.Collections; using System.Collections.Generic; using System.Linq; using System.Windows; using System.Windows.Threading; using JD.Interfaces.Remoting; using JD.Plugin.WPF.Module.ViewModel; using Plume.WPF.Mvvm; namespace JD.Plugin.WPF.Module.Views { public class PluginCollection : BindableBase, IEnumerable { private readonly Dispatcher _dispatcher; private PluginViewModel[] _plugins; public PluginCollection(Dispatcher dispatcher, params IPlugin[] plugins) { _dispatcher = dispatcher; ProcessInnerCollection(plugins); } public PluginCollection(params IPlugin[] plugins) : this(null, plugins) { } private void ProcessInnerCollection(IPlugin[] plugins) { List pluginViewModels = new List(plugins.Length); foreach (IPlugin plugin in plugins.ToArray()) { plugin.ConnectedChanged += Plugin_ConnectedChanged; PluginViewModel pluginvm = new PluginViewModel { IsConnected = plugin.IsConnected, Name = plugin.Name }; pluginViewModels.Add(pluginvm); } Plugins = pluginViewModels.ToArray(); } public PluginViewModel[] Plugins { get => _plugins; set => SetProperty(ref _plugins, value); } private void Plugin_ConnectedChanged(object sender, IPlugin e) { PluginViewModel pluginViewModel = Plugins.Single(p => p.Name == e.Name); if (_dispatcher != null) { _dispatcher.Invoke(() => { pluginViewModel.IsConnected = e.IsConnected; }); } else { pluginViewModel.IsConnected = e.IsConnected; } } /// public IEnumerator GetEnumerator() { return _plugins.ToList().GetEnumerator(); } /// IEnumerator IEnumerable.GetEnumerator() { return _plugins.GetEnumerator(); } } }