void IResizingTarget.OnResizingStarted(ResizingDirection direction) { // Makes sure the point is synchronized with the underlying key/value pair. SynchronizePoint(); // Remember the starting point startingPoint = ActualPoint; }
private void Click(WindowsPoint point) { var editableCurve = SelectedCurve as IEditableCurveViewModel; if (editableCurve == null) { IsControlPointHovered = false; return; } // TODO: move this to the curve (especially hit testing) var radius = editableCurve.ControlPointRadius; var clickedPoint = editableCurve.GetClosestPoint(point, 2 * radius); if (clickedPoint == null) { if (Keyboard.Modifiers == ModifierKeys.None) { ClearPointSelection(); } IsControlPointHovered = false; return; } if (!clickedPoint.IsSelected) { // FIXME: do this atomically in the curve Select(new WindowsRect(point.X - 2 * radius, point.Y - 2 * radius, 4 * radius, 4 * radius), true); } IsControlPointHovered = true; }
private void AddPoint(WindowsPoint point) { using (var transaction = UndoRedoService.CreateTransaction()) { var editableCurve = selectedCurve as IEditableCurveViewModel; editableCurve?.AddPoint(point); UndoRedoService.SetName(transaction, "Add control point"); } }
public override void AddPoint(WindowsPoint point) { var realPoint = InverseTransformPoint(point); var keyFrame = new AnimationKeyFrame <float> { Key = realPoint.X, Value = realPoint.Y, }; var index = GetInsertIndex(realPoint); KeyFramesNode.Add(keyFrame, index); }
/// <inheritdoc/> public sealed override void AddPoint(WindowsPoint point) { var realPoint = InverseTransformPoint(point); // Make sure the curve is sampled UnderlyingCurve.UpdateChanges(); // Evaluate the current value var value = UnderlyingCurve.Evaluate(realPoint.X); UpdateComponent(ref value, realPoint); var keyFrame = new AnimationKeyFrame <TValue> { Key = realPoint.X, Value = value, }; var index = GetInsertIndex(realPoint); KeyFramesNode.Add(keyFrame, index); }
private void Select(WindowsRect selectionRect, bool isSingleSelection) { var editableCurve = SelectedCurve as IEditableCurveViewModel; if (editableCurve == null) { return; } // TODO: move this to the curve (especially hit testing) IList <ControlPointViewModelBase> selectedPoints = editableCurve.ControlPoints.Where(c => selectionRect.Contains(c.ActualPoint)).ToList(); if (selectedPoints.Count > 1 && isSingleSelection) { var rectCenter = new WindowsPoint(selectionRect.Left + selectionRect.Width * 0.5, selectionRect.Top + selectionRect.Height * 0.5); var closest = CurveHelper.GetClosestPoint(selectedPoints, rectCenter); selectedPoints = new[] { closest }; } switch (Keyboard.Modifiers) { case ModifierKeys.None: ClearPointSelection(); goto case ModifierKeys.Shift; case ModifierKeys.Shift: // FIXME: do this atomically in the curve foreach (var p in selectedPoints.Where(p => !p.IsSelected)) { SelectedControlPoints.Add(p); p.IsSelected = true; } break; case ModifierKeys.Control: // FIXME: do this atomically in the curve foreach (var p in selectedPoints.Where(p => p.IsSelected)) { SelectedControlPoints.Remove(p); p.IsSelected = false; } break; } }
/// <inheritdoc/> public override void AddPoint(WindowsPoint point) { var realPoint = InverseTransformPoint(point); // Make sure the curve is sampled UnderlyingCurve.UpdateChanges(); // Evaluate the current value var value = UnderlyingCurve.Evaluate(realPoint.X); // Update the component that is handled by this curve switch (Component) { case VectorComponent.X: value.X = realPoint.Y; break; case VectorComponent.Y: value.Y = realPoint.Y; break; case VectorComponent.Z: value.Z = realPoint.Y; break; case VectorComponent.W: value.Z = realPoint.Y; break; default: throw new NotSupportedException(); // This should never happen } // Create a new keyframe var keyFrame = new AnimationKeyFrame <Quaternion> { Key = realPoint.X, Value = value, }; var index = GetInsertIndex(realPoint); KeyFramesNode.Add(keyFrame, index); }
public static ControlPointViewModelBase GetClosestPoint([ItemNotNull, NotNull] IEnumerable <ControlPointViewModelBase> points, WindowsPoint position, double maximumDistance = double.PositiveInfinity) { ControlPointViewModelBase closest = null; var closestDistance = double.MaxValue; foreach (var p in points) { var distance = (p.ActualPoint - position).LengthSquared; if (distance < closestDistance && distance < maximumDistance * maximumDistance) { closest = p; closestDistance = distance; } } return(closest); }
public static Vector2 ToVector2(this WindowsPoint point) { return(new Vector2((float)point.X, (float)point.Y)); }
internal Vector2 InverseTransformPoint(WindowsPoint point) { return((CheckAxes() ? XAxis.InverseTransform(point.X, point.Y, YAxis) : point).ToVector2()); }
/// <summary> /// Parses event and builds event args. /// </summary> /// <param name="wParam">Type of event.</param> /// <param name="mouse">Mouse event properties.</param> /// <returns>Strongly typed event info.</returns> private MouseChangeEventArgs BuildEventArgs(WindowsMessages wParam, MouseLowLevelHookStruct mouse) { var args = new MouseChangeEventArgs() { Button = ButtonSource.Unknown, ButtonDirection = ButtonChangeDirection.Unknown, DeltaPosition = WindowsPoint.Invalid, EventType = MouseEventType.Unknown, NewPosition = WindowsPoint.Invalid, Scroll = ScrollSource.Unknown, ScrollDirection = ScrollChangeDirection.Unknown, }; if (wParam == WindowsMessages.MOUSEWHEEL) { args.EventType = MouseEventType.Scroll; args.Scroll = ScrollSource.VerticalScrollWheel; if (mouse.mouseData > 0) { args.ScrollDirection = ScrollChangeDirection.Up; } else { args.ScrollDirection = ScrollChangeDirection.Down; } } else if (wParam == WindowsMessages.MOUSEHWHEEL) { args.EventType = MouseEventType.Scroll; args.Scroll = ScrollSource.HorizontalScrollWheel; if (mouse.mouseData > 0) { args.ScrollDirection = ScrollChangeDirection.Up; } else { args.ScrollDirection = ScrollChangeDirection.Down; } } else if (wParam == WindowsMessages.MOUSEMOVE) { args.EventType = MouseEventType.Move; args.DeltaPosition = _previousePosition.Delta(mouse.pt); _previousePosition = mouse.pt; args.NewPosition = new WindowsPoint(mouse.pt.X, mouse.pt.Y); } else if (wParam == WindowsMessages.LBUTTONDOWN) { args.EventType = MouseEventType.Button; args.Button = ButtonSource.LeftButton; args.ButtonDirection = ButtonChangeDirection.Down; } else if (wParam == WindowsMessages.LBUTTONUP) { args.EventType = MouseEventType.Button; args.Button = ButtonSource.LeftButton; args.ButtonDirection = ButtonChangeDirection.Up; } else if (wParam == WindowsMessages.RBUTTONDOWN) { args.EventType = MouseEventType.Button; args.Button = ButtonSource.RightButton; args.ButtonDirection = ButtonChangeDirection.Down; } else if (wParam == WindowsMessages.RBUTTONUP) { args.EventType = MouseEventType.Button; args.Button = ButtonSource.RightButton; args.ButtonDirection = ButtonChangeDirection.Up; } else if (wParam == WindowsMessages.MBUTTONDOWN) { args.EventType = MouseEventType.Button; args.Button = ButtonSource.MiddleButton; args.ButtonDirection = ButtonChangeDirection.Down; } else if (wParam == WindowsMessages.MBUTTONUP) { args.EventType = MouseEventType.Button; args.Button = ButtonSource.MiddleButton; args.ButtonDirection = ButtonChangeDirection.Up; } else if (wParam == WindowsMessages.XBUTTONDOWN) { args.EventType = MouseEventType.Button; args.ButtonDirection = ButtonChangeDirection.Down; if ((mouse.flags & 0x01) > 0 && (mouse.mouseData & 0x10000) > 0) { args.Button = ButtonSource.Mouse4; } else if ((mouse.flags & 0x01) > 0 && (mouse.mouseData & 0x20000) > 0) { args.Button = ButtonSource.Mouse5; } } else if (wParam == WindowsMessages.XBUTTONUP) { args.EventType = MouseEventType.Button; args.ButtonDirection = ButtonChangeDirection.Up; if ((mouse.flags & 0x01) > 0 && (mouse.mouseData & 0x10000) > 0) { args.Button = ButtonSource.Mouse4; } else if ((mouse.flags & 0x01) > 0 && (mouse.mouseData & 0x20000) > 0) { args.Button = ButtonSource.Mouse5; } } return(args); }
public ControlPointViewModelBase GetClosestPoint(WindowsPoint position, double maximumDistance) { return(CurveHelper.GetClosestPoint(ControlPoints, position, maximumDistance)); }
public abstract void AddPoint(WindowsPoint point);