mirror of
https://github.com/Artemis-RGB/Artemis
synced 2026-11-12 11:56:30 +00:00
Profiles - Abstracted property elements and effect elements
Folders - Added properties to folders Layer effects - Expanded to folders Layer effects - Added shape clipping
This commit is contained in:
1 parent
1a637f7f95
commit
9f778d840f
42 files changed
+638
-347
No files matched your search
@@ -48,8 +48,7 @@ namespace Artemis.Core.Services
|
||||
_modules = _pluginService.GetPluginsOfType<Module>();
|
||||
_pluginService.PluginEnabled += (sender, args) => _modules = _pluginService.GetPluginsOfType<Module>();
|
||||
_pluginService.PluginDisabled += (sender, args) => _modules = _pluginService.GetPluginsOfType<Module>();
|
||||
|
||||
|
||||
|
||||
ConfigureJsonConvert();
|
||||
}
|
||||
|
||||
@@ -113,6 +112,9 @@ namespace Artemis.Core.Services
|
||||
|
||||
private void SurfaceOnUpdating(UpdatingEventArgs args)
|
||||
{
|
||||
if (_rgbService.IsRenderPaused)
|
||||
return;
|
||||
|
||||
try
|
||||
{
|
||||
if (!ModuleUpdatingDisabled && _modules != null)
|
||||
@@ -159,6 +161,9 @@ namespace Artemis.Core.Services
|
||||
|
||||
private void SurfaceOnUpdated(UpdatedEventArgs args)
|
||||
{
|
||||
if (_rgbService.IsRenderPaused)
|
||||
return;
|
||||
|
||||
OnFrameRendered(new FrameRenderedEventArgs(_rgbService.BitmapBrush, _rgbService.Surface));
|
||||
}
|
||||
|
||||
|
||||
@@ -36,17 +36,17 @@ namespace Artemis.Core.Services.Interfaces
|
||||
/// Instantiates and adds the <see cref="BaseLayerEffect" /> described by the provided
|
||||
/// <see cref="LayerEffectDescriptor" /> to the <see cref="Layer" />.
|
||||
/// </summary>
|
||||
/// <param name="layer">The layer to instantiate the effect for</param>
|
||||
void InstantiateLayerEffects(Layer layer);
|
||||
/// <param name="effectProfileElement">The layer/folder to instantiate the effect for</param>
|
||||
void InstantiateLayerEffects(EffectProfileElement effectProfileElement);
|
||||
|
||||
/// <summary>
|
||||
/// Adds the <see cref="BaseLayerEffect" /> described by the provided <see cref="LayerEffectDescriptor" /> to the
|
||||
/// <see cref="Layer" />.
|
||||
/// </summary>
|
||||
/// <param name="layer">The layer to instantiate the effect for</param>
|
||||
/// <param name="effectProfileElement">The layer/folder to instantiate the effect for</param>
|
||||
/// <param name="layerEffectDescriptor"></param>
|
||||
/// <returns></returns>
|
||||
BaseLayerEffect AddLayerEffect(Layer layer, LayerEffectDescriptor layerEffectDescriptor);
|
||||
BaseLayerEffect AddLayerEffect(EffectProfileElement effectProfileElement, LayerEffectDescriptor layerEffectDescriptor);
|
||||
|
||||
void RemoveLayerEffect(BaseLayerEffect layerEffect);
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@ namespace Artemis.Core.Services.Interfaces
|
||||
IReadOnlyCollection<IRGBDevice> LoadedDevices { get; }
|
||||
|
||||
TimerUpdateTrigger UpdateTrigger { get; }
|
||||
bool IsRenderPaused { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Adds the given device provider to the <see cref="Surface" />
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Artemis.Core.Exceptions;
|
||||
using Artemis.Core.Models.Profile;
|
||||
@@ -7,6 +8,7 @@ using Artemis.Core.Plugins.LayerBrush.Abstract;
|
||||
using Artemis.Core.Plugins.LayerEffect;
|
||||
using Artemis.Core.Plugins.LayerEffect.Abstract;
|
||||
using Artemis.Core.Services.Interfaces;
|
||||
using Artemis.Storage.Entities.Profile;
|
||||
using Ninject;
|
||||
using Serilog;
|
||||
|
||||
@@ -77,61 +79,68 @@ namespace Artemis.Core.Services
|
||||
return brush;
|
||||
}
|
||||
|
||||
public void InstantiateLayerEffects(Layer layer)
|
||||
{
|
||||
if (layer.LayerEffects.Any())
|
||||
throw new ArtemisCoreException("Layer already has instantiated layer effects");
|
||||
|
||||
foreach (var layerEntityLayerEffect in layer.LayerEntity.LayerEffects.OrderByDescending(e => e.Order))
|
||||
{
|
||||
// Get a matching descriptor
|
||||
var layerEffectProviders = _pluginService.GetPluginsOfType<LayerEffectProvider>();
|
||||
var descriptors = layerEffectProviders.SelectMany(l => l.LayerEffectDescriptors).ToList();
|
||||
var descriptor = descriptors.FirstOrDefault(d => d.LayerEffectProvider.PluginInfo.Guid == layerEntityLayerEffect.PluginGuid &&
|
||||
d.LayerEffectType.Name == layerEntityLayerEffect.EffectType);
|
||||
|
||||
if (descriptor == null)
|
||||
continue;
|
||||
|
||||
var effect = (BaseLayerEffect) _kernel.Get(descriptor.LayerEffectType);
|
||||
effect.EntityId = layerEntityLayerEffect.Id;
|
||||
effect.Layer = layer;
|
||||
effect.Order = layerEntityLayerEffect.Order;
|
||||
effect.Name = layerEntityLayerEffect.Name;
|
||||
effect.Descriptor = descriptor;
|
||||
effect.Initialize(this);
|
||||
effect.Update(0);
|
||||
|
||||
layer.AddLayerEffect(effect);
|
||||
_logger.Debug("Added layer effect with root path {rootPath}", effect.PropertyRootPath);
|
||||
}
|
||||
|
||||
layer.OnLayerEffectsUpdated();
|
||||
}
|
||||
|
||||
public BaseLayerEffect AddLayerEffect(Layer layer, LayerEffectDescriptor layerEffectDescriptor)
|
||||
public BaseLayerEffect AddLayerEffect(EffectProfileElement effectElement, LayerEffectDescriptor layerEffectDescriptor)
|
||||
{
|
||||
// Create the effect with dependency injection
|
||||
var effect = (BaseLayerEffect) _kernel.Get(layerEffectDescriptor.LayerEffectType);
|
||||
|
||||
effect.ProfileElement = effectElement;
|
||||
effect.EntityId = Guid.NewGuid();
|
||||
effect.Layer = layer;
|
||||
effect.Order = layer.LayerEffects.Count + 1;
|
||||
effect.Order = effectElement.LayerEffects.Count + 1;
|
||||
effect.Descriptor = layerEffectDescriptor;
|
||||
|
||||
effect.Initialize(this);
|
||||
effect.Update(0);
|
||||
|
||||
layer.AddLayerEffect(effect);
|
||||
effectElement.AddLayerEffect(effect);
|
||||
_logger.Debug("Added layer effect with root path {rootPath}", effect.PropertyRootPath);
|
||||
|
||||
layer.OnLayerEffectsUpdated();
|
||||
return effect;
|
||||
}
|
||||
|
||||
public void RemoveLayerEffect(BaseLayerEffect layerEffect)
|
||||
{
|
||||
// // Make sure the group is collapsed or the effect that gets this effect's order gets expanded
|
||||
// layerEffect.Layer.SetPropertyGroupExpanded(layerEffect.BaseProperties, false);
|
||||
layerEffect.Layer.RemoveLayerEffect(layerEffect);
|
||||
layerEffect.ProfileElement.RemoveLayerEffect(layerEffect);
|
||||
}
|
||||
|
||||
public void InstantiateLayerEffects(EffectProfileElement effectElement)
|
||||
{
|
||||
if (effectElement.LayerEffects.Any())
|
||||
throw new ArtemisCoreException("Effect element (layer/folder) already has instantiated layer effects");
|
||||
|
||||
var layerEffectProviders = _pluginService.GetPluginsOfType<LayerEffectProvider>();
|
||||
var descriptors = layerEffectProviders.SelectMany(l => l.LayerEffectDescriptors).ToList();
|
||||
|
||||
List<LayerEffectEntity> entities;
|
||||
if (effectElement is Layer layer)
|
||||
entities = layer.LayerEntity.LayerEffects.OrderByDescending(e => e.Order).ToList();
|
||||
else if (effectElement is Folder folder)
|
||||
entities = folder.FolderEntity.LayerEffects.OrderByDescending(e => e.Order).ToList();
|
||||
else
|
||||
throw new ArtemisCoreException("Provided effect element is of an unsupported type, must be Layer of Folder");
|
||||
|
||||
foreach (var layerEffectEntity in entities)
|
||||
{
|
||||
// Get a matching descriptor
|
||||
var descriptor = descriptors.FirstOrDefault(d => d.LayerEffectProvider.PluginInfo.Guid == layerEffectEntity.PluginGuid &&
|
||||
d.LayerEffectType.Name == layerEffectEntity.EffectType);
|
||||
if (descriptor == null)
|
||||
continue;
|
||||
|
||||
// Create the effect with dependency injection
|
||||
var effect = (BaseLayerEffect) _kernel.Get(descriptor.LayerEffectType);
|
||||
|
||||
effect.ProfileElement = effectElement;
|
||||
effect.EntityId = layerEffectEntity.Id;
|
||||
effect.Order = layerEffectEntity.Order;
|
||||
effect.Name = layerEffectEntity.Name;
|
||||
effect.Descriptor = descriptor;
|
||||
|
||||
effect.Initialize(this);
|
||||
effect.Update(0);
|
||||
|
||||
effectElement.AddLayerEffect(effect);
|
||||
_logger.Debug("Instantiated layer effect with root path {rootPath}", effect.PropertyRootPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using Artemis.Core.Events;
|
||||
using Artemis.Core.Plugins.Models;
|
||||
using Artemis.Core.RGB.NET;
|
||||
@@ -47,6 +48,7 @@ namespace Artemis.Core.Services
|
||||
public BitmapBrush BitmapBrush { get; private set; }
|
||||
public IReadOnlyCollection<IRGBDevice> LoadedDevices => _loadedDevices.AsReadOnly();
|
||||
public double RenderScale => _renderScaleSetting.Value;
|
||||
public bool IsRenderPaused { get; set; }
|
||||
|
||||
public void AddDeviceProvider(IRGBDeviceProvider deviceProvider)
|
||||
{
|
||||
|
||||
@@ -94,6 +94,7 @@ namespace Artemis.Core.Services.Storage
|
||||
{
|
||||
InitializeLayerProperties(profile);
|
||||
InstantiateLayers(profile);
|
||||
InstantiateFolders(profile);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -173,9 +174,16 @@ namespace Artemis.Core.Services.Storage
|
||||
}
|
||||
}
|
||||
|
||||
private void InstantiateFolders(Profile profile)
|
||||
{
|
||||
foreach (var folder in profile.GetAllFolders())
|
||||
{
|
||||
_layerService.InstantiateLayerEffects(folder);
|
||||
}
|
||||
}
|
||||
|
||||
private void InstantiateLayers(Profile profile)
|
||||
{
|
||||
// Only instantiate brushes for layers without an existing brush/effect instance
|
||||
foreach (var layer in profile.GetAllLayers())
|
||||
{
|
||||
_layerService.InstantiateLayerBrush(layer);
|
||||
@@ -190,11 +198,14 @@ namespace Artemis.Core.Services.Storage
|
||||
profileModule.ActiveProfile.PopulateLeds(surface);
|
||||
}
|
||||
|
||||
private void ActiveProfilesInstantiateProfileLayerBrushes()
|
||||
private void ActiveProfilesInstantiatePlugins()
|
||||
{
|
||||
var profileModules = _pluginService.GetPluginsOfType<ProfileModule>();
|
||||
foreach (var profileModule in profileModules.Where(p => p.ActiveProfile != null).ToList())
|
||||
{
|
||||
InstantiateLayers(profileModule.ActiveProfile);
|
||||
InstantiateFolders(profileModule.ActiveProfile);
|
||||
}
|
||||
}
|
||||
|
||||
#region Event handlers
|
||||
@@ -213,7 +224,7 @@ namespace Artemis.Core.Services.Storage
|
||||
private void OnPluginLoaded(object sender, PluginEventArgs e)
|
||||
{
|
||||
if (e.PluginInfo.Instance is LayerBrushProvider)
|
||||
ActiveProfilesInstantiateProfileLayerBrushes();
|
||||
ActiveProfilesInstantiatePlugins();
|
||||
else if (e.PluginInfo.Instance is ProfileModule profileModule)
|
||||
{
|
||||
var activeProfile = GetActiveProfile(profileModule);
|
||||
|
||||
Reference in new issue
Block a user