mirror of
https://github.com/Artemis-RGB/Artemis
synced 2025-12-13 05:48:35 +00:00
81 lines
2.6 KiB
C#
81 lines
2.6 KiB
C#
using System;
|
|
using System.Linq;
|
|
using Artemis.Core;
|
|
|
|
namespace Artemis.UI.Shared.Services.ProfileEditor.Commands;
|
|
|
|
/// <summary>
|
|
/// Represents a profile editor command that can be used to update a layer property of type <typeparamref name="T" />.
|
|
/// </summary>
|
|
public class UpdateLayerProperty<T> : IProfileEditorCommand
|
|
{
|
|
private readonly LayerProperty<T> _layerProperty;
|
|
private readonly T _newValue;
|
|
private readonly T _originalValue;
|
|
private readonly TimeSpan? _time;
|
|
private readonly bool _hasKeyframe;
|
|
private LayerPropertyKeyframe<T>? _newKeyframe;
|
|
|
|
/// <summary>
|
|
/// Creates a new instance of the <see cref="UpdateLayerProperty{T}" /> class.
|
|
/// </summary>
|
|
public UpdateLayerProperty(LayerProperty<T> layerProperty, T newValue, TimeSpan? time)
|
|
{
|
|
_layerProperty = layerProperty;
|
|
_originalValue = layerProperty.CurrentValue;
|
|
_newValue = newValue;
|
|
_time = time;
|
|
_hasKeyframe = _layerProperty.Keyframes.Any(k => k.Position == time);
|
|
|
|
DisplayName = $"Update {_layerProperty.PropertyDescription.Name ?? "property"}";
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a new instance of the <see cref="UpdateLayerProperty{T}" /> class.
|
|
/// </summary>
|
|
public UpdateLayerProperty(LayerProperty<T> layerProperty, T newValue, T originalValue, TimeSpan? time)
|
|
{
|
|
_layerProperty = layerProperty;
|
|
_originalValue = originalValue;
|
|
_newValue = newValue;
|
|
_time = time;
|
|
|
|
DisplayName = $"Update {_layerProperty.PropertyDescription.Name ?? "property"}";
|
|
}
|
|
|
|
#region Implementation of IProfileEditorCommand
|
|
|
|
/// <inheritdoc />
|
|
public string DisplayName { get; private set; }
|
|
|
|
/// <inheritdoc />
|
|
public void Execute()
|
|
{
|
|
// If there was already a keyframe from a previous execute that was undone, put it back
|
|
if (_newKeyframe != null)
|
|
{
|
|
_layerProperty.AddKeyframe(_newKeyframe);
|
|
return;
|
|
}
|
|
|
|
// If the layer had no keyframe yet but keyframes are enabled, a new keyframe will be returned
|
|
if (!_hasKeyframe && _layerProperty.KeyframesEnabled)
|
|
{
|
|
_newKeyframe = _layerProperty.SetCurrentValue(_newValue, _time);
|
|
DisplayName = $"Add {_layerProperty.PropertyDescription.Name ?? "property"} keyframe";
|
|
}
|
|
else
|
|
_layerProperty.SetCurrentValue(_newValue, _time);
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public void Undo()
|
|
{
|
|
if (_newKeyframe != null)
|
|
_layerProperty.RemoveKeyframe(_newKeyframe);
|
|
else
|
|
_layerProperty.SetCurrentValue(_originalValue, _time);
|
|
}
|
|
|
|
#endregion
|
|
} |