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