mirror of
https://github.com/Artemis-RGB/Artemis
synced 2026-11-11 03:19:56 +00:00
Merge branch 'development' into feature/node-providers
This commit is contained in:
commit
6adcae94b4
65 files changed
+317
-158
No files matched your search
@@ -248,8 +248,8 @@ public sealed class Layer : RenderProfileElement
|
||||
typeof(PropertyGroupDescriptionAttribute)
|
||||
)!;
|
||||
|
||||
LayerEntity.GeneralPropertyGroup ??= new PropertyGroupEntity {Identifier = generalAttribute.Identifier};
|
||||
LayerEntity.TransformPropertyGroup ??= new PropertyGroupEntity {Identifier = transformAttribute.Identifier};
|
||||
LayerEntity.GeneralPropertyGroup ??= new PropertyGroupEntity {Identifier = generalAttribute.Identifier!};
|
||||
LayerEntity.TransformPropertyGroup ??= new PropertyGroupEntity {Identifier = transformAttribute.Identifier!};
|
||||
|
||||
General.Initialize(this, null, generalAttribute, LayerEntity.GeneralPropertyGroup);
|
||||
Transform.Initialize(this, null, transformAttribute, LayerEntity.TransformPropertyGroup);
|
||||
|
||||
@@ -240,7 +240,8 @@ public abstract class LayerPropertyGroup : IDisposable
|
||||
foreach (LayerPropertyGroup layerPropertyGroup in LayerPropertyGroups)
|
||||
{
|
||||
layerPropertyGroup.ApplyToEntity();
|
||||
PropertyGroupEntity.PropertyGroups.Add(layerPropertyGroup.PropertyGroupEntity);
|
||||
if (layerPropertyGroup.PropertyGroupEntity != null)
|
||||
PropertyGroupEntity.PropertyGroups.Add(layerPropertyGroup.PropertyGroupEntity);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ public class ArtemisDevice : CorePropertyChanged
|
||||
InputIdentifiers = new List<ArtemisDeviceInputIdentifier>();
|
||||
InputMappings = new Dictionary<ArtemisLed, ArtemisLed>();
|
||||
Categories = new HashSet<DeviceCategory>();
|
||||
LayoutSelection = new LayoutSelection {Type = DefaultLayoutProvider.LayoutType};
|
||||
LayoutSelection = new LayoutSelection {Type = DefaultLayoutProvider.LAYOUT_TYPE};
|
||||
|
||||
RgbDevice.ColorCorrections.Clear();
|
||||
RgbDevice.ColorCorrections.Add(new ScaleColorCorrection(this));
|
||||
@@ -75,7 +75,7 @@ public class ArtemisDevice : CorePropertyChanged
|
||||
InputIdentifiers = new List<ArtemisDeviceInputIdentifier>();
|
||||
InputMappings = new Dictionary<ArtemisLed, ArtemisLed>();
|
||||
Categories = new HashSet<DeviceCategory>();
|
||||
LayoutSelection = new LayoutSelection {Type = DefaultLayoutProvider.LayoutType};
|
||||
LayoutSelection = new LayoutSelection {Type = DefaultLayoutProvider.LAYOUT_TYPE};
|
||||
|
||||
foreach (DeviceInputIdentifierEntity identifierEntity in DeviceEntity.InputIdentifiers)
|
||||
InputIdentifiers.Add(new ArtemisDeviceInputIdentifier(identifierEntity.InputProvider, identifierEntity.Identifier));
|
||||
@@ -155,6 +155,9 @@ public class ArtemisDevice : CorePropertyChanged
|
||||
/// </summary>
|
||||
public HashSet<DeviceCategory> Categories { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the layout selection applied to this device
|
||||
/// </summary>
|
||||
public LayoutSelection LayoutSelection { get; }
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -57,6 +57,9 @@ public class ArtemisLayout
|
||||
/// </summary>
|
||||
public LayoutCustomDeviceData LayoutCustomDeviceData { get; private set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// Gets a boolean indicating whether this layout is a default layout or not
|
||||
/// </summary>
|
||||
public bool IsDefaultLayout { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -65,7 +65,7 @@ public class LayerBrushDescriptor
|
||||
BaseLayerBrush brush = (BaseLayerBrush) Provider.Plugin.Resolve(LayerBrushType);
|
||||
brush.Layer = layer;
|
||||
brush.Descriptor = this;
|
||||
brush.LayerBrushEntity = entity ?? new LayerBrushEntity {ProviderId = Provider.Id, BrushType = LayerBrushType.FullName};
|
||||
brush.LayerBrushEntity = entity ?? new LayerBrushEntity {ProviderId = Provider.Id, BrushType = LayerBrushType.FullName ?? throw new InvalidOperationException()};
|
||||
|
||||
brush.Initialize();
|
||||
return brush;
|
||||
|
||||
@@ -231,7 +231,7 @@ public abstract class BaseLayerEffect : BreakableModel, IDisposable, IStorageMod
|
||||
return;
|
||||
|
||||
LayerEffectEntity.ProviderId = Descriptor.Provider.Id;
|
||||
LayerEffectEntity.EffectType = GetType().FullName;
|
||||
LayerEffectEntity.EffectType = GetType().FullName ?? throw new InvalidOperationException();
|
||||
BaseProperties?.ApplyToEntity();
|
||||
LayerEffectEntity.PropertyGroup = BaseProperties?.PropertyGroupEntity;
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ public class PluginSettings
|
||||
if (_settingEntities.ContainsKey(name))
|
||||
return (PluginSetting<T>) _settingEntities[name];
|
||||
// Try to find in database
|
||||
PluginSettingEntity settingEntity = _pluginRepository.GetSettingByNameAndGuid(name, Plugin.Guid);
|
||||
PluginSettingEntity? settingEntity = _pluginRepository.GetSettingByNameAndGuid(name, Plugin.Guid);
|
||||
// If not found, create a new one
|
||||
if (settingEntity == null)
|
||||
{
|
||||
|
||||
@@ -1,8 +1,14 @@
|
||||
namespace Artemis.Core.Providers;
|
||||
|
||||
/// <summary>
|
||||
/// Represents a layout provider that loads a layout from a custom path.
|
||||
/// </summary>
|
||||
public class CustomPathLayoutProvider : ILayoutProvider
|
||||
{
|
||||
public static string LayoutType = "CustomPath";
|
||||
/// <summary>
|
||||
/// The layout type of this layout provider.
|
||||
/// </summary>
|
||||
public const string LAYOUT_TYPE = "CustomPath";
|
||||
|
||||
/// <inheritdoc />
|
||||
public ArtemisLayout? GetDeviceLayout(ArtemisDevice device)
|
||||
@@ -21,7 +27,7 @@ public class CustomPathLayoutProvider : ILayoutProvider
|
||||
/// <inheritdoc />
|
||||
public bool IsMatch(ArtemisDevice device)
|
||||
{
|
||||
return device.LayoutSelection.Type == LayoutType;
|
||||
return device.LayoutSelection.Type == LAYOUT_TYPE;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -31,7 +37,7 @@ public class CustomPathLayoutProvider : ILayoutProvider
|
||||
/// <param name="path">The path to the custom layout.</param>
|
||||
public void ConfigureDevice(ArtemisDevice device, string? path)
|
||||
{
|
||||
device.LayoutSelection.Type = LayoutType;
|
||||
device.LayoutSelection.Type = LAYOUT_TYPE;
|
||||
device.LayoutSelection.Parameter = path;
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,14 @@
|
||||
namespace Artemis.Core.Providers;
|
||||
|
||||
/// <summary>
|
||||
/// Represents a layout provider that loads a layout from the plugin and falls back to a default layout.
|
||||
/// </summary>
|
||||
public class DefaultLayoutProvider : ILayoutProvider
|
||||
{
|
||||
public static string LayoutType = "Default";
|
||||
/// <summary>
|
||||
/// The layout type of this layout provider.
|
||||
/// </summary>
|
||||
public const string LAYOUT_TYPE = "Default";
|
||||
|
||||
/// <inheritdoc />
|
||||
public ArtemisLayout? GetDeviceLayout(ArtemisDevice device)
|
||||
@@ -26,7 +32,7 @@ public class DefaultLayoutProvider : ILayoutProvider
|
||||
/// <inheritdoc />
|
||||
public bool IsMatch(ArtemisDevice device)
|
||||
{
|
||||
return device.LayoutSelection.Type == LayoutType;
|
||||
return device.LayoutSelection.Type == LAYOUT_TYPE;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -35,7 +41,7 @@ public class DefaultLayoutProvider : ILayoutProvider
|
||||
/// <param name="device">The device to apply the provider to.</param>
|
||||
public void ConfigureDevice(ArtemisDevice device)
|
||||
{
|
||||
device.LayoutSelection.Type = LayoutType;
|
||||
device.LayoutSelection.Type = LAYOUT_TYPE;
|
||||
device.LayoutSelection.Parameter = null;
|
||||
}
|
||||
}
|
||||
@@ -12,6 +12,17 @@ public interface ILayoutProvider
|
||||
/// <returns>The resulting layout if one was available; otherwise <see langword="null" />.</returns>
|
||||
ArtemisLayout? GetDeviceLayout(ArtemisDevice device);
|
||||
|
||||
/// <summary>
|
||||
/// Applies the layout to the provided device.
|
||||
/// </summary>
|
||||
/// <param name="device">The device to apply to.</param>
|
||||
/// <param name="layout">The layout to apply.</param>
|
||||
void ApplyLayout(ArtemisDevice device, ArtemisLayout layout);
|
||||
|
||||
/// <summary>
|
||||
/// Determines whether the provided device is configured to use this layout provider.
|
||||
/// </summary>
|
||||
/// <param name="device">The device to check.</param>
|
||||
/// <returns>A value indicating whether the provided device is configured to use this layout provider.</returns>
|
||||
bool IsMatch(ArtemisDevice device);
|
||||
}
|
||||
@@ -1,8 +1,14 @@
|
||||
namespace Artemis.Core.Providers;
|
||||
|
||||
/// <summary>
|
||||
/// Represents a layout provider that does not load a layout.
|
||||
/// </summary>
|
||||
public class NoneLayoutProvider : ILayoutProvider
|
||||
{
|
||||
public static string LayoutType = "None";
|
||||
/// <summary>
|
||||
/// The layout type of this layout provider.
|
||||
/// </summary>
|
||||
public const string LAYOUT_TYPE = "None";
|
||||
|
||||
/// <inheritdoc />
|
||||
public ArtemisLayout? GetDeviceLayout(ArtemisDevice device)
|
||||
@@ -19,7 +25,7 @@ public class NoneLayoutProvider : ILayoutProvider
|
||||
/// <inheritdoc />
|
||||
public bool IsMatch(ArtemisDevice device)
|
||||
{
|
||||
return device.LayoutSelection.Type == LayoutType;
|
||||
return device.LayoutSelection.Type == LAYOUT_TYPE;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -28,7 +34,7 @@ public class NoneLayoutProvider : ILayoutProvider
|
||||
/// <param name="device">The device to apply the provider to.</param>
|
||||
public void ConfigureDevice(ArtemisDevice device)
|
||||
{
|
||||
device.LayoutSelection.Type = LayoutType;
|
||||
device.LayoutSelection.Type = LAYOUT_TYPE;
|
||||
device.LayoutSelection.Parameter = null;
|
||||
}
|
||||
}
|
||||
@@ -7,6 +7,9 @@ using System.Threading;
|
||||
|
||||
namespace Artemis.Core.Services;
|
||||
|
||||
/// <summary>
|
||||
/// Represents a monitor that efficiently keeps track of running processes.
|
||||
/// </summary>
|
||||
public static partial class ProcessMonitor
|
||||
{
|
||||
#region Properties & Fields
|
||||
@@ -15,8 +18,11 @@ public static partial class ProcessMonitor
|
||||
|
||||
private static Timer? _timer;
|
||||
|
||||
private static Dictionary<int, ProcessInfo> _processes = new();
|
||||
private static readonly Dictionary<int, ProcessInfo> _processes = new();
|
||||
|
||||
/// <summary>
|
||||
/// Gets an immutable array of the current processes.
|
||||
/// </summary>
|
||||
public static ImmutableArray<ProcessInfo> Processes
|
||||
{
|
||||
get
|
||||
@@ -25,9 +31,17 @@ public static partial class ProcessMonitor
|
||||
return _processes.Values.ToImmutableArray();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the date time at which the last update took place.
|
||||
/// </summary>
|
||||
public static DateTime LastUpdate { get; private set; }
|
||||
|
||||
private static TimeSpan _updateInterval = TimeSpan.FromSeconds(1);
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the interval at which to update the list of processes.
|
||||
/// </summary>
|
||||
public static TimeSpan UpdateInterval
|
||||
{
|
||||
get => _updateInterval;
|
||||
@@ -40,6 +54,9 @@ public static partial class ProcessMonitor
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether the monitoring has started.
|
||||
/// </summary>
|
||||
public static bool IsStarted
|
||||
{
|
||||
get
|
||||
@@ -53,7 +70,14 @@ public static partial class ProcessMonitor
|
||||
|
||||
#region Events
|
||||
|
||||
/// <summary>
|
||||
/// Occurs when a new process is started.
|
||||
/// </summary>
|
||||
public static event EventHandler<ProcessEventArgs>? ProcessStarted;
|
||||
|
||||
/// <summary>
|
||||
/// Occurs when a process is stopped.
|
||||
/// </summary>
|
||||
public static event EventHandler<ProcessEventArgs>? ProcessStopped;
|
||||
|
||||
#endregion
|
||||
@@ -69,6 +93,9 @@ public static partial class ProcessMonitor
|
||||
|
||||
#region Methods
|
||||
|
||||
/// <summary>
|
||||
/// Starts monitoring processes.
|
||||
/// </summary>
|
||||
public static void Start()
|
||||
{
|
||||
lock (LOCK)
|
||||
@@ -87,6 +114,9 @@ public static partial class ProcessMonitor
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Stops monitoring processes.
|
||||
/// </summary>
|
||||
public static void Stop()
|
||||
{
|
||||
lock (LOCK)
|
||||
@@ -100,7 +130,7 @@ public static partial class ProcessMonitor
|
||||
FreeBuffer();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Returns whether the specified process is running
|
||||
/// </summary>
|
||||
@@ -111,7 +141,7 @@ public static partial class ProcessMonitor
|
||||
{
|
||||
if (!IsStarted || (processName == null && processLocation == null))
|
||||
return false;
|
||||
|
||||
|
||||
lock (LOCK)
|
||||
{
|
||||
return _processes.Values.Any(x => IsProcessRunning(x, processName, processLocation));
|
||||
@@ -130,19 +160,19 @@ public static partial class ProcessMonitor
|
||||
OnProcessStopped(info);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static bool IsProcessRunning(ProcessInfo info, string? processName, string? processLocation)
|
||||
{
|
||||
if (processName != null && processLocation != null)
|
||||
return string.Equals(info.ProcessName, processName, StringComparison.InvariantCultureIgnoreCase) &&
|
||||
string.Equals(Path.GetDirectoryName(info.Executable), processLocation, StringComparison.InvariantCultureIgnoreCase);
|
||||
|
||||
|
||||
if (processName != null)
|
||||
return string.Equals(info.ProcessName, processName, StringComparison.InvariantCultureIgnoreCase);
|
||||
|
||||
|
||||
if (processLocation != null)
|
||||
return string.Equals(Path.GetDirectoryName(info.Executable), processLocation, StringComparison.InvariantCultureIgnoreCase);
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -152,7 +182,10 @@ public static partial class ProcessMonitor
|
||||
{
|
||||
ProcessStarted?.Invoke(null, new ProcessEventArgs(processInfo));
|
||||
}
|
||||
catch { /* Subscribers are idiots! */ }
|
||||
catch
|
||||
{
|
||||
/* Subscribers are idiots! */
|
||||
}
|
||||
}
|
||||
|
||||
private static void OnProcessStopped(ProcessInfo processInfo)
|
||||
@@ -161,7 +194,10 @@ public static partial class ProcessMonitor
|
||||
{
|
||||
ProcessStopped?.Invoke(null, new ProcessEventArgs(processInfo));
|
||||
}
|
||||
catch { /* Subscribers are idiots! */ }
|
||||
catch
|
||||
{
|
||||
/* Subscribers are idiots! */
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -42,6 +42,7 @@ internal class LayerBrushService : ILayerBrushService
|
||||
BrushType = "SolidBrush"
|
||||
});
|
||||
|
||||
defaultReference.Value ??= new LayerBrushReference();
|
||||
defaultReference.Value.LayerBrushProviderId ??= "Artemis.Plugins.LayerBrushes.Color.ColorBrushProvider-92a9d6ba";
|
||||
defaultReference.Value.BrushType ??= "SolidBrush";
|
||||
return LayerBrushStore.Get(defaultReference.Value.LayerBrushProviderId, defaultReference.Value.BrushType)?.LayerBrushDescriptor;
|
||||
|
||||
@@ -225,7 +225,7 @@ internal class ProfileService : IProfileService
|
||||
return profileConfiguration.Profile;
|
||||
}
|
||||
|
||||
ProfileEntity profileEntity;
|
||||
ProfileEntity? profileEntity;
|
||||
try
|
||||
{
|
||||
profileEntity = _profileRepository.Get(profileConfiguration.Entity.ProfileId);
|
||||
@@ -284,7 +284,7 @@ internal class ProfileService : IProfileService
|
||||
{
|
||||
DeactivateProfile(profileConfiguration);
|
||||
|
||||
ProfileEntity profileEntity = _profileRepository.Get(profileConfiguration.Entity.ProfileId);
|
||||
ProfileEntity? profileEntity = _profileRepository.Get(profileConfiguration.Entity.ProfileId);
|
||||
if (profileEntity == null)
|
||||
return;
|
||||
|
||||
@@ -357,7 +357,7 @@ internal class ProfileService : IProfileService
|
||||
|
||||
DeactivateProfile(profileConfiguration);
|
||||
SaveProfileCategory(profileConfiguration.Category);
|
||||
ProfileEntity profileEntity = _profileRepository.Get(profileConfiguration.Entity.ProfileId);
|
||||
ProfileEntity? profileEntity = _profileRepository.Get(profileConfiguration.Entity.ProfileId);
|
||||
if (profileEntity != null)
|
||||
_profileRepository.Remove(profileEntity);
|
||||
|
||||
|
||||
@@ -100,7 +100,7 @@ public interface IWebServerService : IArtemisService
|
||||
/// <summary>
|
||||
/// Removes an existing Web API controller and restarts the web server
|
||||
/// </summary>
|
||||
/// <typeparam name="T">The type of Web API controller to remove</typeparam>
|
||||
/// <param name="registration">The registration of the controller to remove.</param>
|
||||
void RemoveController(WebApiControllerRegistration registration);
|
||||
|
||||
/// <summary>
|
||||
|
||||
Reference in new issue
Block a user