Profile editor - Implemented timeline segments

Profile editor - Added snapping to multiple elements of the timeline
This commit is contained in:
SpoinkyNL committed 2020-07-18 23:52:42 +02:00
1 parent 77dd804e74
commit 732ee2f429
17 files changed
+527 -154

No files matched your search

@@ -8,6 +8,7 @@ using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Threading;
using Artemis.Core.Models.Surface;
using RGB.NET.Core;
using Size = System.Windows.Size;
@@ -28,17 +29,20 @@ namespace Artemis.UI.Shared.Controls
private readonly DrawingGroup _backingStore;
private readonly List<DeviceVisualizerLed> _deviceVisualizerLeds;
private BitmapImage _deviceImage;
private bool _subscribed;
private ArtemisDevice _oldDevice;
private Task _lastRenderTask;
private readonly DispatcherTimer _timer;
public DeviceVisualizer()
{
_backingStore = new DrawingGroup();
_deviceVisualizerLeds = new List<DeviceVisualizerLed>();
Loaded += (sender, args) => SubscribeToUpdate(true);
Unloaded += (sender, args) => SubscribeToUpdate(false);
// Run an update timer at 25 fps
_timer = new DispatcherTimer {Interval = TimeSpan.FromMilliseconds(40)};
_timer.Tick += TimerOnTick;
Loaded += (sender, args) => _timer.Start();
Unloaded += (sender, args) => _timer.Stop();
}
public ArtemisDevice Device
@@ -61,7 +65,7 @@ namespace Artemis.UI.Shared.Controls
public void Dispose()
{
RGBSurface.Instance.Updated -= RgbSurfaceOnUpdated;
_timer.Stop();
}
protected override void OnRender(DrawingContext drawingContext)
@@ -73,7 +77,7 @@ namespace Artemis.UI.Shared.Controls
var measureSize = MeasureOverride(Size.Empty);
var scale = Math.Min(DesiredSize.Width / measureSize.Width, DesiredSize.Height / measureSize.Height);
var scaledRect = new Rect(0, 0, measureSize.Width * scale, measureSize.Height * scale);
// Center and scale the visualization in the desired bounding box
if (DesiredSize.Width > 0 && DesiredSize.Height > 0)
{
@@ -95,7 +99,7 @@ namespace Artemis.UI.Shared.Controls
// Render device and LED images
if (_deviceImage != null)
drawingContext.DrawImage(_deviceImage, new Rect(0, 0, Device.RgbDevice.Size.Width, Device.RgbDevice.Size.Height));
foreach (var deviceVisualizerLed in _deviceVisualizerLeds)
deviceVisualizerLed.RenderImage(drawingContext);
@@ -113,26 +117,18 @@ namespace Artemis.UI.Shared.Controls
return rotationRect.Size;
}
private void TimerOnTick(object sender, EventArgs e)
{
if (ShowColors && Visibility == Visibility.Visible)
Render();
}
private void UpdateTransform()
{
InvalidateVisual();
InvalidateMeasure();
}
private void SubscribeToUpdate(bool subscribe)
{
if (_subscribed == subscribe)
return;
if (subscribe)
RGBSurface.Instance.Updated += RgbSurfaceOnUpdated;
else
RGBSurface.Instance.Updated -= RgbSurfaceOnUpdated;
_subscribed = subscribe;
}
private static void DevicePropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var deviceVisualizer = (DeviceVisualizer) d;
@@ -208,17 +204,7 @@ namespace Artemis.UI.Shared.Controls
if (e.PropertyName == nameof(Device.RgbDevice.Scale) || e.PropertyName == nameof(Device.RgbDevice.Rotation))
UpdateTransform();
}
private void RgbSurfaceOnUpdated(UpdatedEventArgs e)
{
_lastRenderTask?.Wait();
_lastRenderTask = Dispatcher.InvokeAsync(() =>
{
if (ShowColors && Visibility == Visibility.Visible)
Render();
}).Task;
}
private void Render()
{
@@ -44,7 +44,7 @@ namespace Artemis.UI.Shared.Controls
var r = Led.RgbLed.Color.GetR();
var g = Led.RgbLed.Color.GetG();
var b = Led.RgbLed.Color.GetB();
drawingContext.DrawRectangle(isDimmed
? new SolidColorBrush(Color.FromArgb(100, r, g, b))
: new SolidColorBrush(Color.FromRgb(r, g, b)), null, LedRect);