public void MouseMove(Point position) { if (_workspace == null || _workspace.InputService == null) { return; } lastPointerPosition = position; var delta = lastPanPoint - position; if (panning) { var vp = _workspace.ActiveViewPort; var scale = vp.ViewHeight / Height; var dx = vp.BottomLeft.X + delta.X * scale; var dy = vp.BottomLeft.Y - delta.Y * scale; _workspace.Update(activeViewPort: vp.Update(bottomLeft: new Point(dx, dy, vp.BottomLeft.Z))); lastPanPoint = position; firstSelectionPoint -= delta; } if (selecting) { var left = Math.Min(position.X, firstSelectionPoint.X); var top = Math.Min(position.Y, firstSelectionPoint.Y); var width = Math.Abs(position.X - firstSelectionPoint.X); var height = Math.Abs(position.Y - firstSelectionPoint.Y); var rect = new Rect(left, top, width, height); var mode = position.X < firstSelectionPoint.X ? SelectionMode.PartialEntity : SelectionMode.WholeEntity; currentSelectionPoint = position; UpdateSelectionRectangle(new SelectionState(rect, mode)); } updateSnapPointsTask.ContinueWith(_ => { var snapPoint = GetActiveModelPoint(position, updateSnapPointsCancellationTokenSource.Token); CursorWorldLocationUpdated?.Invoke(this, snapPoint.WorldPoint); CurrentSnapPointUpdated?.Invoke(this, snapPoint); UpdateRubberBandLines(snapPoint.WorldPoint); if ((_workspace.InputService.AllowedInputTypes & InputType.Point) == InputType.Point || selectingRectangle) { DrawSnapPoint(snapPoint, GetNextDrawSnapPointId()); } }, updateSnapPointsCancellationTokenSource.Token).ConfigureAwait(false); }
private void DrawSnapPoint(TransformedSnapPoint snapPoint, long drawId) { lock (lastDrawnSnapPointIdGate) { if (drawId > lastDrawnSnapPointId) { lastDrawnSnapPointId = drawId; var snapDistance = _workspace.SettingsService.GetValue <double>(DisplaySettingsNames.SnapPointDistance); snapDistance *= snapDistance; var distSquared = (snapPoint.ControlPoint - lastPointerPosition).LengthSquared; if (distSquared <= snapDistance && snapPoint.Kind != SnapPointKind.None) { CurrentSnapPointUpdated?.Invoke(this, snapPoint); } else { CurrentSnapPointUpdated?.Invoke(this, null); } } } }