mirror of
https://github.com/Artemis-RGB/Artemis
synced 2025-12-13 05:48:35 +00:00
Surface editor - Fixed issues with moving devices without a layout
This closes #492
This commit is contained in:
parent
22c704e919
commit
b8112601df
@ -21,14 +21,15 @@ namespace Artemis.UI.Shared
|
||||
{
|
||||
List<T> result = new List<T>();
|
||||
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;
|
||||
}
|
||||
|
||||
@ -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<SurfaceDeviceViewModel>((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<SurfaceDeviceViewModel> devices = HitTestUtilities.GetHitViewModels<SurfaceDeviceViewModel>((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<SurfaceDeviceViewModel> devices = HitTestUtilities.GetHitViewModels<SurfaceDeviceViewModel>((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)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user