1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00

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
This commit is contained in:
Robert 2021-04-28 17:06:47 +02:00
parent 0cfddcbbaf
commit 5cae14efd3
8 changed files with 66 additions and 31 deletions

View File

@ -78,11 +78,6 @@ namespace Artemis.Core
/// </summary>
public IKernel? Kernel { get; internal set; }
/// <summary>
/// Gets a list of prerequisites for this plugin feature
/// </summary>
public List<PluginPrerequisite> Prerequisites { get; } = new();
/// <summary>
/// The PluginLoader backing this plugin
/// </summary>
@ -118,6 +113,16 @@ namespace Artemis.Core
{
return _features.FirstOrDefault(i => i.Instance is T)?.Instance as T;
}
/// <summary>
/// Looks up the feature info the feature of type <typeparamref name="T" />
/// </summary>
/// <typeparam name="T">The type of feature to find</typeparam>
/// <returns>If found, feature info of the feature</returns>
public PluginFeatureInfo? GetFeatureInfo<T>() where T : PluginFeature
{
return _features.FirstOrDefault(i => i.FeatureType == typeof(T));
}
/// <inheritdoc />
public override string ToString()
@ -125,14 +130,6 @@ namespace Artemis.Core
return Info.ToString();
}
/// <summary>
/// Determines whether the prerequisites of this plugin are met
/// </summary>
public bool ArePrerequisitesMet()
{
return Prerequisites.All(p => p.IsMet());
}
/// <summary>
/// Occurs when the plugin is enabled
/// </summary>

View File

@ -60,11 +60,6 @@ namespace Artemis.Core
/// </summary>
public TimeSpan RenderTime { get; private set; }
/// <summary>
/// Gets a list of prerequisites for this plugin feature
/// </summary>
public List<PluginPrerequisite> Prerequisites { get; } = new();
internal PluginFeatureEntity Entity { get; set; } = null!; // Will be set right after construction
/// <summary>

View File

@ -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);
}
/// <summary>
/// Gets a list of prerequisites for this plugin feature
/// </summary>
public List<PluginPrerequisite> Prerequisites { get; } = new();
/// <summary>
/// Determines whether the prerequisites of this feature are met
/// </summary>
public bool ArePrerequisitesMet()
{
return Prerequisites.All(p => p.IsMet());
}
/// <inheritdoc />
public override string ToString()
{

View File

@ -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);
}
/// <summary>
/// Gets a list of prerequisites for this plugin
/// </summary>
public List<PluginPrerequisite> Prerequisites { get; } = new();
/// <summary>
/// Determines whether the prerequisites of this plugin are met
/// </summary>
public bool ArePrerequisitesMet()
{
return Prerequisites.All(p => p.IsMet());
}
/// <inheritdoc />
public override string ToString()
{

View File

@ -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

View File

@ -27,12 +27,12 @@ namespace Artemis.UI.Screens.Plugins
if (pluginOrFeature is Plugin plugin)
{
Plugin = plugin;
Prerequisites = new BindableCollection<PluginPrerequisiteViewModel>(plugin.Prerequisites.Select(p => prerequisitesVmFactory.PluginPrerequisiteViewModel(p, false)));
Prerequisites = new BindableCollection<PluginPrerequisiteViewModel>(plugin.Info.Prerequisites.Select(p => prerequisitesVmFactory.PluginPrerequisiteViewModel(p, false)));
}
else if (pluginOrFeature is PluginFeature feature)
{
Feature = feature;
Prerequisites = new BindableCollection<PluginPrerequisiteViewModel>(feature.Prerequisites.Select(p => prerequisitesVmFactory.PluginPrerequisiteViewModel(p, false)));
Prerequisites = new BindableCollection<PluginPrerequisiteViewModel>(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();
}

View File

@ -32,12 +32,12 @@ namespace Artemis.UI.Screens.Plugins
if (pluginOrFeature is Plugin plugin)
{
Plugin = plugin;
Prerequisites = new BindableCollection<PluginPrerequisiteViewModel>(plugin.Prerequisites.Select(p => prerequisitesVmFactory.PluginPrerequisiteViewModel(p, true)));
Prerequisites = new BindableCollection<PluginPrerequisiteViewModel>(plugin.Info.Prerequisites.Select(p => prerequisitesVmFactory.PluginPrerequisiteViewModel(p, true)));
}
else if (pluginOrFeature is PluginFeature feature)
{
Feature = feature;
Prerequisites = new BindableCollection<PluginPrerequisiteViewModel>(feature.Prerequisites.Select(p => prerequisitesVmFactory.PluginPrerequisiteViewModel(p, true)));
Prerequisites = new BindableCollection<PluginPrerequisiteViewModel>(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();
}

View File

@ -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<object> ShowPrerequisitesDialog(bool uninstall)