/// <summary> /// Handle mouse up. /// Return to normal state. /// </summary> public override void OnMouseUp(DrawingCanvas drawingCanvas, Point position) { if (!drawingCanvas.IsMouseCaptured) { drawingCanvas.Cursor = Cursors.Arrow; selectMode = SelectionMode.None; return; } if (resizedObject != null) { // after resizing resizedObject.Normalize(); resizedObject = null; } if (selectMode == SelectionMode.GroupSelection) { GraphicsSelectionRectangle r = (GraphicsSelectionRectangle)drawingCanvas[drawingCanvas.Count - 1]; r.Normalize(); Rect rect = r.Frame; drawingCanvas.GraphicsList.Remove(r); foreach (GraphicsBase g in drawingCanvas.GraphicsList) { if (g.IntersectsWith(rect)) { g.IsSelected = true; } } } drawingCanvas.ReleaseMouseCapture(); drawingCanvas.InvalidateMeasure(); drawingCanvas.Cursor = Cursors.Arrow; selectMode = SelectionMode.None; AddChangeToHistory(drawingCanvas); }
/// <summary> /// Handle mouse down. /// Start moving, resizing or group selection. /// </summary> public override void OnMouseDown(DrawingCanvas drawingCanvas, Point position) { commandChangeState = null; wasMove = false; selectMode = SelectionMode.None; GraphicsBase o; GraphicsBase movedObject = null; int handleNumber; // Test for resizing (only if control is selected, cursor is on the handle) for (int i = drawingCanvas.GraphicsList.Count - 1; i >= 0; i--) { o = drawingCanvas[i]; if (o.IsSelected) { handleNumber = o.MakeHitTest(position); if (handleNumber > 0) { selectMode = SelectionMode.Size; // keep resized object in class member resizedObject = o; resizedObjectHandle = handleNumber; // Since we want to resize only one object, unselect all other objects HelperFunctions.UnselectAll(drawingCanvas); o.IsSelected = true; commandChangeState = new CommandChangeState(drawingCanvas); break; } } } // Test for move (cursor is on the object) if (selectMode == SelectionMode.None) { for (int i = drawingCanvas.GraphicsList.Count - 1; i >= 0; i--) { o = drawingCanvas[i]; if (o.MakeHitTest(position) == 0) { movedObject = o; break; } } if (movedObject != null) { selectMode = SelectionMode.Move; // Unselect all if Ctrl is not pressed and clicked object is not selected yet if (Keyboard.Modifiers != ModifierKeys.Control && !movedObject.IsSelected) { HelperFunctions.UnselectAll(drawingCanvas); } // Select clicked object movedObject.IsSelected = true; // Set move cursor drawingCanvas.Cursor = Cursors.SizeAll; commandChangeState = new CommandChangeState(drawingCanvas); } } // Click on background if (selectMode == SelectionMode.None) { // Unselect all if Ctrl is not pressed if (Keyboard.Modifiers != ModifierKeys.Control) { HelperFunctions.UnselectAll(drawingCanvas); } // Group selection. Create selection rectangle. GraphicsSelectionRectangle r = new GraphicsSelectionRectangle( position.X, position.Y, position.X + 1, position.Y + 1, drawingCanvas.ActualScale); //r.Clip = new RectangleGeometry(new Rect(0, 0, drawingCanvas.ActualWidth, drawingCanvas.ActualHeight)); drawingCanvas.GraphicsList.Add(r); selectMode = SelectionMode.GroupSelection; } lastPoint = position; // Capture mouse until MouseUp event is received drawingCanvas.CaptureMouse(); }