OverviewFilesCommitsIssuesDocsReleasesPeers

ifsrenderer-linux / WpfDisplay / ViewModels / KeyframeViewModel.cs

78 lines · csharp ref:
#nullable enable
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;

using IFSEngine.Animation;

namespace WpfDisplay.ViewModels;

public partial class KeyframeViewModel : ObservableObject
{
    private readonly AnimationViewModel _avm;
    public readonly ChannelViewModel _cvm;
    public readonly Keyframe _k;

    public double EasingPower
    {
        get => _k.EasingPower;
        set => _k.EasingPower = value;
    }

    public double KeyframeTime => _k.t;
    public float TimelinePositon => (float)(_k.t * _avm.ViewScale + _avm.KeyframeRepositionOffset);
    [ObservableProperty]
    public partial bool IsSelected { get; set; }

    public EasingDirection SelectedEasingDirection
    {
        get => _k.EasingDirection;
        set
        {
            _k.EasingDirection = value;
            OnPropertyChanged(nameof(SelectedEasingDirection));
            _avm.Workspace.Renderer.InvalidateParamsBuffer();
        }
    }

    public InterpolationMode SelectedInterpolationMode
    {
        get => _k.InterpolationMode;
        set
        {
            _k.InterpolationMode = value;
            OnPropertyChanged(nameof(SelectedInterpolationMode));
            _avm.Workspace.Renderer.InvalidateParamsBuffer();
        }
    }

    public KeyframeViewModel(AnimationViewModel avm, ChannelViewModel cvm, Keyframe k, bool isSelected)
    {
        _avm = avm;
        _cvm = cvm;
        _k = k;
        IsSelected = isSelected;
        avm.PropertyChanged += (s, e) =>
        {
            if (e.PropertyName is nameof(avm.ViewScale))
                NotifyPositionChanged();
        };
    }


    private ValueSliderSettings? _easingPowerSlider;
    public ValueSliderSettings EasingPowerSlider => _easingPowerSlider ??= new()
    {
        ToolTip = $"Easing power. Default value is 1.0",
        DefaultValue = 1.0,
        Increment = 0.1,
        ValueWillChange = _avm.Workspace.TakeSnapshot,
        ValueChanged = (v) => _avm.Workspace.Renderer.InvalidateParamsBuffer()
    };

    [RelayCommand]
    private void RemoveKeyframe() => _avm.RemoveKeyframeCommand.Execute(this);

    public void NotifyPositionChanged() => OnPropertyChanged(nameof(TimelinePositon));

}