JD2022-TU1/main/tools/modules/JD.Plugin.WPF.Module/Views/PluginCollection.cs

74 lines
No EOL
2.2 KiB
C#

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<PluginViewModel>
{
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<PluginViewModel> pluginViewModels = new List<PluginViewModel>(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;
}
}
/// <inheritdoc />
public IEnumerator<PluginViewModel> GetEnumerator()
{
return _plugins.ToList().GetEnumerator();
}
/// <inheritdoc />
IEnumerator IEnumerable.GetEnumerator()
{
return _plugins.GetEnumerator();
}
}
}