mirror of
https://github.com/Artemis-RGB/Artemis
synced 2026-11-11 19:36:28 +00:00
Folders - When display mode set to finish, finish all child timelines
Data bindings - Fixed an exception on profile editor undo Timeline - Added segment options dialog where you can enter a time
This commit is contained in:
1 parent
9f951ca33f
commit
bfc93778a6
18 files changed
+369
-102
No files matched your search
@@ -103,6 +103,7 @@ namespace Artemis.Core
|
||||
{
|
||||
_disposed = true;
|
||||
|
||||
Registration.DataBinding = null;
|
||||
DataBindingMode?.Dispose();
|
||||
}
|
||||
|
||||
|
||||
@@ -57,6 +57,20 @@ namespace Artemis.Core
|
||||
}
|
||||
|
||||
internal FolderEntity FolderEntity { get; set; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public override List<ILayerProperty> GetAllLayerProperties()
|
||||
{
|
||||
var result = new List<ILayerProperty>();
|
||||
foreach (var layerEffect in LayerEffects)
|
||||
{
|
||||
if (layerEffect.BaseProperties != null)
|
||||
result.AddRange(layerEffect.BaseProperties.GetAllLayerProperties());
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
internal override RenderElementEntity RenderElementEntity => FolderEntity;
|
||||
public bool IsRootFolder => Parent == Profile;
|
||||
|
||||
@@ -88,6 +102,16 @@ namespace Artemis.Core
|
||||
}
|
||||
}
|
||||
|
||||
protected internal override void UpdateTimelineLength()
|
||||
{
|
||||
TimelineLength = !Children.Any() ? TimeSpan.Zero : Children.OfType<RenderProfileElement>().Max(c => c.TimelineLength);
|
||||
if (StartSegmentLength + MainSegmentLength + EndSegmentLength > TimelineLength)
|
||||
TimelineLength = StartSegmentLength + MainSegmentLength + EndSegmentLength;
|
||||
|
||||
if (Parent is RenderProfileElement parent)
|
||||
parent.UpdateTimelineLength();
|
||||
}
|
||||
|
||||
public override void OverrideProgress(TimeSpan timeOverride, bool stickToMainSegment)
|
||||
{
|
||||
if (_disposed)
|
||||
@@ -201,6 +225,7 @@ namespace Artemis.Core
|
||||
throw new ObjectDisposedException("Folder");
|
||||
|
||||
base.AddChild(child, order);
|
||||
UpdateTimelineLength();
|
||||
CalculateRenderProperties();
|
||||
}
|
||||
|
||||
@@ -211,6 +236,7 @@ namespace Artemis.Core
|
||||
throw new ObjectDisposedException("Folder");
|
||||
|
||||
base.RemoveChild(child);
|
||||
UpdateTimelineLength();
|
||||
CalculateRenderProperties();
|
||||
}
|
||||
|
||||
|
||||
@@ -69,6 +69,24 @@ namespace Artemis.Core
|
||||
}
|
||||
|
||||
internal LayerEntity LayerEntity { get; set; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public override List<ILayerProperty> GetAllLayerProperties()
|
||||
{
|
||||
var result = new List<ILayerProperty>();
|
||||
result.AddRange(General.GetAllLayerProperties());
|
||||
result.AddRange(Transform.GetAllLayerProperties());
|
||||
if (LayerBrush?.BaseProperties != null)
|
||||
result.AddRange(LayerBrush.BaseProperties.GetAllLayerProperties());
|
||||
foreach (var layerEffect in LayerEffects)
|
||||
{
|
||||
if (layerEffect.BaseProperties != null)
|
||||
result.AddRange(layerEffect.BaseProperties.GetAllLayerProperties());
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
internal override RenderElementEntity RenderElementEntity => LayerEntity;
|
||||
|
||||
/// <summary>
|
||||
@@ -269,6 +287,11 @@ namespace Artemis.Core
|
||||
}
|
||||
}
|
||||
|
||||
protected internal override void UpdateTimelineLength()
|
||||
{
|
||||
TimelineLength = StartSegmentLength + MainSegmentLength + EndSegmentLength;
|
||||
}
|
||||
|
||||
public override void OverrideProgress(TimeSpan timeOverride, bool stickToMainSegment)
|
||||
{
|
||||
if (_disposed)
|
||||
|
||||
@@ -18,6 +18,11 @@ namespace Artemis.Core
|
||||
/// </summary>
|
||||
public PropertyDescriptionAttribute PropertyDescription { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the unique path of the property on the layer
|
||||
/// </summary>
|
||||
public string Path { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Initializes the layer property
|
||||
/// <para>
|
||||
@@ -25,7 +30,7 @@ namespace Artemis.Core
|
||||
/// <see cref="LayerProperty{T}" />
|
||||
/// </para>
|
||||
/// </summary>
|
||||
void Initialize(RenderProfileElement profileElement, LayerPropertyGroup group, PropertyEntity entity, bool fromStorage, PropertyDescriptionAttribute description);
|
||||
void Initialize(RenderProfileElement profileElement, LayerPropertyGroup @group, PropertyEntity entity, bool fromStorage, PropertyDescriptionAttribute description, string path);
|
||||
|
||||
/// <summary>
|
||||
/// Returns a list off all data binding registrations
|
||||
|
||||
@@ -30,6 +30,9 @@ namespace Artemis.Core
|
||||
/// <inheritdoc />
|
||||
public PropertyDescriptionAttribute PropertyDescription { get; internal set; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Path { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Updates the property, applying keyframes and data bindings to the current value
|
||||
/// </summary>
|
||||
@@ -384,6 +387,8 @@ namespace Artemis.Core
|
||||
|
||||
if (dataBindingRegistration.LayerProperty != this)
|
||||
throw new ArtemisCoreException("Cannot enable a data binding using a data binding registration of a different layer property");
|
||||
if (dataBindingRegistration.DataBinding != null)
|
||||
throw new ArtemisCoreException("Provided data binding registration already has an enabled data binding");
|
||||
|
||||
var dataBinding = new DataBinding<T, TProperty>(dataBindingRegistration);
|
||||
_dataBindings.Add(dataBinding);
|
||||
@@ -431,7 +436,7 @@ namespace Artemis.Core
|
||||
internal PropertyEntity Entity { get; set; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public void Initialize(RenderProfileElement profileElement, LayerPropertyGroup group, PropertyEntity entity, bool fromStorage, PropertyDescriptionAttribute description)
|
||||
public void Initialize(RenderProfileElement profileElement, LayerPropertyGroup group, PropertyEntity entity, bool fromStorage, PropertyDescriptionAttribute description, string path)
|
||||
{
|
||||
if (_disposed)
|
||||
throw new ObjectDisposedException("LayerProperty");
|
||||
@@ -440,6 +445,7 @@ namespace Artemis.Core
|
||||
|
||||
ProfileElement = profileElement ?? throw new ArgumentNullException(nameof(profileElement));
|
||||
LayerPropertyGroup = group ?? throw new ArgumentNullException(nameof(group));
|
||||
Path = path;
|
||||
Entity = entity ?? throw new ArgumentNullException(nameof(entity));
|
||||
PropertyDescription = description ?? throw new ArgumentNullException(nameof(description));
|
||||
IsLoadedFromStorage = fromStorage;
|
||||
|
||||
@@ -207,21 +207,21 @@ namespace Artemis.Core
|
||||
|
||||
private void InitializeProperty(PropertyInfo propertyInfo, PropertyDescriptionAttribute propertyDescription)
|
||||
{
|
||||
var path = Path + ".";
|
||||
var path = $"{Path}.{propertyInfo.Name}";
|
||||
|
||||
if (!typeof(ILayerProperty).IsAssignableFrom(propertyInfo.PropertyType))
|
||||
throw new ArtemisPluginException($"Layer property with PropertyDescription attribute must be of type LayerProperty at {path + propertyInfo.Name}");
|
||||
throw new ArtemisPluginException($"Layer property with PropertyDescription attribute must be of type LayerProperty at {path}");
|
||||
|
||||
var instance = (ILayerProperty) Activator.CreateInstance(propertyInfo.PropertyType, true);
|
||||
if (instance == null)
|
||||
throw new ArtemisPluginException($"Failed to create instance of layer property at {path + propertyInfo.Name}");
|
||||
throw new ArtemisPluginException($"Failed to create instance of layer property at {path}");
|
||||
|
||||
// Ensure the description has a name, if not this is a good point to set it based on the property info
|
||||
if (string.IsNullOrWhiteSpace(propertyDescription.Name))
|
||||
propertyDescription.Name = propertyInfo.Name.Humanize();
|
||||
|
||||
var entity = GetPropertyEntity(ProfileElement, path + propertyInfo.Name, out var fromStorage);
|
||||
instance.Initialize(ProfileElement, this, entity, fromStorage, propertyDescription);
|
||||
var entity = GetPropertyEntity(ProfileElement, path, out var fromStorage);
|
||||
instance.Initialize(ProfileElement, this, entity, fromStorage, propertyDescription, path);
|
||||
propertyInfo.SetValue(this, instance);
|
||||
_layerProperties.Add(instance);
|
||||
}
|
||||
|
||||
@@ -19,6 +19,23 @@ namespace Artemis.Core
|
||||
LayerEffectStore.LayerEffectRemoved += LayerEffectStoreOnLayerEffectRemoved;
|
||||
}
|
||||
|
||||
public abstract List<ILayerProperty> GetAllLayerProperties();
|
||||
|
||||
#region IDisposable
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
LayerEffectStore.LayerEffectAdded -= LayerEffectStoreOnLayerEffectAdded;
|
||||
LayerEffectStore.LayerEffectRemoved -= LayerEffectStoreOnLayerEffectRemoved;
|
||||
|
||||
foreach (var baseLayerEffect in LayerEffects)
|
||||
baseLayerEffect.Dispose();
|
||||
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
internal void ApplyRenderElementDefaults()
|
||||
{
|
||||
MainSegmentLength = TimeSpan.FromSeconds(5);
|
||||
@@ -135,7 +152,13 @@ namespace Artemis.Core
|
||||
public TimeSpan StartSegmentLength
|
||||
{
|
||||
get => _startSegmentLength;
|
||||
set => SetAndNotify(ref _startSegmentLength, value);
|
||||
set
|
||||
{
|
||||
if (!SetAndNotify(ref _startSegmentLength, value)) return;
|
||||
UpdateTimelineLength();
|
||||
if (Parent is RenderProfileElement renderElement)
|
||||
renderElement.UpdateTimelineLength();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -144,7 +167,13 @@ namespace Artemis.Core
|
||||
public TimeSpan MainSegmentLength
|
||||
{
|
||||
get => _mainSegmentLength;
|
||||
set => SetAndNotify(ref _mainSegmentLength, value);
|
||||
set
|
||||
{
|
||||
if (!SetAndNotify(ref _mainSegmentLength, value)) return;
|
||||
UpdateTimelineLength();
|
||||
if (Parent is RenderProfileElement renderElement)
|
||||
renderElement.UpdateTimelineLength();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -153,7 +182,13 @@ namespace Artemis.Core
|
||||
public TimeSpan EndSegmentLength
|
||||
{
|
||||
get => _endSegmentLength;
|
||||
set => SetAndNotify(ref _endSegmentLength, value);
|
||||
set
|
||||
{
|
||||
if (!SetAndNotify(ref _endSegmentLength, value)) return;
|
||||
UpdateTimelineLength();
|
||||
if (Parent is RenderProfileElement renderElement)
|
||||
renderElement.UpdateTimelineLength();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -165,11 +200,6 @@ namespace Artemis.Core
|
||||
protected set => SetAndNotify(ref _timelinePosition, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the total combined length of all three segments
|
||||
/// </summary>
|
||||
public TimeSpan TimelineLength => StartSegmentLength + MainSegmentLength + EndSegmentLength;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets whether main timeline should repeat itself as long as display conditions are met
|
||||
/// </summary>
|
||||
@@ -188,6 +218,11 @@ namespace Artemis.Core
|
||||
set => SetAndNotify(ref _alwaysFinishTimeline, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the max length of this element and any of its children
|
||||
/// </summary>
|
||||
public TimeSpan TimelineLength { get; protected set; }
|
||||
|
||||
protected double UpdateTimeline(double deltaTime)
|
||||
{
|
||||
var oldPosition = _timelinePosition;
|
||||
@@ -195,7 +230,6 @@ namespace Artemis.Core
|
||||
var mainSegmentEnd = StartSegmentLength + MainSegmentLength;
|
||||
|
||||
TimelinePosition += deltaTimeSpan;
|
||||
|
||||
// Manage segments while the condition is met
|
||||
if (DisplayConditionMet)
|
||||
{
|
||||
@@ -213,6 +247,8 @@ namespace Artemis.Core
|
||||
return (TimelinePosition - oldPosition).TotalSeconds;
|
||||
}
|
||||
|
||||
protected internal abstract void UpdateTimelineLength();
|
||||
|
||||
/// <summary>
|
||||
/// Overrides the progress of the element
|
||||
/// </summary>
|
||||
@@ -380,21 +416,6 @@ namespace Artemis.Core
|
||||
|
||||
#endregion
|
||||
|
||||
#region IDisposable
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
LayerEffectStore.LayerEffectAdded -= LayerEffectStoreOnLayerEffectAdded;
|
||||
LayerEffectStore.LayerEffectRemoved -= LayerEffectStoreOnLayerEffectRemoved;
|
||||
|
||||
foreach (var baseLayerEffect in LayerEffects)
|
||||
baseLayerEffect.Dispose();
|
||||
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Events
|
||||
|
||||
public event EventHandler LayerEffectsUpdated;
|
||||
|
||||
Reference in new issue
Block a user