From 2179c889a35beb63b458c6bd1bbf2c62c6c8e923 Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 9 Jun 2021 20:58:05 +0200 Subject: [PATCH] Modules - Remove Name and Icon in favor PluginFeature attribute --- src/Artemis.Core/Plugins/Modules/Module.cs | 30 ++++--------- src/Artemis.Core/Plugins/PluginFeatureInfo.cs | 14 +++++- src/Artemis.Core/Plugins/PluginInfo.cs | 13 ++++++ .../Utilities/CorePluginFeature.cs | 5 ++- .../Utilities/PluginUtilities.cs | 43 ------------------- .../Debug/Tabs/DataModelDebugViewModel.cs | 2 +- .../PerformanceDebugPluginView.xaml | 2 +- .../PerformanceDebugPluginViewModel.cs | 10 ++--- .../Tabs/Plugins/PluginFeatureView.xaml | 3 +- .../Tabs/Plugins/PluginSettingsView.xaml | 2 +- .../Tabs/Plugins/PluginSettingsViewModel.cs | 7 +-- .../Plugins/PluginSettingsWindowViewModel.cs | 4 +- .../ModuleActivationRequirementsViewModel.cs | 2 +- .../ProfileEdit/ProfileModuleViewModel.cs | 7 +-- 14 files changed, 54 insertions(+), 90 deletions(-) delete mode 100644 src/Artemis.UI.Shared/Utilities/PluginUtilities.cs diff --git a/src/Artemis.Core/Plugins/Modules/Module.cs b/src/Artemis.Core/Plugins/Modules/Module.cs index 3e0af867d..edf3cb340 100644 --- a/src/Artemis.Core/Plugins/Modules/Module.cs +++ b/src/Artemis.Core/Plugins/Modules/Module.cs @@ -61,7 +61,6 @@ namespace Artemis.Core.Modules } } - /// /// For internal use only, please use . /// @@ -79,20 +78,15 @@ namespace Artemis.Core.Modules /// Gets a read only collection of default profile paths /// public IReadOnlyCollection<(DefaultCategoryName, string)> DefaultProfilePaths => _defaultProfilePaths.AsReadOnly(); - + /// - /// The modules display name that's shown in the menu - /// - public string? DisplayName { get; protected set; } - - /// - /// The modules display icon that's shown in the UI accepts: + /// A list of activation requirements /// - /// Either set to the name of a Material Icon see ( for available - /// icons) or set to a path relative to the plugin folder pointing to a .svg file + /// If this list is not and not empty becomes + /// and the data of this module is only available to profiles specifically targeting it. /// /// - public string? DisplayIcon { get; set; } + public abstract List? ActivationRequirements { get; } /// /// Gets whether this module is activated. A module can only be active while its @@ -114,12 +108,6 @@ namespace Artemis.Core.Modules /// public bool UpdateDuringActivationOverride { get; protected set; } - /// - /// A list of activation requirements - /// Note: if empty the module is always activated - /// - public List ActivationRequirements { get; } = new(); - /// /// Gets or sets the activation requirement mode, defaults to /// @@ -133,7 +121,7 @@ namespace Artemis.Core.Modules /// /// /// - public bool IsAlwaysAvailable => ActivationRequirements.Count == 0; + public bool IsAlwaysAvailable => ActivationRequirements == null || ActivationRequirements.Count == 0; /// /// Gets whether updating this module is currently allowed @@ -181,12 +169,12 @@ namespace Artemis.Core.Modules /// The evaluated result of the activation requirements public bool EvaluateActivationRequirements() { - if (!ActivationRequirements.Any()) + if (IsAlwaysAvailable) return true; if (ActivationRequirementMode == ActivationRequirementType.All) - return ActivationRequirements.All(r => r.Evaluate()); + return ActivationRequirements!.All(r => r.Evaluate()); if (ActivationRequirementMode == ActivationRequirementType.Any) - return ActivationRequirements.Any(r => r.Evaluate()); + return ActivationRequirements!.Any(r => r.Evaluate()); return false; } diff --git a/src/Artemis.Core/Plugins/PluginFeatureInfo.cs b/src/Artemis.Core/Plugins/PluginFeatureInfo.cs index 390e7419e..a7b468835 100644 --- a/src/Artemis.Core/Plugins/PluginFeatureInfo.cs +++ b/src/Artemis.Core/Plugins/PluginFeatureInfo.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using Artemis.Core.DataModelExpansions; using Artemis.Core.DeviceProviders; using Artemis.Core.LayerBrushes; using Artemis.Core.LayerEffects; @@ -132,6 +131,19 @@ namespace Artemis.Core internal set => SetAndNotify(ref _instance, value); } + /// + /// Gets a string representing either a full path pointing to an svg or the markdown icon + /// + public string? ResolvedIcon + { + get + { + if (Icon == null) + return null; + return Icon.EndsWith(".svg") ? Plugin.ResolveRelativePath(Icon) : Icon; + } + } + internal PluginFeatureEntity Entity { get; } /// diff --git a/src/Artemis.Core/Plugins/PluginInfo.cs b/src/Artemis.Core/Plugins/PluginInfo.cs index 5037b186b..7358c3ad5 100644 --- a/src/Artemis.Core/Plugins/PluginInfo.cs +++ b/src/Artemis.Core/Plugins/PluginInfo.cs @@ -152,6 +152,19 @@ namespace Artemis.Core internal set => SetAndNotify(ref _plugin, value); } + /// + /// Gets a string representing either a full path pointing to an svg or the markdown icon + /// + public string? ResolvedIcon + { + get + { + if (Icon == null) + return null; + return Icon.EndsWith(".svg") ? Plugin.ResolveRelativePath(Icon) : Icon; + } + } + internal string PreferredPluginDirectory => $"{Main.Split(".dll")[0].Replace("/", "").Replace("\\", "")}-{Guid.ToString().Substring(0, 8)}"; /// diff --git a/src/Artemis.Core/Utilities/CorePluginFeature.cs b/src/Artemis.Core/Utilities/CorePluginFeature.cs index 6e7857389..979457645 100644 --- a/src/Artemis.Core/Utilities/CorePluginFeature.cs +++ b/src/Artemis.Core/Utilities/CorePluginFeature.cs @@ -1,4 +1,5 @@ -using Artemis.Core.LayerEffects; +using System.Collections.Generic; +using Artemis.Core.LayerEffects; using Artemis.Core.Modules; namespace Artemis.Core @@ -14,6 +15,8 @@ namespace Artemis.Core IsEnabled = true; } + public override List? ActivationRequirements => null; + public override void Enable() { } diff --git a/src/Artemis.UI.Shared/Utilities/PluginUtilities.cs b/src/Artemis.UI.Shared/Utilities/PluginUtilities.cs deleted file mode 100644 index c393c7fdd..000000000 --- a/src/Artemis.UI.Shared/Utilities/PluginUtilities.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.IO; -using Artemis.Core; -using MaterialDesignThemes.Wpf; - -namespace Artemis.UI.Shared -{ - /// - /// Provides utilities for UI-related plugin tasks - /// - public static class PluginUtilities - { - /// - /// Transforms the provided icon so that it is usable by the control - /// - /// The plugin the icon belongs to - /// - /// The icon, may be a string representation of a or a relative path - /// pointing to a .svg file - /// - /// - public static object GetPluginIcon(Plugin plugin, string icon) - { - if (icon == null) - return PackIconKind.QuestionMarkCircle; - - // Icon is provided as a path - if (icon.EndsWith(".svg")) - { - string iconPath = plugin.ResolveRelativePath(icon); - if (!File.Exists(iconPath)) - return PackIconKind.QuestionMarkCircle; - return iconPath; - } - - // Icon is provided as string to avoid having to reference MaterialDesignThemes - bool parsedIcon = Enum.TryParse(icon, true, out PackIconKind iconEnum); - if (parsedIcon == false) - iconEnum = PackIconKind.QuestionMarkCircle; - return iconEnum; - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Settings/Debug/Tabs/DataModelDebugViewModel.cs b/src/Artemis.UI/Screens/Settings/Debug/Tabs/DataModelDebugViewModel.cs index 37c056fe8..32dbb01b5 100644 --- a/src/Artemis.UI/Screens/Settings/Debug/Tabs/DataModelDebugViewModel.cs +++ b/src/Artemis.UI/Screens/Settings/Debug/Tabs/DataModelDebugViewModel.cs @@ -142,7 +142,7 @@ namespace Artemis.UI.Screens.Settings.Debug.Tabs private void PopulateModules() { Modules.Clear(); - Modules.AddRange(_pluginManagementService.GetFeaturesOfType().Where(p => p.IsEnabled).OrderBy(m => m.DisplayName)); + Modules.AddRange(_pluginManagementService.GetFeaturesOfType().Where(p => p.IsEnabled).OrderBy(m => m.Info.Name)); if (SelectedModule == null) _dataModelUIService.UpdateModules(MainDataModel); diff --git a/src/Artemis.UI/Screens/Settings/Debug/Tabs/Performance/PerformanceDebugPluginView.xaml b/src/Artemis.UI/Screens/Settings/Debug/Tabs/Performance/PerformanceDebugPluginView.xaml index 4a3d11955..538e7de06 100644 --- a/src/Artemis.UI/Screens/Settings/Debug/Tabs/Performance/PerformanceDebugPluginView.xaml +++ b/src/Artemis.UI/Screens/Settings/Debug/Tabs/Performance/PerformanceDebugPluginView.xaml @@ -17,7 +17,7 @@ - + diff --git a/src/Artemis.UI/Screens/Settings/Debug/Tabs/Performance/PerformanceDebugPluginViewModel.cs b/src/Artemis.UI/Screens/Settings/Debug/Tabs/Performance/PerformanceDebugPluginViewModel.cs index 719eff26b..52da00c64 100644 --- a/src/Artemis.UI/Screens/Settings/Debug/Tabs/Performance/PerformanceDebugPluginViewModel.cs +++ b/src/Artemis.UI/Screens/Settings/Debug/Tabs/Performance/PerformanceDebugPluginViewModel.cs @@ -1,29 +1,25 @@ using System.Linq; using Artemis.Core; -using Artemis.UI.Shared; using Stylet; namespace Artemis.UI.Screens.Settings.Debug.Tabs.Performance { public class PerformanceDebugPluginViewModel : Screen { - public Plugin Plugin { get; } - public object Icon { get; } - public PerformanceDebugPluginViewModel(Plugin plugin) { Plugin = plugin; - Icon = PluginUtilities.GetPluginIcon(Plugin, Plugin.Info.Icon); } + public Plugin Plugin { get; } + public BindableCollection Profilers { get; } = new(); + public void Update() { foreach (Profiler pluginProfiler in Plugin.Profilers.Where(p => p.Measurements.Any())) - { if (Profilers.All(p => p.Profiler != pluginProfiler)) Profilers.Add(new PerformanceDebugProfilerViewModel(pluginProfiler)); - } foreach (PerformanceDebugProfilerViewModel profilerViewModel in Profilers) profilerViewModel.Update(); diff --git a/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginFeatureView.xaml b/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginFeatureView.xaml index bd8688b08..d18c02458 100644 --- a/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginFeatureView.xaml +++ b/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginFeatureView.xaml @@ -29,8 +29,9 @@ diff --git a/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsView.xaml b/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsView.xaml index 82cad706c..d20d17e5a 100644 --- a/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsView.xaml +++ b/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsView.xaml @@ -42,7 +42,7 @@ - _enabling; set => SetAndNotify(ref _enabling, value); } - - public object Icon { get; set; } + public string Type => Plugin.GetType().BaseType?.Name ?? Plugin.GetType().Name; public bool CanOpenSettings => IsEnabled && Plugin.ConfigurationDialog != null; @@ -102,7 +99,7 @@ namespace Artemis.UI.Screens.Settings.Tabs.Plugins try { PluginConfigurationViewModel viewModel = (PluginConfigurationViewModel) Plugin.Kernel.Get(configurationViewModel.Type); - _windowManager.ShowWindow(new PluginSettingsWindowViewModel(viewModel, Icon)); + _windowManager.ShowWindow(new PluginSettingsWindowViewModel(viewModel)); } catch (Exception e) { diff --git a/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsWindowViewModel.cs b/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsWindowViewModel.cs index 7f4a229f8..47230b878 100644 --- a/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsWindowViewModel.cs +++ b/src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsWindowViewModel.cs @@ -8,10 +8,10 @@ namespace Artemis.UI.Screens.Settings.Tabs.Plugins { private readonly PluginConfigurationViewModel _configurationViewModel; - public PluginSettingsWindowViewModel(PluginConfigurationViewModel configurationViewModel, object icon) + public PluginSettingsWindowViewModel(PluginConfigurationViewModel configurationViewModel) { _configurationViewModel = configurationViewModel ?? throw new ArgumentNullException(nameof(configurationViewModel)); - Icon = icon; + Icon = configurationViewModel.Plugin.Info.Icon; } public object Icon { get; } diff --git a/src/Artemis.UI/Screens/Sidebar/Dialogs/ProfileEdit/ModuleActivationRequirementsViewModel.cs b/src/Artemis.UI/Screens/Sidebar/Dialogs/ProfileEdit/ModuleActivationRequirementsViewModel.cs index 49a82f1d5..aadd20c74 100644 --- a/src/Artemis.UI/Screens/Sidebar/Dialogs/ProfileEdit/ModuleActivationRequirementsViewModel.cs +++ b/src/Artemis.UI/Screens/Sidebar/Dialogs/ProfileEdit/ModuleActivationRequirementsViewModel.cs @@ -36,7 +36,7 @@ namespace Artemis.UI.Screens.Sidebar.Dialogs.ProfileEdit : "any requirement is met"; Items.Clear(); - if (Module != null) + if (Module?.ActivationRequirements != null) Items.AddRange(Module.ActivationRequirements.Select(_sidebarVmFactory.ModuleActivationRequirementViewModel)); } } diff --git a/src/Artemis.UI/Screens/Sidebar/Dialogs/ProfileEdit/ProfileModuleViewModel.cs b/src/Artemis.UI/Screens/Sidebar/Dialogs/ProfileEdit/ProfileModuleViewModel.cs index 5e4612034..692a6c687 100644 --- a/src/Artemis.UI/Screens/Sidebar/Dialogs/ProfileEdit/ProfileModuleViewModel.cs +++ b/src/Artemis.UI/Screens/Sidebar/Dialogs/ProfileEdit/ProfileModuleViewModel.cs @@ -9,11 +9,8 @@ namespace Artemis.UI.Screens.Sidebar.Dialogs.ProfileEdit public ProfileModuleViewModel(Module module) { Module = module; - Name = module.DisplayName; - if (module.DisplayIcon != null) - Icon = module.DisplayIcon.EndsWith(".svg") ? module.Plugin.ResolveRelativePath(module.DisplayIcon) : module.DisplayIcon; - else - Icon = PackIconKind.QuestionMark.ToString(); + Name = module.Info.Name; + Icon = module.Info.ResolvedIcon ?? PackIconKind.QuestionMark.ToString(); Description = module.Info.Description; }