예제 #1
0
        protected internal override void OnMouseMove(object sender, MouseEventArgs e)
        {
            base.OnMouseMove(sender, e);
            if (canvas.IsResizing || canvas.Layers[canvas.SelectedLayer].Locked)
            {
                return;
            }

            var query = canvas.SelectedLayer
                        .Where(x =>
                               x.Contains(new PointF(e.X / canvas.ZoomFactor, e.Y / canvas.ZoomFactor)))
                        .OrderBy(x => x.Z)
                        .LastOrDefault();

            DragHandle handleQuery = null;

            if (query != null)
            {
                if (!_moving)
                {
                    canvas.Cursor = Cursors.Hand;
                }
            }
            else
            {
                if (handleQuery == null)
                {
                    canvas.Cursor = Cursors.Default;
                }
            }

            if (Target != null && Target.Selected && !_resizing)
            {
                handleQuery = Target.Bounds.DragHandles
                              .Where(x => x.Contains(new PointF(e.X / canvas.ZoomFactor, e.Y / canvas.ZoomFactor)))
                              .LastOrDefault();

                if (handleQuery != null)
                {
                    _resizeHandle = handleQuery;

                    canvas.Cursor = resizeCursorMap[handleQuery.Anchor];
                }
            }

            if (_moving)
            {
                var deltaX = e.X / canvas.ZoomFactor - Position1.X;
                var deltaY = e.Y / canvas.ZoomFactor - Position1.Y;

                Target.Move(deltaX, deltaY, canvas.Size);
                Position1 = e.Location;
                canvas.Invalidate();
            }
            else if (_resizing)
            {
                var nextPosition = PointF.Empty;
                switch (_resizeHandle.Anchor)
                {
                case DragHandleAnchor.BottomCenter:
                case DragHandleAnchor.TopCenter:
                    if (_fixedX == null)
                    {
                        _fixedX = Target.Bounds.Right;
                    }
                    nextPosition = new PointF((float)_fixedX, e.Y / canvas.ZoomFactor);
                    break;

                case DragHandleAnchor.MiddleLeft:
                case DragHandleAnchor.MiddleRight:
                    if (_fixedY == null)
                    {
                        _fixedY = Target.Bounds.Right;
                    }
                    nextPosition = new PointF(e.X / canvas.ZoomFactor, (float)_fixedY);
                    break;

                default:
                    nextPosition = new PointF(e.X / canvas.ZoomFactor, e.Y / canvas.ZoomFactor);
                    break;
                }

                Target.Bounds = new Boundary(Position1, nextPosition);
                canvas.Invalidate();
            }
        }