1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-31 01:42:02 +00:00

Surface editor - Fixed issues with moving devices without a layout

This closes #492
This commit is contained in:
SpoinkyNL 2020-10-24 20:17:58 +02:00
parent 22c704e919
commit b8112601df
2 changed files with 23 additions and 22 deletions

View File

@ -21,14 +21,15 @@ namespace Artemis.UI.Shared
{ {
List<T> result = new List<T>(); List<T> result = new List<T>();
GeometryHitTestParameters hitTestParams = new GeometryHitTestParameters(rectangleGeometry); GeometryHitTestParameters hitTestParams = new GeometryHitTestParameters(rectangleGeometry);
HitTestResultCallback resultCallback = new HitTestResultCallback(r => HitTestResultBehavior.Continue);
HitTestFilterCallback filterCallback = new HitTestFilterCallback(e => HitTestResultBehavior ResultCallback(HitTestResult r) => HitTestResultBehavior.Continue;
HitTestFilterBehavior FilterCallback(DependencyObject e)
{ {
if (e is FrameworkElement fe && fe.DataContext is T context && !result.Contains(context)) if (e is FrameworkElement fe && fe.DataContext is T context && !result.Contains(context)) result.Add(context);
result.Add(context);
return HitTestFilterBehavior.Continue; return HitTestFilterBehavior.Continue;
}); }
VisualTreeHelper.HitTest(container, filterCallback, resultCallback, hitTestParams);
VisualTreeHelper.HitTest(container, FilterCallback, ResultCallback, hitTestParams);
return result; return result;
} }

View File

