Subversion Repositories AndroidProjects

Rev

Rev 1408 | Blame | Compare with Previous | Last modification | View Log | RSS feed

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using ShapeEditor.file.shapes;

namespace ShapeEditor.interaction
{
    public class SelectMode : InteractionMode
    {
        private bool mLeftButtonDown = false;

        private int mLastX = 0;
        private int mLastY = 0;

        private BaseShapeElement mSelectedElement = null;
        private bool mMoveEntireObject = false;
        private int mSelectedHandle = -1;

        public SelectMode(MainForm parent)
            : base(parent, InteractionMode.SELECT)
        {
        }

        public override void MouseMove(MouseEventArgs e, bool isMouseDown = false)
        {
            mSelectedElement = mParent.CurrentDoc.GetSelectedElement();

            if (mSelectedElement == null)
                return;

            float offsetX = mParent.CurrentDoc.Sprite.transform.x;
            float offsetY = mParent.CurrentDoc.Sprite.transform.y;

            if (e.Button == MouseButtons.Left)
            {
                if (!mLeftButtonDown)
                {
                    // mouse down
                    if (mSelectedElement.FindHandleAt(e.X, e.Y) == -1)
                    {
                        // priority to current selection's handles
                        mSelectedElement = mParent.CurrentDoc.SelectAt(e.X, e.Y);
                        if (mSelectedElement == null)
                            return;
                    }

                    mLeftButtonDown = true;
                    mSelectedHandle = mSelectedElement.FindHandleAt(e.X, e.Y);
                    if (mSelectedHandle != -1)
                    {
                        mMoveEntireObject = false;
                        mParent.GlView.Cursor = mSelectedElement.GetCursor(mSelectedHandle);
                    }
                    else if (mSelectedElement.IsInside(e.X, e.Y))
                    {
                        mMoveEntireObject = true;
                        mParent.GlView.Cursor = Cursors.SizeAll;
                    }
                }
                else
                {
                    // mouse drag
                    int dx = e.X - mLastX;
                    int dy = e.Y - mLastY;

                    if (mSelectedHandle != -1)
                    {
                        mSelectedElement.DragHandle(mSelectedHandle, dx, dy);
                    }
                    else if (mMoveEntireObject)
                    {
                        mSelectedElement.DragMove(dx, dy);
                    }
                }
            }
            else if (e.Button == MouseButtons.None)
            {
                int handle = mSelectedElement.FindHandleAt(e.X, e.Y);
                if (handle != -1)
                {
                    mParent.GlView.Cursor = mSelectedElement.GetCursor(handle);
                }
                else if (mSelectedElement.IsInside(e.X, e.Y))
                {
                    mParent.GlView.Cursor = Cursors.SizeAll;
                }
                else
                {
                    mParent.GlView.Cursor = Cursors.Arrow;
                }
            }

            mLastX = e.X;
            mLastY = e.Y;
        }

        public override void MouseUp(MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                if (mSelectedElement != null)
                {
                    mSelectedElement.FixCoordinates();
                }

                mLeftButtonDown = false;
                mSelectedHandle = -1;
                mMoveEntireObject = false;
            }

            mSelectedHandle = -1;
        }

        public override void Render()
        {
        }
    }
}