Implemented devices and LEDs in profile editor

This commit is contained in:
Robert committed 2019-11-12 14:03:18 +01:00
1 parent 83b9e5ce1a
commit 993ac1d595
13 files changed
+402 -49

No files matched your search

@@ -1,5 +1,6 @@
using System.Collections.Generic;
using RGB.NET.Core;
using System.Windows;
using Artemis.Core.Models.Surface;
using Stylet;
namespace Artemis.UI.ViewModels.Controls.ProfileEditor
@@ -8,18 +9,44 @@ namespace Artemis.UI.ViewModels.Controls.ProfileEditor
{
private readonly List<ProfileLedViewModel> _leds;
public ProfileDeviceViewModel(IRGBDevice device)
public ProfileDeviceViewModel(Device device)
{
Device = device;
_leds = new List<ProfileLedViewModel>();
foreach (var led in Device)
_leds.Add(new ProfileLedViewModel(led));
if (Device.RgbDevice != null)
{
foreach (var led in Device.RgbDevice)
_leds.Add(new ProfileLedViewModel(led));
}
}
public Device Device { get; set; }
public double X
{
get => Device.X;
set => Device.X = value;
}
public double Y
{
get => Device.Y;
set => Device.Y = value;
}
public int ZIndex
{
get => Device.ZIndex;
set => Device.ZIndex = value;
}
public IRGBDevice Device { get; }
public IReadOnlyCollection<ProfileLedViewModel> Leds => _leds.AsReadOnly();
public Rect DeviceRectangle => Device.RgbDevice == null
? new Rect()
: new Rect(X, Y, Device.RgbDevice.Size.Width, Device.RgbDevice.Size.Height);
public void Update()
{
foreach (var ledViewModel in _leds)
@@ -1,16 +1,170 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using Artemis.Core.Events;
using Artemis.Core.Models.Surface;
using Artemis.Core.Plugins.Abstract;
using Artemis.Core.Services.Interfaces;
using Artemis.Core.Services.Storage;
using Artemis.UI.ViewModels.Screens;
using Artemis.UI.ViewModels.Utilities;
using Stylet;
namespace Artemis.UI.ViewModels.Controls.ProfileEditor
{
public class ProfileEditorViewModel : ModuleViewModel
public class ProfileEditorViewModel : ModuleViewModel
{
public ProfileEditorViewModel(Module module) : base(module, "Profile Editor")
public ProfileEditorViewModel(Module module, ISurfaceService surfaceService, ICoreService coreService) : base(module, "Profile Editor")
{
surfaceService.ActiveSurfaceConfigurationChanged += OnActiveSurfaceConfigurationChanged;
coreService.FrameRendered += CoreServiceOnFrameRendered;
Devices = new ObservableCollection<ProfileDeviceViewModel>();
Execute.OnUIThread(() =>
{
SelectionRectangle = new RectangleGeometry();
PanZoomViewModel = new PanZoomViewModel();
});
ApplySurfaceConfiguration(surfaceService.ActiveSurface);
}
public ObservableCollection<ProfileDeviceViewModel> Devices { get; set; }
public RectangleGeometry SelectionRectangle { get; set; }
public PanZoomViewModel PanZoomViewModel { get; set; }
private void OnActiveSurfaceConfigurationChanged(object sender, SurfaceConfigurationEventArgs e)
{
ApplySurfaceConfiguration(e.Surface);
}
private void CoreServiceOnFrameRendered(object sender, FrameRenderedEventArgs e)
{
foreach (var profileDeviceViewModel in Devices)
profileDeviceViewModel.Update();
}
private void ApplySurfaceConfiguration(Surface surface)
{
// Make sure all devices have an up-to-date VM
foreach (var surfaceDeviceConfiguration in surface.Devices)
{
// Create VMs for missing devices
var viewModel = Devices.FirstOrDefault(vm => vm.Device.RgbDevice == surfaceDeviceConfiguration.RgbDevice);
if (viewModel == null)
Execute.OnUIThread(() => Devices.Add(new ProfileDeviceViewModel(surfaceDeviceConfiguration)));
// Update existing devices
else
viewModel.Device = surfaceDeviceConfiguration;
}
}
#region Selection
private MouseDragStatus _mouseDragStatus;
private Point _mouseDragStartPoint;
// ReSharper disable once UnusedMember.Global - Called from view
public void EditorGridMouseClick(object sender, MouseEventArgs e)
{
if (IsPanKeyDown())
return;
var position = e.GetPosition((IInputElement) sender);
var relative = PanZoomViewModel.GetRelativeMousePosition(sender, e);
if (e.LeftButton == MouseButtonState.Pressed)
StartMouseDrag(position, relative);
else
StopMouseDrag(position);
}
// ReSharper disable once UnusedMember.Global - Called from view
public void EditorGridMouseMove(object sender, MouseEventArgs e)
{
// If holding down Ctrl, pan instead of move/select
if (IsPanKeyDown())
{
Pan(sender, e);
return;
}
var position = e.GetPosition((IInputElement) sender);
if (_mouseDragStatus == MouseDragStatus.Selecting)
UpdateSelection(position);
}
private void StartMouseDrag(Point position, Point relative)
{
_mouseDragStatus = MouseDragStatus.Selecting;
_mouseDragStartPoint = position;
// Any time dragging starts, start with a new rect
SelectionRectangle.Rect = new Rect();
}
private void StopMouseDrag(Point position)
{
var selectedRect = new Rect(_mouseDragStartPoint, position);
// TODO: Select LEDs
Mouse.OverrideCursor = null;
_mouseDragStatus = MouseDragStatus.None;
}
private void UpdateSelection(Point position)
{
if (IsPanKeyDown())
return;
lock (Devices)
{
var selectedRect = new Rect(_mouseDragStartPoint, position);
SelectionRectangle.Rect = selectedRect;
// TODO: Highlight LEDs
}
}
#endregion
#region Panning and zooming
public void EditorGridMouseWheel(object sender, MouseWheelEventArgs e)
{
PanZoomViewModel.ProcessMouseScroll(sender, e);
}
public void EditorGridKeyDown(object sender, KeyEventArgs e)
{
if ((e.Key == Key.LeftCtrl || e.Key == Key.RightCtrl) && e.IsDown)
Mouse.OverrideCursor = Cursors.ScrollAll;
}
public void EditorGridKeyUp(object sender, KeyEventArgs e)
{
if ((e.Key == Key.LeftCtrl || e.Key == Key.RightCtrl) && e.IsUp)
Mouse.OverrideCursor = null;
}
public void Pan(object sender, MouseEventArgs e)
{
PanZoomViewModel.ProcessMouseMove(sender, e);
// Empty the selection rect since it's shown while mouse is down
SelectionRectangle.Rect = Rect.Empty;
}
public void ResetZoomAndPan()
{
PanZoomViewModel.Reset();
}
private bool IsPanKeyDown()
{
return Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl);
}
#endregion
}
}
}
@@ -13,7 +13,7 @@ namespace Artemis.UI.ViewModels.Controls.ProfileEditor
public ProfileLedViewModel(Led led)
{
Led = led;
Execute.OnUIThread(CreateLedGeometry);
Update();
}
@@ -92,13 +92,9 @@ namespace Artemis.UI.ViewModels.Controls.ProfileEditor
public void Update()
{
if (ColorsEnabled)
{
if (Led.Id == LedId.Keyboard_Y)
Console.WriteLine();
var newColor = Led.Color.ToMediaColor();
SetColor(newColor);
}
var newColor = Led.Color.ToMediaColor();
if (!DisplayColor.Equals(newColor))
DisplayColor = newColor;
if (Math.Abs(Led.LedRectangle.X - X) > 0.1)
X = Led.LedRectangle.X;
@@ -112,11 +108,5 @@ namespace Artemis.UI.ViewModels.Controls.ProfileEditor
if (Math.Abs(Led.LedRectangle.Height - Height) > 0.1)
Height = Led.LedRectangle.Height;
}
public void SetColor(Color color)
{
if (!DisplayColor.Equals(color))
DisplayColor = color;
}
}
}
@@ -3,17 +3,15 @@ using System.Collections.Generic;
using System.Windows;
using System.Windows.Input;
using Artemis.Core.Models.Surface;
using RGB.NET.Core;
using Stylet;
using Point = System.Windows.Point;
namespace Artemis.UI.ViewModels.Controls.SurfaceEditor
{
public class SurfaceDeviceViewModel : PropertyChangedBase
{
private readonly List<SurfaceLedViewModel> _leds;
private double _dragOffsetX;
private double _dragOffsetY;
private readonly List<SurfaceLedViewModel> _leds;
public SurfaceDeviceViewModel(Device device)
{
@@ -1,4 +1,5 @@
using Artemis.Core.Plugins.Abstract;
using Artemis.UI.Ninject.Factories;
using Artemis.UI.ViewModels.Controls.ProfileEditor;
using Stylet;
@@ -6,10 +7,10 @@ namespace Artemis.UI.ViewModels.Screens
{
public class ModuleRootViewModel : Screen
{
public ModuleRootViewModel(Module module)
public ModuleRootViewModel(Module module, IProfileEditorViewModelFactory profileEditorViewModelFactory)
{
Module = module;
ModuleViewModels = new BindableCollection<ModuleViewModel> {new ProfileEditorViewModel(Module)};
ModuleViewModels = new BindableCollection<ModuleViewModel> {profileEditorViewModelFactory.CreateModuleViewModel(Module)};
ModuleViewModels.AddRange(Module.GetViewModels());
}
@@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading.Tasks;
@@ -33,10 +32,11 @@ namespace Artemis.UI.ViewModels.Screens
_dialogService = dialogService;
}
public RectangleGeometry SelectionRectangle { get; set; }
public ObservableCollection<SurfaceDeviceViewModel> Devices { get; set; }
public ObservableCollection<Surface> SurfaceConfigurations { get; set; }
public RectangleGeometry SelectionRectangle { get; set; }
public PanZoomViewModel PanZoomViewModel { get; set; }
public Surface SelectedSurface
{
get => _selectedSurface;
@@ -47,7 +47,6 @@ namespace Artemis.UI.ViewModels.Screens
}
}
public PanZoomViewModel PanZoomViewModel { get; set; }
public string Title => "Surface Editor";
public Surface CreateSurfaceConfiguration(string name)
@@ -189,7 +188,7 @@ namespace Artemis.UI.ViewModels.Screens
#endregion
#region RgbDevice selection
#region Selection
private MouseDragStatus _mouseDragStatus;
private Point _mouseDragStartPoint;