mirror of
https://github.com/Artemis-RGB/Artemis
synced 2025-12-13 05:48:35 +00:00
Core - Added fading in and out of profiles
This commit is contained in:
parent
f30cc31ead
commit
194780b25c
@ -8,6 +8,15 @@ using SkiaSharp;
|
||||
|
||||
namespace Artemis.Core;
|
||||
|
||||
|
||||
internal enum FadingStatus
|
||||
{
|
||||
Enabled,
|
||||
FadingIn,
|
||||
FadingOut,
|
||||
Disabled
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Represents a profile containing folders and layers
|
||||
/// </summary>
|
||||
@ -18,12 +27,15 @@ public sealed class Profile : ProfileElement
|
||||
private readonly ObservableCollection<ProfileScript> _scripts;
|
||||
private bool _isFreshImport;
|
||||
private ProfileElement? _lastSelectedProfileElement;
|
||||
private double _opacity;
|
||||
|
||||
internal Profile(ProfileConfiguration configuration, ProfileEntity profileEntity) : base(null!)
|
||||
{
|
||||
_scripts = new ObservableCollection<ProfileScript>();
|
||||
_scriptConfigurations = new ObservableCollection<ScriptConfiguration>();
|
||||
|
||||
_opacity = 0d;
|
||||
|
||||
FadingStatus = FadingStatus.FadingIn;
|
||||
Configuration = configuration;
|
||||
Profile = this;
|
||||
ProfileEntity = profileEntity;
|
||||
@ -81,6 +93,8 @@ public sealed class Profile : ProfileElement
|
||||
|
||||
internal List<Exception> Exceptions { get; }
|
||||
|
||||
internal FadingStatus FadingStatus { get; private set; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void Update(double deltaTime)
|
||||
{
|
||||
@ -97,6 +111,16 @@ public sealed class Profile : ProfileElement
|
||||
|
||||
foreach (ProfileScript profileScript in Scripts)
|
||||
profileScript.OnProfileUpdated(deltaTime);
|
||||
|
||||
const double OPACITY_PER_SECOND = 1;
|
||||
if (FadingStatus == FadingStatus.FadingIn)
|
||||
_opacity = Math.Clamp(_opacity + OPACITY_PER_SECOND * deltaTime, 0d, 1d);
|
||||
if (FadingStatus == FadingStatus.FadingOut)
|
||||
_opacity = Math.Clamp(_opacity - OPACITY_PER_SECOND * deltaTime, 0d, 1d);
|
||||
if (_opacity == 0d)
|
||||
FadingStatus = FadingStatus.Disabled;
|
||||
if (_opacity == 1d)
|
||||
FadingStatus = FadingStatus.Enabled;
|
||||
}
|
||||
}
|
||||
|
||||
@ -111,9 +135,17 @@ public sealed class Profile : ProfileElement
|
||||
foreach (ProfileScript profileScript in Scripts)
|
||||
profileScript.OnProfileRendering(canvas, canvas.LocalClipBounds);
|
||||
|
||||
using var opacityPaint = new SKPaint();
|
||||
if (Configuration.FadeInAndOut && FadingStatus != FadingStatus.Enabled)
|
||||
opacityPaint.Color = new SKColor(0, 0, 0, (byte)(255d * Easings.CubicEaseInOut(_opacity)));
|
||||
|
||||
canvas.SaveLayer(opacityPaint);
|
||||
|
||||
foreach (ProfileElement profileElement in Children)
|
||||
profileElement.Render(canvas, basePosition, editorFocus);
|
||||
|
||||
canvas.Restore();
|
||||
|
||||
foreach (ProfileScript profileScript in Scripts)
|
||||
profileScript.OnProfileRendered(canvas, canvas.LocalClipBounds);
|
||||
|
||||
@ -165,6 +197,17 @@ public sealed class Profile : ProfileElement
|
||||
layer.PopulateLeds(devices);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Starts the fade out process.
|
||||
/// </summary>
|
||||
public void FadeOut()
|
||||
{
|
||||
if (Disposed)
|
||||
throw new ObjectDisposedException("Profile");
|
||||
|
||||
FadingStatus = FadingStatus.FadingOut;
|
||||
}
|
||||
|
||||
#region Overrides of BreakableModel
|
||||
|
||||
/// <inheritdoc />
|
||||
|
||||
@ -21,6 +21,7 @@ public class ProfileConfiguration : BreakableModel, IStorageModel, IDisposable
|
||||
private bool _isBeingEdited;
|
||||
private bool _isMissingModule;
|
||||
private bool _isSuspended;
|
||||
private bool _fadeInAndOut;
|
||||
private Module? _module;
|
||||
|
||||
private string _name;
|
||||
@ -160,6 +161,15 @@ public class ProfileConfiguration : BreakableModel, IStorageModel, IDisposable
|
||||
internal set => SetAndNotify(ref _profile, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a boolean indicating whether this profile should fade in and out when enabling or disabling
|
||||
/// </summary>
|
||||
public bool FadeInAndOut
|
||||
{
|
||||
get => _fadeInAndOut;
|
||||
set => SetAndNotify(ref _fadeInAndOut, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the module this profile uses
|
||||
/// </summary>
|
||||
@ -272,6 +282,7 @@ public class ProfileConfiguration : BreakableModel, IStorageModel, IDisposable
|
||||
IsSuspended = Entity.IsSuspended;
|
||||
ActivationBehaviour = (ActivationBehaviour) Entity.ActivationBehaviour;
|
||||
HotkeyMode = (ProfileConfigurationHotkeyMode) Entity.HotkeyMode;
|
||||
FadeInAndOut = Entity.FadeInAndOut;
|
||||
Order = Entity.Order;
|
||||
|
||||
Icon.Load();
|
||||
@ -294,6 +305,7 @@ public class ProfileConfiguration : BreakableModel, IStorageModel, IDisposable
|
||||
Entity.ActivationBehaviour = (int) ActivationBehaviour;
|
||||
Entity.HotkeyMode = (int) HotkeyMode;
|
||||
Entity.ProfileCategoryId = Category.Entity.Id;
|
||||
Entity.FadeInAndOut = FadeInAndOut;
|
||||
Entity.Order = Order;
|
||||
|
||||
Icon.Save();
|
||||
|
||||
@ -214,7 +214,12 @@ internal class ProfileService : IProfileService
|
||||
if (shouldBeActive && profileConfiguration.Profile == null && profileConfiguration.BrokenState != "Failed to activate profile")
|
||||
profileConfiguration.TryOrBreak(() => ActivateProfile(profileConfiguration), "Failed to activate profile");
|
||||
else if (!shouldBeActive && profileConfiguration.Profile != null)
|
||||
DeactivateProfile(profileConfiguration);
|
||||
{
|
||||
if (!profileConfiguration.FadeInAndOut || profileConfiguration.Profile.FadingStatus == FadingStatus.Disabled)
|
||||
DeactivateProfile(profileConfiguration);
|
||||
else if (profileConfiguration.Profile.FadingStatus == FadingStatus.Enabled)
|
||||
RequestDeactivation(profileConfiguration);
|
||||
}
|
||||
|
||||
profileConfiguration.Profile?.Update(deltaTime);
|
||||
}
|
||||
@ -254,7 +259,7 @@ internal class ProfileService : IProfileService
|
||||
{
|
||||
ProfileConfiguration profileConfiguration = profileCategory.ProfileConfigurations[j];
|
||||
// Ensure all criteria are met before rendering
|
||||
if (!profileConfiguration.IsSuspended && !profileConfiguration.IsMissingModule && profileConfiguration.ActivationConditionMet)
|
||||
if (!profileConfiguration.IsSuspended && !profileConfiguration.IsMissingModule && (profileConfiguration.ActivationConditionMet || profileConfiguration.Profile?.FadingStatus == FadingStatus.FadingOut))
|
||||
profileConfiguration.Profile?.Render(canvas, SKPointI.Empty, null);
|
||||
}
|
||||
catch (Exception e)
|
||||
@ -361,6 +366,16 @@ internal class ProfileService : IProfileService
|
||||
OnProfileDeactivated(new ProfileConfigurationEventArgs(profileConfiguration));
|
||||
}
|
||||
|
||||
public void RequestDeactivation(ProfileConfiguration profileConfiguration)
|
||||
{
|
||||
if (profileConfiguration.IsBeingEdited)
|
||||
throw new ArtemisCoreException("Cannot disable a profile that is being edited, that's rude");
|
||||
if (profileConfiguration.Profile == null)
|
||||
return;
|
||||
|
||||
profileConfiguration.Profile.FadeOut();
|
||||
}
|
||||
|
||||
public void DeleteProfile(ProfileConfiguration profileConfiguration)
|
||||
{
|
||||
DeactivateProfile(profileConfiguration);
|
||||
|
||||
@ -25,4 +25,6 @@ public class ProfileConfigurationEntity
|
||||
|
||||
public Guid ProfileCategoryId { get; set; }
|
||||
public Guid ProfileId { get; set; }
|
||||
|
||||
public bool FadeInAndOut { get; set; }
|
||||
}
|
||||
@ -127,6 +127,9 @@
|
||||
</ComboBox.ItemTemplate>
|
||||
</ComboBox>
|
||||
</StackPanel>
|
||||
|
||||
<CheckBox VerticalAlignment="Bottom" IsChecked="{CompiledBinding FadeInAndOut}" ToolTip.Tip="Smoothly animates in and out when the profile activation conditions change.">Fade when enabling and disabling</CheckBox>
|
||||
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
|
||||
@ -30,6 +30,7 @@ public class ProfileConfigurationEditViewModel : DialogViewModelBase<ProfileConf
|
||||
private readonly IWindowService _windowService;
|
||||
private Hotkey? _disableHotkey;
|
||||
private Hotkey? _enableHotkey;
|
||||
private bool _fadeInAndOut;
|
||||
private ProfileConfigurationHotkeyMode _hotkeyMode;
|
||||
private ProfileConfigurationIconType _iconType;
|
||||
private ObservableCollection<ProfileIconViewModel>? _materialIcons;
|
||||
@ -57,6 +58,7 @@ public class ProfileConfigurationEditViewModel : DialogViewModelBase<ProfileConf
|
||||
_profileName = _profileConfiguration.Name;
|
||||
_iconType = _profileConfiguration.Icon.IconType;
|
||||
_hotkeyMode = _profileConfiguration.HotkeyMode;
|
||||
_fadeInAndOut = _profileConfiguration.FadeInAndOut;
|
||||
if (_profileConfiguration.EnableHotkey != null)
|
||||
_enableHotkey = new Hotkey {Key = _profileConfiguration.EnableHotkey.Key, Modifiers = _profileConfiguration.EnableHotkey.Modifiers};
|
||||
if (_profileConfiguration.DisableHotkey != null)
|
||||
@ -117,6 +119,12 @@ public class ProfileConfigurationEditViewModel : DialogViewModelBase<ProfileConf
|
||||
set => RaiseAndSetIfChanged(ref _disableHotkey, value);
|
||||
}
|
||||
|
||||
public bool FadeInAndOut
|
||||
{
|
||||
get => _fadeInAndOut;
|
||||
set => RaiseAndSetIfChanged(ref _fadeInAndOut, value);
|
||||
}
|
||||
|
||||
public ObservableCollection<ProfileModuleViewModel?> Modules { get; }
|
||||
|
||||
public ProfileModuleViewModel? SelectedModule
|
||||
@ -155,6 +163,7 @@ public class ProfileConfigurationEditViewModel : DialogViewModelBase<ProfileConf
|
||||
ProfileConfiguration.HotkeyMode = HotkeyMode;
|
||||
ProfileConfiguration.EnableHotkey = EnableHotkey;
|
||||
ProfileConfiguration.DisableHotkey = DisableHotkey;
|
||||
ProfileConfiguration.FadeInAndOut = FadeInAndOut;
|
||||
|
||||
await SaveIcon();
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user