@ -12,6 +12,7 @@ using Artemis.Core.Services;
using Artemis.UI.Screens.Shared; using Artemis.UI.Screens.Shared;
using Artemis.UI.Screens.SurfaceEditor.Dialogs; using Artemis.UI.Screens.SurfaceEditor.Dialogs;
using Artemis.UI.Screens.SurfaceEditor.Visualization; using Artemis.UI.Screens.SurfaceEditor.Visualization;
using Artemis.UI.Shared;
using Artemis.UI.Shared.Services; using Artemis.UI.Shared.Services;
using Stylet; using Stylet;
@ -308,9 +309,9 @@ namespace Artemis.UI.Screens.SurfaceEditor
Point position = e.GetPosition((IInputElement) sender); Point position = e.GetPosition((IInputElement) sender);
Point relative = PanZoomViewModel.GetRelativeMousePosition(sender, e); Point relative = PanZoomViewModel.GetRelativeMousePosition(sender, e);
if (e.LeftButton == MouseButtonState.Pressed) if (e.LeftButton == MouseButtonState.Pressed)
StartMouseDrag(position, relative); StartMouseDrag(sender, position, relative);
else else
StopMouseDrag(position); StopMouseDrag(sender, position);
} }
// ReSharper disable once UnusedMember.Global - Called from view // ReSharper disable once UnusedMember.Global - Called from view
@ -329,13 +330,14 @@ namespace Artemis.UI.Screens.SurfaceEditor
if (_mouseDragStatus == MouseDragStatus.Dragging) if (_mouseDragStatus == MouseDragStatus.Dragging)
MoveSelected(relative); MoveSelected(relative);
else if (_mouseDragStatus == MouseDragStatus.Selecting) else if (_mouseDragStatus == MouseDragStatus.Selecting)
UpdateSelection(position); UpdateSelection(sender, position);
} }
private void StartMouseDrag(Point position, Point relative) private void StartMouseDrag(object sender, Point position, Point relative)
{ {
// If drag started on top of a device, initialise dragging // If drag started on top of a device, initialise dragging
SurfaceDeviceViewModel device = Devices.LastOrDefault(d => PanZoomViewModel.TransformContainingRect(d.DeviceRectangle).Contains(position)); RectangleGeometry selectedRect = new RectangleGeometry(new Rect(position, new Size(1, 1)));
SurfaceDeviceViewModel device = HitTestUtilities.GetHitViewModels<SurfaceDeviceViewModel>((Visual) sender, selectedRect).FirstOrDefault();
if (device != null) if (device != null)
{ {
_rgbService.IsRenderPaused = true; _rgbService.IsRenderPaused = true;
@ -344,10 +346,8 @@ namespace Artemis.UI.Screens.SurfaceEditor
if (device.SelectionStatus != SelectionStatus.Selected) if (device.SelectionStatus != SelectionStatus.Selected)
{ {
if (!Keyboard.IsKeyDown(Key.LeftShift) && !Keyboard.IsKeyDown(Key.RightShift)) if (!Keyboard.IsKeyDown(Key.LeftShift) && !Keyboard.IsKeyDown(Key.RightShift))
{
foreach (SurfaceDeviceViewModel others in Devices) foreach (SurfaceDeviceViewModel others in Devices)
others.SelectionStatus = SelectionStatus.None; others.SelectionStatus = SelectionStatus.None;
}
device.SelectionStatus = SelectionStatus.Selected; device.SelectionStatus = SelectionStatus.Selected;
} }
@ -366,27 +366,28 @@ namespace Artemis.UI.Screens.SurfaceEditor
SelectionRectangle.Rect = new Rect(); SelectionRectangle.Rect = new Rect();
} }
private void StopMouseDrag(Point position) private void StopMouseDrag(object sender, Point position)
{ {
if (_mouseDragStatus != MouseDragStatus.Dragging) if (_mouseDragStatus != MouseDragStatus.Dragging)
{ {
Rect selectedRect = new Rect(_mouseDragStartPoint, position); RectangleGeometry selectedRect = new RectangleGeometry(new Rect(_mouseDragStartPoint, position));
List<SurfaceDeviceViewModel> devices = HitTestUtilities.GetHitViewModels<SurfaceDeviceViewModel>((Visual) sender, selectedRect);
foreach (SurfaceDeviceViewModel device in Devices) foreach (SurfaceDeviceViewModel device in Devices)
{ if (devices.Contains(device))
if (PanZoomViewModel.TransformContainingRect(device.DeviceRectangle).IntersectsWith(selectedRect))
device.SelectionStatus = SelectionStatus.Selected; device.SelectionStatus = SelectionStatus.Selected;
else if (!Keyboard.IsKeyDown(Key.LeftShift) && !Keyboard.IsKeyDown(Key.RightShift)) else if (!Keyboard.IsKeyDown(Key.LeftShift) && !Keyboard.IsKeyDown(Key.RightShift))
device.SelectionStatus = SelectionStatus.None; device.SelectionStatus = SelectionStatus.None;
}
} }
else else
{
_surfaceService.UpdateSurfaceConfiguration(SelectedSurface, true); _surfaceService.UpdateSurfaceConfiguration(SelectedSurface, true);
}
_mouseDragStatus = MouseDragStatus.None; _mouseDragStatus = MouseDragStatus.None;
_rgbService.IsRenderPaused = false; _rgbService.IsRenderPaused = false;
} }
private void UpdateSelection(Point position) private void UpdateSelection(object sender, Point position)
{ {
if (IsPanKeyDown()) if (IsPanKeyDown())
return; return;
@ -394,13 +395,12 @@ namespace Artemis.UI.Screens.SurfaceEditor
Rect selectedRect = new Rect(_mouseDragStartPoint, position); Rect selectedRect = new Rect(_mouseDragStartPoint, position);
SelectionRectangle.Rect = selectedRect; SelectionRectangle.Rect = selectedRect;
List<SurfaceDeviceViewModel> devices = HitTestUtilities.GetHitViewModels<SurfaceDeviceViewModel>((Visual) sender, SelectionRectangle);
foreach (SurfaceDeviceViewModel device in Devices) foreach (SurfaceDeviceViewModel device in Devices)
{ if (devices.Contains(device))
if (PanZoomViewModel.TransformContainingRect(device.DeviceRectangle).IntersectsWith(selectedRect))
device.SelectionStatus = SelectionStatus.Selected; device.SelectionStatus = SelectionStatus.Selected;
else if (!Keyboard.IsKeyDown(Key.LeftShift) && !Keyboard.IsKeyDown(Key.RightShift)) else if (!Keyboard.IsKeyDown(Key.LeftShift) && !Keyboard.IsKeyDown(Key.RightShift))
device.SelectionStatus = SelectionStatus.None; device.SelectionStatus = SelectionStatus.None;
}
} }
private void MoveSelected(Point position) private void MoveSelected(Point position)