mirror of
https://github.com/Artemis-RGB/Artemis
synced 2025-12-13 05:48:35 +00:00
UI - Decreased device visualizer CPU usage
Keyframes - Snap to closest 50 ms while Ctrl is held down
This commit is contained in:
parent
651fc515d2
commit
5e345fed7c
@ -1,5 +1,6 @@
|
|||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
|
using Artemis.Core.Properties;
|
||||||
|
|
||||||
namespace Artemis.Core
|
namespace Artemis.Core
|
||||||
{
|
{
|
||||||
@ -44,6 +45,7 @@ namespace Artemis.Core
|
|||||||
/// .
|
/// .
|
||||||
/// </param>
|
/// </param>
|
||||||
/// <returns><c>true</c> if the value was changed, <c>false</c> if the existing value matched the desired value.</returns>
|
/// <returns><c>true</c> if the value was changed, <c>false</c> if the existing value matched the desired value.</returns>
|
||||||
|
[NotifyPropertyChangedInvocator]
|
||||||
protected virtual bool SetAndNotify<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
|
protected virtual bool SetAndNotify<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
|
||||||
{
|
{
|
||||||
if (!RequiresUpdate(ref storage, value)) return false;
|
if (!RequiresUpdate(ref storage, value)) return false;
|
||||||
|
|||||||
@ -109,6 +109,9 @@ namespace Artemis.Core
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public List<ArtemisDeviceInputIdentifier> InputIdentifiers { get; }
|
public List<ArtemisDeviceInputIdentifier> InputIdentifiers { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets a list of input mappings configured on the device
|
||||||
|
/// </summary>
|
||||||
public Dictionary<ArtemisLed, ArtemisLed> InputMappings { get; }
|
public Dictionary<ArtemisLed, ArtemisLed> InputMappings { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -288,7 +291,10 @@ namespace Artemis.Core
|
|||||||
/// Attempts to retrieve the <see cref="ArtemisLed" /> that corresponds the provided RGB.NET <see cref="Led" />
|
/// Attempts to retrieve the <see cref="ArtemisLed" /> that corresponds the provided RGB.NET <see cref="Led" />
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="led">The RGB.NET <see cref="Led" /> to find the corresponding <see cref="ArtemisLed" /> for </param>
|
/// <param name="led">The RGB.NET <see cref="Led" /> to find the corresponding <see cref="ArtemisLed" /> for </param>
|
||||||
/// <param name="applyInputMapping">If <see langword="true"/>, LEDs mapped to different LEDs <see cref="InputMappings"/> are taken into consideration</param>
|
/// <param name="applyInputMapping">
|
||||||
|
/// If <see langword="true" />, LEDs mapped to different LEDs <see cref="InputMappings" />
|
||||||
|
/// are taken into consideration
|
||||||
|
/// </param>
|
||||||
/// <returns>If found, the corresponding <see cref="ArtemisLed" />; otherwise <see langword="null" />.</returns>
|
/// <returns>If found, the corresponding <see cref="ArtemisLed" />; otherwise <see langword="null" />.</returns>
|
||||||
public ArtemisLed? GetLed(Led led, bool applyInputMapping)
|
public ArtemisLed? GetLed(Led led, bool applyInputMapping)
|
||||||
{
|
{
|
||||||
@ -299,7 +305,10 @@ namespace Artemis.Core
|
|||||||
/// Attempts to retrieve the <see cref="ArtemisLed" /> that corresponds the provided RGB.NET <see cref="LedId" />
|
/// Attempts to retrieve the <see cref="ArtemisLed" /> that corresponds the provided RGB.NET <see cref="LedId" />
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="ledId">The RGB.NET <see cref="LedId" /> to find the corresponding <see cref="ArtemisLed" /> for </param>
|
/// <param name="ledId">The RGB.NET <see cref="LedId" /> to find the corresponding <see cref="ArtemisLed" /> for </param>
|
||||||
/// <param name="applyInputMapping">If <see langword="true"/>, LEDs mapped to different LEDs <see cref="InputMappings"/> are taken into consideration</param>
|
/// <param name="applyInputMapping">
|
||||||
|
/// If <see langword="true" />, LEDs mapped to different LEDs <see cref="InputMappings" />
|
||||||
|
/// are taken into consideration
|
||||||
|
/// </param>
|
||||||
/// <returns>If found, the corresponding <see cref="ArtemisLed" />; otherwise <see langword="null" />.</returns>
|
/// <returns>If found, the corresponding <see cref="ArtemisLed" />; otherwise <see langword="null" />.</returns>
|
||||||
public ArtemisLed? GetLed(LedId ledId, bool applyInputMapping)
|
public ArtemisLed? GetLed(LedId ledId, bool applyInputMapping)
|
||||||
{
|
{
|
||||||
@ -329,12 +338,31 @@ namespace Artemis.Core
|
|||||||
return fileName;
|
return fileName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Occurs when the underlying RGB.NET device was updated
|
||||||
|
/// </summary>
|
||||||
|
public event EventHandler? DeviceUpdated;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Invokes the <see cref="DeviceUpdated" /> event
|
||||||
|
/// </summary>
|
||||||
|
protected virtual void OnDeviceUpdated()
|
||||||
|
{
|
||||||
|
DeviceUpdated?.Invoke(this, EventArgs.Empty);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Applies the provided layout to the device
|
/// Applies the provided layout to the device
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="layout">The layout to apply</param>
|
/// <param name="layout">The layout to apply</param>
|
||||||
/// <param name="createMissingLeds">A boolean indicating whether to add missing LEDs defined in the layout but missing on the device</param>
|
/// <param name="createMissingLeds">
|
||||||
/// <param name="removeExcessiveLeds">A boolean indicating whether to remove excess LEDs present in the device but missing in the layout</param>
|
/// A boolean indicating whether to add missing LEDs defined in the layout but missing on
|
||||||
|
/// the device
|
||||||
|
/// </param>
|
||||||
|
/// <param name="removeExcessiveLeds">
|
||||||
|
/// A boolean indicating whether to remove excess LEDs present in the device but missing
|
||||||
|
/// in the layout
|
||||||
|
/// </param>
|
||||||
internal void ApplyLayout(ArtemisLayout layout, bool createMissingLeds, bool removeExcessiveLeds)
|
internal void ApplyLayout(ArtemisLayout layout, bool createMissingLeds, bool removeExcessiveLeds)
|
||||||
{
|
{
|
||||||
if (createMissingLeds && !DeviceProvider.CreateMissingLedsSupported)
|
if (createMissingLeds && !DeviceProvider.CreateMissingLedsSupported)
|
||||||
@ -355,21 +383,6 @@ namespace Artemis.Core
|
|||||||
OnDeviceUpdated();
|
OnDeviceUpdated();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdateLeds()
|
|
||||||
{
|
|
||||||
Leds = RgbDevice.Select(l => new ArtemisLed(l, this)).ToList().AsReadOnly();
|
|
||||||
LedIds = new ReadOnlyDictionary<LedId, ArtemisLed>(Leds.ToDictionary(l => l.RgbLed.Id, l => l));
|
|
||||||
|
|
||||||
InputMappings.Clear();
|
|
||||||
foreach (InputMappingEntity deviceEntityInputMapping in DeviceEntity.InputMappings)
|
|
||||||
{
|
|
||||||
ArtemisLed? original = Leds.FirstOrDefault(l => l.RgbLed.Id == (LedId) deviceEntityInputMapping.OriginalLedId);
|
|
||||||
ArtemisLed? mapped = Leds.FirstOrDefault(l => l.RgbLed.Id == (LedId) deviceEntityInputMapping.MappedLedId);
|
|
||||||
if (original != null && mapped != null)
|
|
||||||
InputMappings.Add(original, mapped);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void ApplyToEntity()
|
internal void ApplyToEntity()
|
||||||
{
|
{
|
||||||
// Other properties are computed
|
// Other properties are computed
|
||||||
@ -427,6 +440,21 @@ namespace Artemis.Core
|
|||||||
Path = path;
|
Path = path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void UpdateLeds()
|
||||||
|
{
|
||||||
|
Leds = RgbDevice.Select(l => new ArtemisLed(l, this)).ToList().AsReadOnly();
|
||||||
|
LedIds = new ReadOnlyDictionary<LedId, ArtemisLed>(Leds.ToDictionary(l => l.RgbLed.Id, l => l));
|
||||||
|
|
||||||
|
InputMappings.Clear();
|
||||||
|
foreach (InputMappingEntity deviceEntityInputMapping in DeviceEntity.InputMappings)
|
||||||
|
{
|
||||||
|
ArtemisLed? original = Leds.FirstOrDefault(l => l.RgbLed.Id == (LedId) deviceEntityInputMapping.OriginalLedId);
|
||||||
|
ArtemisLed? mapped = Leds.FirstOrDefault(l => l.RgbLed.Id == (LedId) deviceEntityInputMapping.MappedLedId);
|
||||||
|
if (original != null && mapped != null)
|
||||||
|
InputMappings.Add(original, mapped);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void ApplyKeyboardLayout()
|
private void ApplyKeyboardLayout()
|
||||||
{
|
{
|
||||||
if (RgbDevice.DeviceInfo.DeviceType != RGBDeviceType.Keyboard)
|
if (RgbDevice.DeviceInfo.DeviceType != RGBDeviceType.Keyboard)
|
||||||
@ -443,22 +471,5 @@ namespace Artemis.Core
|
|||||||
else
|
else
|
||||||
LogicalLayout = DeviceEntity.LogicalLayout;
|
LogicalLayout = DeviceEntity.LogicalLayout;
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Events
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Occurs when the underlying RGB.NET device was updated
|
|
||||||
/// </summary>
|
|
||||||
public event EventHandler? DeviceUpdated;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Invokes the <see cref="DeviceUpdated" /> event
|
|
||||||
/// </summary>
|
|
||||||
protected virtual void OnDeviceUpdated()
|
|
||||||
{
|
|
||||||
DeviceUpdated?.Invoke(this, EventArgs.Empty);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1,17 +1,18 @@
|
|||||||
using Artemis.Core.Services;
|
namespace Artemis.Core
|
||||||
using RGB.NET.Core;
|
|
||||||
|
|
||||||
namespace Artemis.Core
|
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents a device input identifier used by a specific <see cref="Services.InputProvider" /> to identify the device
|
/// Represents a device input identifier used by a specific <see cref="Services.InputProvider" /> to identify the
|
||||||
|
/// device
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class ArtemisDeviceInputIdentifier
|
public class ArtemisDeviceInputIdentifier
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a new instance of the <see cref="ArtemisDeviceInputIdentifier" /> class
|
/// Creates a new instance of the <see cref="ArtemisDeviceInputIdentifier" /> class
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="inputProvider">The full type and namespace of the <see cref="Services.InputProvider" /> this identifier is used by</param>
|
/// <param name="inputProvider">
|
||||||
|
/// The full type and namespace of the <see cref="Services.InputProvider" /> this identifier is
|
||||||
|
/// used by
|
||||||
|
/// </param>
|
||||||
/// <param name="identifier">A value used to identify the device</param>
|
/// <param name="identifier">A value used to identify the device</param>
|
||||||
internal ArtemisDeviceInputIdentifier(string inputProvider, object identifier)
|
internal ArtemisDeviceInputIdentifier(string inputProvider, object identifier)
|
||||||
{
|
{
|
||||||
@ -29,16 +30,4 @@ namespace Artemis.Core
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public object Identifier { get; set; }
|
public object Identifier { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ArtemisDeviceInputMapping
|
|
||||||
{
|
|
||||||
public ArtemisLed OriginalLed { get; }
|
|
||||||
public ArtemisLed MappedLed { get; }
|
|
||||||
|
|
||||||
internal ArtemisDeviceInputMapping(ArtemisLed originalLed, ArtemisLed mappedLed)
|
|
||||||
{
|
|
||||||
OriginalLed = originalLed;
|
|
||||||
MappedLed = mappedLed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@ -330,14 +330,15 @@ namespace Artemis.UI.Shared
|
|||||||
|
|
||||||
private void Render()
|
private void Render()
|
||||||
{
|
{
|
||||||
DrawingContext drawingContext = _backingStore.Open();
|
DrawingContext drawingContext = _backingStore.Append();
|
||||||
|
// DrawingContext drawingContext = _backingStore.Open();
|
||||||
|
|
||||||
if (HighlightedLeds != null && HighlightedLeds.Any())
|
if (HighlightedLeds != null && HighlightedLeds.Any())
|
||||||
foreach (DeviceVisualizerLed deviceVisualizerLed in _deviceVisualizerLeds)
|
foreach (DeviceVisualizerLed deviceVisualizerLed in _deviceVisualizerLeds)
|
||||||
deviceVisualizerLed.RenderColor(drawingContext, !HighlightedLeds.Contains(deviceVisualizerLed.Led));
|
deviceVisualizerLed.RenderColor(_backingStore, drawingContext, !HighlightedLeds.Contains(deviceVisualizerLed.Led));
|
||||||
else
|
else
|
||||||
foreach (DeviceVisualizerLed deviceVisualizerLed in _deviceVisualizerLeds)
|
foreach (DeviceVisualizerLed deviceVisualizerLed in _deviceVisualizerLeds)
|
||||||
deviceVisualizerLed.RenderColor(drawingContext, false);
|
deviceVisualizerLed.RenderColor(_backingStore, drawingContext, false);
|
||||||
|
|
||||||
drawingContext.Close();
|
drawingContext.Close();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,9 +14,10 @@ namespace Artemis.UI.Shared
|
|||||||
{
|
{
|
||||||
private const byte Dimmed = 100;
|
private const byte Dimmed = 100;
|
||||||
private const byte NonDimmed = 255;
|
private const byte NonDimmed = 255;
|
||||||
|
private GeometryDrawing? _geometryDrawing;
|
||||||
|
private Color _renderColor;
|
||||||
|
|
||||||
private SolidColorBrush? _renderColorBrush;
|
private SolidColorBrush? _renderColorBrush;
|
||||||
private Color _renderColor;
|
|
||||||
|
|
||||||
public DeviceVisualizerLed(ArtemisLed led)
|
public DeviceVisualizerLed(ArtemisLed led)
|
||||||
{
|
{
|
||||||
@ -40,12 +41,13 @@ namespace Artemis.UI.Shared
|
|||||||
public BitmapImage? LedImage { get; set; }
|
public BitmapImage? LedImage { get; set; }
|
||||||
public Geometry? DisplayGeometry { get; private set; }
|
public Geometry? DisplayGeometry { get; private set; }
|
||||||
|
|
||||||
public void RenderColor(DrawingContext drawingContext, bool isDimmed)
|
public void RenderColor(DrawingGroup backingStore, DrawingContext drawingContext, bool isDimmed)
|
||||||
{
|
{
|
||||||
if (DisplayGeometry == null)
|
if (DisplayGeometry == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_renderColorBrush ??= new SolidColorBrush();
|
_renderColorBrush ??= new SolidColorBrush();
|
||||||
|
_geometryDrawing ??= new GeometryDrawing(_renderColorBrush, null, new RectangleGeometry(LedRect));
|
||||||
|
|
||||||
byte r = Led.RgbLed.Color.GetR();
|
byte r = Led.RgbLed.Color.GetR();
|
||||||
byte g = Led.RgbLed.Color.GetG();
|
byte g = Led.RgbLed.Color.GetG();
|
||||||
@ -56,7 +58,10 @@ namespace Artemis.UI.Shared
|
|||||||
_renderColor.G = g;
|
_renderColor.G = g;
|
||||||
_renderColor.B = b;
|
_renderColor.B = b;
|
||||||
_renderColorBrush.Color = _renderColor;
|
_renderColorBrush.Color = _renderColor;
|
||||||
drawingContext.DrawRectangle(_renderColorBrush, null, LedRect);
|
|
||||||
|
|
||||||
|
if (!backingStore.Children.Contains(_geometryDrawing))
|
||||||
|
backingStore.Children.Add(_geometryDrawing);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RenderImage(DrawingContext drawingContext)
|
public void RenderImage(DrawingContext drawingContext)
|
||||||
|
|||||||
@ -55,7 +55,7 @@ namespace Artemis.UI.DefaultTypes.PropertyInput
|
|||||||
Execute.PostToUIThread(async () =>
|
Execute.PostToUIThread(async () =>
|
||||||
{
|
{
|
||||||
await Task.Delay(400);
|
await Task.Delay(400);
|
||||||
_dialogService.ShowDialogAt<LayerBrushPresetViewModel>("LayerProperties", new Dictionary<string, object> {{"layerBrush", layer.LayerBrush}});
|
await _dialogService.ShowDialogAt<LayerBrushPresetViewModel>("LayerProperties", new Dictionary<string, object> {{"layerBrush", layer.LayerBrush}});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -322,6 +322,9 @@ namespace Artemis.UI.Screens.ProfileEditor.LayerProperties.Timeline
|
|||||||
false,
|
false,
|
||||||
keyframeViewModels.Where(k => k != sourceKeyframeViewModel).Select(k => k.Position).ToList()
|
keyframeViewModels.Where(k => k != sourceKeyframeViewModel).Select(k => k.Position).ToList()
|
||||||
);
|
);
|
||||||
|
// If holding down control, round to the closest 50ms
|
||||||
|
else if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
|
||||||
|
cursorTime = TimeSpan.FromMilliseconds(Math.Round(cursorTime.TotalMilliseconds / 50.0) * 50.0);
|
||||||
|
|
||||||
sourceKeyframeViewModel.UpdatePosition(cursorTime);
|
sourceKeyframeViewModel.UpdatePosition(cursorTime);
|
||||||
|
|
||||||
|
|||||||
@ -9,7 +9,7 @@
|
|||||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||||
xmlns:shared="clr-namespace:Artemis.UI.Shared;assembly=Artemis.UI.Shared"
|
xmlns:shared="clr-namespace:Artemis.UI.Shared;assembly=Artemis.UI.Shared"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
Title="Plugin configuration"
|
Title="Plugin Configuration | Artemis"
|
||||||
Background="{DynamicResource MaterialDesignPaper}"
|
Background="{DynamicResource MaterialDesignPaper}"
|
||||||
FontFamily="pack://application:,,,/MaterialDesignThemes.Wpf;component/Resources/Roboto/#Roboto"
|
FontFamily="pack://application:,,,/MaterialDesignThemes.Wpf;component/Resources/Roboto/#Roboto"
|
||||||
UseLayoutRounding="True"
|
UseLayoutRounding="True"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user