From b8112601dfe911cf1364b402fffd85fed41f3059 Mon Sep 17 00:00:00 2001 From: SpoinkyNL Date: Sat, 24 Oct 2020 20:17:58 +0200 Subject: [PATCH] Surface editor - Fixed issues with moving devices without a layout This closes #492 --- .../Utilities/HitTestUtilities.cs | 13 ++++---- .../SurfaceEditor/SurfaceEditorViewModel.cs | 32 +++++++++---------- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/src/Artemis.UI.Shared/Utilities/HitTestUtilities.cs b/src/Artemis.UI.Shared/Utilities/HitTestUtilities.cs index e2cd4fdc7..856c6b250 100644 --- a/src/Artemis.UI.Shared/Utilities/HitTestUtilities.cs +++ b/src/Artemis.UI.Shared/Utilities/HitTestUtilities.cs @@ -21,14 +21,15 @@ namespace Artemis.UI.Shared { List result = new List(); 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)) - result.Add(context); + if (e is FrameworkElement fe && fe.DataContext is T context && !result.Contains(context)) result.Add(context); return HitTestFilterBehavior.Continue; - }); - VisualTreeHelper.HitTest(container, filterCallback, resultCallback, hitTestParams); + } + + VisualTreeHelper.HitTest(container, FilterCallback, ResultCallback, hitTestParams); return result; } diff --git a/src/Artemis.UI/Screens/SurfaceEditor/SurfaceEditorViewModel.cs b/src/Artemis.UI/Screens/SurfaceEditor/SurfaceEditorViewModel.cs index 5e59bd77d..8b69f6817 100644 --- a/src/Artemis.UI/Screens/SurfaceEditor/SurfaceEditorViewModel.cs +++ b/src/Artemis.UI/Screens/SurfaceEditor/SurfaceEditorViewModel.cs @@ -12,6 +12,7 @@ using Artemis.Core.Services; using Artemis.UI.Screens.Shared; using Artemis.UI.Screens.SurfaceEditor.Dialogs; using Artemis.UI.Screens.SurfaceEditor.Visualization; +using Artemis.UI.Shared; using Artemis.UI.Shared.Services; using Stylet; @@ -308,9 +309,9 @@ namespace Artemis.UI.Screens.SurfaceEditor Point position = e.GetPosition((IInputElement) sender); Point relative = PanZoomViewModel.GetRelativeMousePosition(sender, e); if (e.LeftButton == MouseButtonState.Pressed) - StartMouseDrag(position, relative); + StartMouseDrag(sender, position, relative); else - StopMouseDrag(position); + StopMouseDrag(sender, position); } // ReSharper disable once UnusedMember.Global - Called from view @@ -329,13 +330,14 @@ namespace Artemis.UI.Screens.SurfaceEditor if (_mouseDragStatus == MouseDragStatus.Dragging) MoveSelected(relative); 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 - 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((Visual) sender, selectedRect).FirstOrDefault(); if (device != null) { _rgbService.IsRenderPaused = true; @@ -344,10 +346,8 @@ namespace Artemis.UI.Screens.SurfaceEditor if (device.SelectionStatus != SelectionStatus.Selected) { if (!Keyboard.IsKeyDown(Key.LeftShift) && !Keyboard.IsKeyDown(Key.RightShift)) - { foreach (SurfaceDeviceViewModel others in Devices) others.SelectionStatus = SelectionStatus.None; - } device.SelectionStatus = SelectionStatus.Selected; } @@ -366,27 +366,28 @@ namespace Artemis.UI.Screens.SurfaceEditor SelectionRectangle.Rect = new Rect(); } - private void StopMouseDrag(Point position) + private void StopMouseDrag(object sender, Point position) { if (_mouseDragStatus != MouseDragStatus.Dragging) { - Rect selectedRect = new Rect(_mouseDragStartPoint, position); + RectangleGeometry selectedRect = new RectangleGeometry(new Rect(_mouseDragStartPoint, position)); + List devices = HitTestUtilities.GetHitViewModels((Visual) sender, selectedRect); foreach (SurfaceDeviceViewModel device in Devices) - { - if (PanZoomViewModel.TransformContainingRect(device.DeviceRectangle).IntersectsWith(selectedRect)) + if (devices.Contains(device)) device.SelectionStatus = SelectionStatus.Selected; else if (!Keyboard.IsKeyDown(Key.LeftShift) && !Keyboard.IsKeyDown(Key.RightShift)) device.SelectionStatus = SelectionStatus.None; - } } else + { _surfaceService.UpdateSurfaceConfiguration(SelectedSurface, true); + } _mouseDragStatus = MouseDragStatus.None; _rgbService.IsRenderPaused = false; } - private void UpdateSelection(Point position) + private void UpdateSelection(object sender, Point position) { if (IsPanKeyDown()) return; @@ -394,13 +395,12 @@ namespace Artemis.UI.Screens.SurfaceEditor Rect selectedRect = new Rect(_mouseDragStartPoint, position); SelectionRectangle.Rect = selectedRect; + List devices = HitTestUtilities.GetHitViewModels((Visual) sender, SelectionRectangle); foreach (SurfaceDeviceViewModel device in Devices) - { - if (PanZoomViewModel.TransformContainingRect(device.DeviceRectangle).IntersectsWith(selectedRect)) + if (devices.Contains(device)) device.SelectionStatus = SelectionStatus.Selected; else if (!Keyboard.IsKeyDown(Key.LeftShift) && !Keyboard.IsKeyDown(Key.RightShift)) device.SelectionStatus = SelectionStatus.None; - } } private void MoveSelected(Point position)