Beispiel #1
0
        private static void SetResizingMouseCursor(ResizeClickPosition clickPos)
        {
            Cursor newCursor = null;

            switch (clickPos)
            {
            case ResizeClickPosition.Left:
            case ResizeClickPosition.Right:
                newCursor = Cursors.SizeWE;
                break;

            case ResizeClickPosition.Top:
            case ResizeClickPosition.Bottom:
                newCursor = Cursors.SizeNS;
                break;

            case ResizeClickPosition.LeftTop:
            case ResizeClickPosition.RightBottom:
                newCursor = Cursors.SizeNWSE;
                break;

            case ResizeClickPosition.RightTop:
            case ResizeClickPosition.LeftBottom:
                newCursor = Cursors.SizeNESW;
                break;
            }

            if (Mouse.OverrideCursor != newCursor)
            {
                Mouse.OverrideCursor = newCursor;
            }
        }
Beispiel #2
0
        /// <summary>
        /// Start dragging
        /// </summary>
        /// <param name="e"></param>
        protected override void OnPreviewMouseLeftButtonDown(MouseButtonEventArgs e)
        {
            if (_isBeingDragged)
            {
                return;
            }

            base.OnPreviewMouseLeftButtonDown(e);
            if (_selectedElement == null)
            {
                return;
            }

            _dragStartCursorPos = e.GetPosition(this);
            double x = GetLeft(_selectedElement);
            double y = GetTop(_selectedElement);

            switch (Mode)
            {
            case DragMode.Move:
                _dragStartElementPos = new Point(x, y);
                SetMovingMouseCursor();
                break;

            case DragMode.Resize:
                _dragStartElementRect = new Rect(x, y, _selectedElement.Width, _selectedElement.Height);
                _resizeClickPos       = DetectResizeClickPosition(_dragStartCursorPos, _dragStartElementRect);
                SetResizingMouseCursor(_resizeClickPos);
                break;
            }

            _selectedElement.CaptureMouse();

            _isBeingDragged = true;
            e.Handled       = true;
        }
Beispiel #3
0
        private static Rect CalcNewSize(Point cursorStart, Point cursorNow, Rect elementRect, ResizeClickPosition clickPos)
        {
            const int MinLineLen = 16;

            // Do not touch Width and Height if border was not clicked
            switch (clickPos)
            {
            case ResizeClickPosition.Inside:
            case ResizeClickPosition.Outside:
                return(elementRect);
            }

            // Get delta of X and Y
            double xDelta = cursorNow.X - cursorStart.X;
            double yDelta = cursorNow.Y - cursorStart.Y;

            // Prepare variables
            double x      = elementRect.X;
            double y      = elementRect.Y;
            double width  = elementRect.Width;
            double height = elementRect.Height;

            // X Direction
            switch (clickPos)
            {
            case ResizeClickPosition.Left:
            case ResizeClickPosition.LeftTop:
            case ResizeClickPosition.LeftBottom:
                if (Math.Abs(xDelta) < double.Epsilon)
                {
                    break;
                }
                if (0 < xDelta)
                {     // L [->    ] R, delta is positive
                    if (xDelta + MinLineLen < width)
                    {
                        x     += xDelta;
                        width -= xDelta;
                    }
                    else
                    {     // Guard
                        x    += width - MinLineLen;
                        width = MinLineLen;
                    }
                }
                else
                {     // L <-[    ] R, delta is negative
                    x     += xDelta;
                    width -= xDelta;
                }
                break;

            case ResizeClickPosition.Right:
            case ResizeClickPosition.RightTop:
            case ResizeClickPosition.RightBottom:
                if (Math.Abs(xDelta) < double.Epsilon)
                {
                    break;
                }
                if (0 < xDelta)
                {     // L [    ]-> R, delta is positive
                    width += xDelta;
                }
                else
                {                                    // L [    <-] R, delta is negative
                    if (MinLineLen < width + xDelta) // Guard
                    {
                        width += xDelta;
                    }
                    else
                    {
                        width = MinLineLen;
                    }
                }
                break;
            }

            // Y Direction
            switch (clickPos)
            {
            case ResizeClickPosition.Top:
            case ResizeClickPosition.LeftTop:
            case ResizeClickPosition.RightTop:
                if (Math.Abs(yDelta) < double.Epsilon)
                {
                    break;
                }
                if (0 < yDelta)
                {     // T [->    ] B, delta is positive
                    if (yDelta + MinLineLen < height)
                    {
                        y      += yDelta;
                        height -= yDelta;
                    }
                    else
                    {     // Guard
                        y     += height - MinLineLen;
                        height = MinLineLen;
                    }
                }
                else
                {     // T <-[    ] B, delta is negative
                    y      += yDelta;
                    height -= yDelta;
                }
                break;

            case ResizeClickPosition.Bottom:
            case ResizeClickPosition.LeftBottom:
            case ResizeClickPosition.RightBottom:
                if (Math.Abs(yDelta) < double.Epsilon)
                {
                    break;
                }
                if (0 < yDelta)
                {     // T [    ]-> B, delta is positive
                    height += yDelta;
                }
                else
                {                                     // T [    <-] B, delta is negative
                    if (MinLineLen < height + yDelta) // Guard
                    {
                        height += yDelta;
                    }
                    else
                    {
                        height = MinLineLen;
                    }
                }
                break;
            }

            // Check if X and Width is correct
            switch (clickPos)
            {
            case ResizeClickPosition.Left:
            case ResizeClickPosition.LeftTop:
            case ResizeClickPosition.LeftBottom:
                if (x < 0)
                {
                    width += x;
                    x      = 0;
                }
                break;

            case ResizeClickPosition.Right:
            case ResizeClickPosition.RightTop:
            case ResizeClickPosition.RightBottom:
                if (CanvasWidthHeightLimit + ElementWidthHeightLimit < x + width)
                {
                    width = CanvasWidthHeightLimit + ElementWidthHeightLimit - x;
                }
                break;
            }

            // Check if Y and Height is correct
            switch (clickPos)
            {
            case ResizeClickPosition.Top:
            case ResizeClickPosition.LeftTop:
            case ResizeClickPosition.RightTop:
                if (y < 0)
                {
                    height += y;
                    y       = 0;
                }
                break;

            case ResizeClickPosition.Bottom:
            case ResizeClickPosition.LeftBottom:
            case ResizeClickPosition.RightBottom:
                if (CanvasWidthHeightLimit + ElementWidthHeightLimit < y + height)
                {
                    height = CanvasWidthHeightLimit + ElementWidthHeightLimit - y;
                }
                break;
            }

            return(new Rect(x, y, width, height));
        }