From 5cae14efd3a391d95cefbe9526401fcbb162faeb Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 28 Apr 2021 17:06:47 +0200 Subject: [PATCH] Prerequisites - Moved to PluginInfo and FeatureInfo Features don't have instances until they are enabled so this made sense, Plugins followed suit for consistency's sake --- src/Artemis.Core/Plugins/Plugin.cs | 23 ++++++++----------- src/Artemis.Core/Plugins/PluginFeature.cs | 5 ---- src/Artemis.Core/Plugins/PluginFeatureInfo.cs | 15 ++++++++++++ src/Artemis.Core/Plugins/PluginInfo.cs | 16 +++++++++++++ .../Services/PluginManagementService.cs | 2 +- ...uginPrerequisitesInstallDialogViewModel.cs | 9 +++++--- ...inPrerequisitesUninstallDialogViewModel.cs | 9 +++++--- .../Tabs/Plugins/PluginSettingsViewModel.cs | 18 ++++++++++----- 8 files changed, 66 insertions(+), 31 deletions(-) diff --git a/src/Artemis.Core/Plugins/Plugin.cs b/src/Artemis.Core/Plugins/Plugin.cs index a8dbaf7ad..6dab36b99 100644 --- a/src/Artemis.Core/Plugins/Plugin.cs +++ b/src/Artemis.Core/Plugins/Plugin.cs @@ -78,11 +78,6 @@ namespace Artemis.Core /// public IKernel? Kernel { get; internal set; } - /// - /// Gets a list of prerequisites for this plugin feature - /// - public List Prerequisites { get; } = new(); - /// /// The PluginLoader backing this plugin /// @@ -118,6 +113,16 @@ namespace Artemis.Core { return _features.FirstOrDefault(i => i.Instance is T)?.Instance as T; } + + /// + /// Looks up the feature info the feature of type + /// + /// The type of feature to find + /// If found, feature info of the feature + public PluginFeatureInfo? GetFeatureInfo() where T : PluginFeature + { + return _features.FirstOrDefault(i => i.FeatureType == typeof(T)); + } /// public override string ToString() @@ -125,14 +130,6 @@ namespace Artemis.Core return Info.ToString(); } - /// - /// Determines whether the prerequisites of this plugin are met - /// - public bool ArePrerequisitesMet() - { - return Prerequisites.All(p => p.IsMet()); - } - /// /// Occurs when the plugin is enabled /// diff --git a/src/Artemis.Core/Plugins/PluginFeature.cs b/src/Artemis.Core/Plugins/PluginFeature.cs index dbe5a87d0..aa661c951 100644 --- a/src/Artemis.Core/Plugins/PluginFeature.cs +++ b/src/Artemis.Core/Plugins/PluginFeature.cs @@ -60,11 +60,6 @@ namespace Artemis.Core /// public TimeSpan RenderTime { get; private set; } - /// - /// Gets a list of prerequisites for this plugin feature - /// - public List Prerequisites { get; } = new(); - internal PluginFeatureEntity Entity { get; set; } = null!; // Will be set right after construction /// diff --git a/src/Artemis.Core/Plugins/PluginFeatureInfo.cs b/src/Artemis.Core/Plugins/PluginFeatureInfo.cs index 47f34cbaa..9bb78b186 100644 --- a/src/Artemis.Core/Plugins/PluginFeatureInfo.cs +++ b/src/Artemis.Core/Plugins/PluginFeatureInfo.cs @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using System.Linq; using Artemis.Core.DataModelExpansions; using Artemis.Core.DeviceProviders; using Artemis.Core.LayerBrushes; @@ -128,6 +130,19 @@ namespace Artemis.Core internal set => SetAndNotify(ref _instance, value); } + /// + /// Gets a list of prerequisites for this plugin feature + /// + public List Prerequisites { get; } = new(); + + /// + /// Determines whether the prerequisites of this feature are met + /// + public bool ArePrerequisitesMet() + { + return Prerequisites.All(p => p.IsMet()); + } + /// public override string ToString() { diff --git a/src/Artemis.Core/Plugins/PluginInfo.cs b/src/Artemis.Core/Plugins/PluginInfo.cs index fcbeacd07..0ae163d14 100644 --- a/src/Artemis.Core/Plugins/PluginInfo.cs +++ b/src/Artemis.Core/Plugins/PluginInfo.cs @@ -1,5 +1,7 @@ using System; +using System.Collections.Generic; using System.ComponentModel; +using System.Linq; using Newtonsoft.Json; namespace Artemis.Core @@ -117,6 +119,20 @@ namespace Artemis.Core internal set => SetAndNotify(ref _plugin, value); } + /// + /// Gets a list of prerequisites for this plugin + /// + public List Prerequisites { get; } = new(); + + + /// + /// Determines whether the prerequisites of this plugin are met + /// + public bool ArePrerequisitesMet() + { + return Prerequisites.All(p => p.IsMet()); + } + /// public override string ToString() { diff --git a/src/Artemis.Core/Services/PluginManagementService.cs b/src/Artemis.Core/Services/PluginManagementService.cs index a46c1e3fb..c28b8d44a 100644 --- a/src/Artemis.Core/Services/PluginManagementService.cs +++ b/src/Artemis.Core/Services/PluginManagementService.cs @@ -381,7 +381,7 @@ namespace Artemis.Core.Services return; } - if (!plugin.ArePrerequisitesMet()) + if (!plugin.Info.ArePrerequisitesMet()) throw new ArtemisPluginPrerequisiteException(plugin, null, "Cannot enable a plugin whose prerequisites aren't all met"); // Create the Ninject child kernel and load the module diff --git a/src/Artemis.UI/Screens/Plugins/PluginPrerequisitesInstallDialogViewModel.cs b/src/Artemis.UI/Screens/Plugins/PluginPrerequisitesInstallDialogViewModel.cs index 26435d24e..9b0fb0323 100644 --- a/src/Artemis.UI/Screens/Plugins/PluginPrerequisitesInstallDialogViewModel.cs +++ b/src/Artemis.UI/Screens/Plugins/PluginPrerequisitesInstallDialogViewModel.cs @@ -27,12 +27,12 @@ namespace Artemis.UI.Screens.Plugins if (pluginOrFeature is Plugin plugin) { Plugin = plugin; - Prerequisites = new BindableCollection(plugin.Prerequisites.Select(p => prerequisitesVmFactory.PluginPrerequisiteViewModel(p, false))); + Prerequisites = new BindableCollection(plugin.Info.Prerequisites.Select(p => prerequisitesVmFactory.PluginPrerequisiteViewModel(p, false))); } else if (pluginOrFeature is PluginFeature feature) { Feature = feature; - Prerequisites = new BindableCollection(feature.Prerequisites.Select(p => prerequisitesVmFactory.PluginPrerequisiteViewModel(p, false))); + Prerequisites = new BindableCollection(feature.Info.Prerequisites.Select(p => prerequisitesVmFactory.PluginPrerequisiteViewModel(p, false))); } else throw new ArtemisUIException($"Expected plugin or feature to be passed to {nameof(PluginPrerequisitesInstallDialogViewModel)}"); @@ -136,7 +136,10 @@ namespace Artemis.UI.Screens.Plugins protected override void OnInitialActivate() { CanInstall = false; - Task.Run(() => CanInstall = !Plugin.ArePrerequisitesMet()); + if (Plugin != null) + Task.Run(() => CanInstall = !Plugin.Info.ArePrerequisitesMet()); + else + Task.Run(() => CanInstall = !Feature.Info.ArePrerequisitesMet()); base.OnInitialActivate(); } diff --git a/src/Artemis.UI/Screens/Plugins/PluginPrerequisitesUninstallDialogViewModel.cs b/src/Artemis.UI/Screens/Plugins/PluginPrerequisitesUninstallDialogViewModel.cs index 71a160df7..d4d27cc8d 100644 --- a/src/Artemis.UI/Screens/Plugins/PluginPrerequisitesUninstallDialogViewModel.cs +++ b/src/Artemis.UI/Screens/Plugins/PluginPrerequisitesUninstallDialogViewModel.cs @@ -32,12 +32,12 @@ namespace Artemis.UI.Screens.Plugins if (pluginOrFeature is Plugin plugin) { Plugin = plugin; - Prerequisites = new BindableCollection(plugin.Prerequisites.Select(p => prerequisitesVmFactory.PluginPrerequisiteViewModel(p, true))); + Prerequisites = new BindableCollection(plugin.Info.Prerequisites.Select(p => prerequisitesVmFactory.PluginPrerequisiteViewModel(p, true))); } else if (pluginOrFeature is PluginFeature feature) { Feature = feature; - Prerequisites = new BindableCollection(feature.Prerequisites.Select(p => prerequisitesVmFactory.PluginPrerequisiteViewModel(p, true))); + Prerequisites = new BindableCollection(feature.Info.Prerequisites.Select(p => prerequisitesVmFactory.PluginPrerequisiteViewModel(p, true))); } else throw new ArtemisUIException($"Expected plugin or feature to be passed to {nameof(PluginPrerequisitesInstallDialogViewModel)}"); @@ -144,7 +144,10 @@ namespace Artemis.UI.Screens.Plugins { CanUninstall = false; // Could be slow so take it off of the UI thread - Task.Run(() => CanUninstall = Plugin.Prerequisites.Any(p => p.IsMet())); + if (Plugin != null) + Task.Run(() => CanUninstall = Plugin.Info.Prerequisites.Any(p => p.IsMet())); + else + Task.Run(() => CanUninstall = Feature.Info.Prerequisites.Any(p => p.IsMet())); base.OnInitialActivate(); } diff --git a/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsViewModel.cs b/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsViewModel.cs index e3aa2f065..bf7e78361 100644 --- a/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsViewModel.cs +++ b/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsViewModel.cs @@ -140,13 +140,13 @@ namespace Artemis.UI.Screens.Settings.Tabs.Plugins public async Task InstallPrerequisites() { - if (Plugin.Prerequisites.Any()) + if (Plugin.Info.Prerequisites.Any()) await ShowPrerequisitesDialog(false); } public async Task RemovePrerequisites() { - if (Plugin.Prerequisites.Any(p => p.UninstallActions.Any())) + if (Plugin.Info.Prerequisites.Any(p => p.UninstallActions.Any())) { await ShowPrerequisitesDialog(true); NotifyOfPropertyChange(nameof(IsEnabled)); @@ -179,6 +179,12 @@ namespace Artemis.UI.Screens.Settings.Tabs.Plugins if (!confirmed) return; + // If the plugin or any of its features has uninstall actions, offer to run these + if (Plugin.Info.Prerequisites.Any(p => p.UninstallActions.Any()) || Plugin.Features.Any(f => f.Prerequisites.Any(fp => fp.UninstallActions.Any()))) + { + + } + try { _pluginManagementService.RemovePlugin(Plugin, false); @@ -236,10 +242,10 @@ namespace Artemis.UI.Screens.Settings.Tabs.Plugins } // Check if all prerequisites are met async - if (!Plugin.ArePrerequisitesMet()) + if (!Plugin.Info.ArePrerequisitesMet()) { await ShowPrerequisitesDialog(false); - if (!Plugin.ArePrerequisitesMet()) + if (!Plugin.Info.ArePrerequisitesMet()) { CancelEnable(); return; @@ -275,8 +281,8 @@ namespace Artemis.UI.Screens.Settings.Tabs.Plugins private void CheckPrerequisites() { - CanInstallPrerequisites = Plugin.Prerequisites.Any(); - CanRemovePrerequisites = Plugin.Prerequisites.Any(p => p.UninstallActions.Any()); + CanInstallPrerequisites = Plugin.Info.Prerequisites.Any(); + CanRemovePrerequisites = Plugin.Info.Prerequisites.Any(p => p.UninstallActions.Any()); } private async Task ShowPrerequisitesDialog(bool uninstall)