private void SetSelectedRectangle(Point beginPoint, Point endPoint) { // Make sure x/y are top-left, and width/height is bottom-right Point a = Utils.Min(beginPoint, endPoint); Point b = Utils.Max(beginPoint, endPoint); var newRect = Rectangle.FromLTRB(a.X, a.Y, b.X, b.Y); // Determine if there is a need to update shapes if (selectedRectangle == newRect) { return; } // Update selected rectangle selectedRectangle = newRect; // Update selected shapes var shapes = Canvas.Instance.GetShapesByRectangle(selectedRectangle); ClickData.Clear(true); ClickData.Set(shapes); // Update borders of selected shapes // This may be needed Canvas.Instance.Invalidate(); }
private void OnMouseDown_HandleDragSelection(object sender, MouseEventArgs e, Point mouseLocation, Point snappedLocation, bool setShapes) { if (IsMouseOverSelectedRectangle(mouseLocation)) { if (setShapes) { var shapes = Canvas.Instance.GetShapesByRectangle(selectedRectangle); ClickData.Set(shapes); } mouseDownLocation = snappedLocation; ClickData.Set(snappedLocation, ShapeClickAction.Drag); selectedRectangleDownLocation = selectedRectangle.Location; action = SelectorAction.BeginMoveSelectedShapes; OnMouseMove(sender, e); } else { if (!MouseWasDown) { action = SelectorAction.BeginSelectionRectangle; mouseDownLocation = new Point(); selectedRectangleDownLocation = new Point(); ClickData.Clear(true); OnMouseDown(sender, e); } } }
private void ClearSelectedRectangle() { selectedRectangle = new Rectangle(); selectedRectangleDownLocation = new Point(); mouseDownLocation = new Point(); ClickData.Clear(true); action = SelectorAction.None; }
public override void OnMouseDown(object sender, MouseEventArgs e) { // Only run during initial press if (ClickData.Action != ShapeClickAction.None) { return; } using (GraphicsPath path = new GraphicsPath(FillMode.Alternate)) { var location = e.Location; ClickData.Origin = Grid.SnapToGrid(e.Location); var shape = Canvas.Instance.layer.GetShapeByPoint(path, location); switch (e.Button) { case MouseButtons.Right: SharedActions.RemoveShape(shape); break; case MouseButtons.Middle: if (shape != null && shape.Type == ShapeType.Triangle) { SharedActions.TriangleIncrementAngle(shape); } break; case MouseButtons.Left: bool createShape = true; if (!KeyboardController.IsShiftDown && shape != null) { var action = shape.GetShapeActionByPoint(path, location); if (action != ShapeClickAction.None) { ClickData.Set(action, shape); createShape = false; OnMouseMove(sender, e); } else { throw new InvalidOperationException( "Shape was found under Point, but action wasn't - This shouldn't happen." ); } } if (createShape) { var newSize = new Size(20, 20); var sizeSnapped = Grid.SnapToGrid(newSize, Grid.SnapSizeToGrid); GenerateShape(sizeSnapped); } break; } } Canvas.Instance.Invalidate(); }
public override void OnUnloadTool() { ClearSelectedRectangle(); ClickData.Clear(false); action = SelectorAction.None; if (OutlinePen != null) { OutlinePen.Dispose(); } }
/// <summary> /// Unloads the current tool and switches to the new tool, e.g. "SwitchToTool(new MainTool());" /// </summary> /// <param name="newTool">The tool to switch to. Usually "new SomeToolDerivedFromToolBase()"</param> internal static void SwitchToTool(ToolBase newTool) { if (Current != null) { Current.UnloadTool(); ClickData.Clear(true); Current = null; } Current = newTool; }
internal static void RemoveShape(Shape shape) { if (shape != null) { Canvas.Instance.layer.Remove(shape); ClickData.Action = ShapeClickAction.Delete; if (ClickData.IsShapesSingle() && ClickData.ContainsShapes(shape)) { ClickData.ClearShapes(); } } Canvas.Instance.Invalidate(); }
private void selectedShapeName_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { // When enter is pressed, set shape name and clear textbox focus if (e.KeyCode == Keys.Enter && m_prevSelectedShapeNameKey != e.KeyCode) { if (ClickData.IsShapesSingle()) { ClickData.Shapes[0].Nickname = selectedShapeNameTextBox.Text; } ClearFocus(); } m_prevSelectedShapeNameKey = e.KeyCode; }
public override void OnMouseUp(object sender, MouseEventArgs e) { if (ClickData.Action == ShapeClickAction.None) { return; } ClickData.ShapeApplyOffset(); // Reset click data ClickData.Clear(false); Canvas.Instance.Invalidate(); }
internal void Replace(Shape shape, Shape newShape) { // If the shape was selected, select replacement shape once created. bool wasShapeClicked = ClickData.ContainsShapes(shape); // Replace old shape with new shape var index = shapes.IndexOf(shape); shapes[index] = newShape; if (wasShapeClicked) { ClickData.Set(newShape); } }
public override void OnMouseMove(object sender, MouseEventArgs e) { if (e.Button != MouseButtons.Left) { return; } // Needed for KeyboardController Canvas.Instance.Focus(); // Todo: Copy over the moving mechanics a little better. ClickData.ShapeUpdateOffset(e.Location); Canvas.Instance.Invalidate(); }
public override void OnProcessKeys(KeyEventArgs e, bool isDown) { switch (e.KeyCode) { case Keys.Delete: if (!isDown && !ClickData.IsShapesEmpty() && Canvas.Instance.Focused) { foreach (Shape s in ClickData.Shapes) { SharedActions.RemoveShape(s); } } break; } }
public override void OnMouseUp(object sender, MouseEventArgs e) { var mouseLocation = e.Location; var snappedLocation = Grid.SnapToGrid(mouseLocation); switch (action) { case SelectorAction.BeginSelectionRectangle: // Redirect to MouseUp:EndSelectionRectangle action = SelectorAction.EndSelectionRectangle; OnMouseUp(sender, e); break; case SelectorAction.EndSelectionRectangle: SetSelectedRectangle(mouseDownLocation, mouseLocation); break; case SelectorAction.BeginMoveSelectedShapes: // Redirect to MouseUp:EndMoveSelectedShapes action = SelectorAction.EndMoveSelectedShapes; OnMouseUp(sender, e); break; case SelectorAction.EndMoveSelectedShapes: ClickData.ShapeApplyOffset(); // Reset click data ClickData.Clear(false); selectedRectangleDownLocation = new Point(); mouseDownLocation = new Point(); break; case SelectorAction.None: break; default: throw EnumNotImplementedException.Throw(action, ExceptionMessages.MSG_NOT_YET_IMPLEMENTED); } Canvas.Instance.Invalidate(); }
private void GenerateShape(Size size) { var layer = Canvas.Instance.layer; // Generate shape based on either a duplicate or a new shape Shape shape; if (!ClickData.IsShapesEmpty() && KeyboardController.IsControlDown) { shape = layer.DuplicateShape(ClickData.Shapes[0], ClickData.Origin); } else { shape = layer.AddNewShape(ClickData.Origin, size, Canvas.Instance.GetSelectedColor(), Canvas.Instance.GetSelectedShapeType() ); } // Force new shape to go into resize mode. ClickData.Set(ShapeClickAction.Resize, shape); }
private static bool ExportToImage(string path) { bool result = true; ClickData.Clear(true); Canvas canvas = Canvas.Instance; // Hide borders when saving image var prevBorder = canvas.BorderStyle; canvas.BorderStyle = BorderStyle.None; IsExportingImage = true; canvas.Invalidate(); var bounds = canvas.layer.GetAllShapesBoundary(); ImageFormat imageFormat = Utils.GetImageFormatByExtension(path); if (bounds.Width == 0 && bounds.Height == 0) { MessageBox.Show("Nothing to save. Try placing some shapes before exporting to image."); result = false; } using (var bitmap = new Bitmap(bounds.Width, bounds.Height)) { canvas.DrawToBitmap(bitmap, bounds); bitmap.Save(path, imageFormat); } // Restore border canvas.BorderStyle = prevBorder; IsExportingImage = false; canvas.Invalidate(); return(result); }
public override void OnMouseMove(object sender, MouseEventArgs e) { if (e.Button != MouseButtons.Left) { return; } var mouseLocation = e.Location; var snappedLocation = Grid.SnapToGrid(mouseLocation); switch (action) { case SelectorAction.BeginSelectionRectangle: SetSelectedRectangle(mouseDownLocation, snappedLocation); break; case SelectorAction.BeginMoveSelectedShapes: Canvas.Instance.Focus(); ClickData.Set(ShapeClickAction.Drag); ClickData.ShapeUpdateOffset(snappedLocation); Point moveTo = new Point( snappedLocation.X - mouseDownLocation.X, snappedLocation.Y - mouseDownLocation.Y ); selectedRectangle.X = selectedRectangleDownLocation.X + moveTo.X; selectedRectangle.Y = selectedRectangleDownLocation.Y + moveTo.Y; break; default: throw EnumNotImplementedException.Throw(action, ExceptionMessages.MSG_NOT_YET_IMPLEMENTED); } Canvas.Instance.Invalidate(); }
/// <summary> /// If ClickData's "Shapes" contains this shape, return true. /// </summary> public bool ShapeIsSelected() { return(ClickData.ContainsShapes(this)); }
private static void ProcessKeys(KeyEventArgs e, bool isDown) { switch (e.KeyCode) { // Escape from any unsupported keys case Keys.None: default: break; case Keys.R: if (!isDown && !ClickData.IsShapesEmpty() && Canvas.Instance.Focused) { foreach (var s in ClickData.Shapes) { s.Height = s.Width; } } break; case Keys.PageUp: if (!isDown && !ClickData.IsShapesEmpty() && Canvas.Instance.Focused) { foreach (var s in ClickData.Shapes) { Canvas.Instance.layer.MoveShapeUp(s); } } break; case Keys.PageDown: if (!isDown && !ClickData.IsShapesEmpty() && Canvas.Instance.Focused) { foreach (var s in ClickData.Shapes) { Canvas.Instance.layer.MoveShapeDown(s); } } break; case Keys.M: IsMoveDown = isDown && Canvas.Instance.Focused; break; case Keys.P: if (isDown) { ToolBase.SwitchToTool(new MainTool()); } break; case Keys.E: if (isDown) { ToolBase.SwitchToTool(new EraserTool()); } break; case Keys.S: if (isDown) { ToolBase.SwitchToTool(new SelectorTool()); } break; case Keys.ControlKey: IsControlDown = isDown; break; case Keys.A: ShowAllBordersDown = isDown; break; case Keys.ShiftKey: IsShiftDown = isDown; break; case Keys.OemQuestion: Debug.Show(); break; } ToolBase.Current.ProcessKeys(e, isDown); // Invalidate Canvas if it was a new key input if (!(m_prevKey == e.KeyCode && m_prevIsDown == isDown)) { Canvas.Instance.Invalidate(); } m_prevKey = e.KeyCode; m_prevIsDown = isDown; }