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; using Artemis.Core.Modules; using Artemis.Storage.Entities.Plugins; using Humanizer; using Newtonsoft.Json; namespace Artemis.Core { /// /// Represents basic info about a plugin feature and contains a reference to the instance of said feature /// [JsonObject(MemberSerialization.OptIn)] public class PluginFeatureInfo : CorePropertyChanged, IPrerequisitesSubject { private string? _description; private string? _icon; private PluginFeature? _instance; private string _name = null!; internal PluginFeatureInfo(Plugin plugin, Type featureType, PluginFeatureEntity pluginFeatureEntity, PluginFeatureAttribute? attribute) { Plugin = plugin ?? throw new ArgumentNullException(nameof(plugin)); FeatureType = featureType ?? throw new ArgumentNullException(nameof(featureType)); Entity = pluginFeatureEntity; Name = attribute?.Name ?? featureType.Name.Humanize(LetterCasing.Title); Description = attribute?.Description; Icon = attribute?.Icon; AlwaysEnabled = attribute?.AlwaysEnabled ?? false; if (Icon != null) return; if (typeof(BaseDataModelExpansion).IsAssignableFrom(featureType)) Icon = "TableAdd"; else if (typeof(DeviceProvider).IsAssignableFrom(featureType)) Icon = "Devices"; else if (typeof(ProfileModule).IsAssignableFrom(featureType)) Icon = "VectorRectangle"; else if (typeof(Module).IsAssignableFrom(featureType)) Icon = "GearBox"; else if (typeof(LayerBrushProvider).IsAssignableFrom(featureType)) Icon = "Brush"; else if (typeof(LayerEffectProvider).IsAssignableFrom(featureType)) Icon = "AutoAwesome"; else Icon = "Plugin"; } internal PluginFeatureInfo(Plugin plugin, PluginFeatureAttribute? attribute, PluginFeature instance) { if (instance == null) throw new ArgumentNullException(nameof(instance)); Plugin = plugin ?? throw new ArgumentNullException(nameof(plugin)); FeatureType = instance.GetType(); Name = attribute?.Name ?? instance.GetType().Name.Humanize(LetterCasing.Title); Description = attribute?.Description; Icon = attribute?.Icon; AlwaysEnabled = attribute?.AlwaysEnabled ?? false; Instance = instance; if (Icon != null) return; Icon = Instance switch { BaseDataModelExpansion => "TableAdd", DeviceProvider => "Devices", ProfileModule => "VectorRectangle", Module => "GearBox", LayerBrushProvider => "Brush", LayerEffectProvider => "AutoAwesome", _ => "Plugin" }; } /// /// Gets the plugin this feature info is associated with /// public Plugin Plugin { get; } /// /// Gets the type of the feature /// public Type FeatureType { get; } /// /// The name of the plugin /// [JsonProperty(Required = Required.Always)] public string Name { get => _name; internal set => SetAndNotify(ref _name, value); } /// /// A short description of the plugin /// [JsonProperty] public string? Description { get => _description; set => SetAndNotify(ref _description, value); } /// /// The plugins display icon that's shown in the settings see for /// available icons /// [JsonProperty] public string? Icon { get => _icon; set => SetAndNotify(ref _icon, value); } /// /// Marks the feature to always be enabled as long as the plugin is enabled and cannot be disabled /// [JsonProperty] public bool AlwaysEnabled { get; } /// /// Gets a boolean indicating whether the feature is enabled in persistent storage /// public bool EnabledInStorage => Entity.IsEnabled; /// /// Gets the feature this info is associated with /// public PluginFeature? Instance { get => _instance; internal set => SetAndNotify(ref _instance, value); } /// public List Prerequisites { get; } = new(); /// public bool ArePrerequisitesMet() => Prerequisites.All(p => p.IsMet()); internal PluginFeatureEntity Entity { get; } /// public override string ToString() { return Instance?.Id ?? "Uninitialized feature"; } } }