Subversion Repositories AndroidProjects

Rev

Rev 1419 | Rev 1421 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1399 chris 1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Text;
5
using System.Threading.Tasks;
6
using System.Windows.Forms;
7
 
1418 chris 8
using BauzoidNET.math;
9
using BauzoidNET.graphics;
10
 
1399 chris 11
namespace ShapeEditor.interaction
12
{
13
    public class PolygonMode : InteractionMode
14
    {
1418 chris 15
        public static readonly Vector4 RECTANGLE_CREATE_COLOR = new Vector4(0.6f, 0.6f, 0.6f, 1.0f);
1399 chris 16
 
1418 chris 17
        public const int CLOSING_THRESHOLD = 2;
18
 
19
        private int mLastX = 0;
20
        private int mLastY = 0;
21
        private bool mLeftButtonDown = false;
22
 
23
        private List<Vector2> mVertices = new List<Vector2>();
24
 
1399 chris 25
        public PolygonMode(MainForm parent)
1404 chris 26
            : base(parent, InteractionMode.POLYGON)
1399 chris 27
        {
28
        }
29
 
1420 chris 30
        public override void MouseMove(MouseEventArgs e, bool isMouseDown = false)
1399 chris 31
        {
1418 chris 32
            if (e.Button == MouseButtons.Left)
33
            {
34
                if (!mLeftButtonDown)
35
                {
36
                    // just pressed
37
 
38
                    // if coordinates are last ones, close
1420 chris 39
                    if (mVertices.Count >= 3)
1418 chris 40
                    {
41
                        Vector2 first = mVertices.First();
42
                        if ((Math.Abs(first.x - e.X) <= CLOSING_THRESHOLD) && (Math.Abs(first.x - e.X) <= CLOSING_THRESHOLD))
43
                        {
44
                            // close polygon
45
 
1419 chris 46
                            mParent.CurrentDoc.AddPolygon(mVertices);
1418 chris 47
 
48
                            mVertices.Clear();
49
                            return;
50
                        }
51
                    }
52
 
1420 chris 53
                    if (isMouseDown)
54
                    {
55
                        mVertices.Add(new Vector2(e.X, e.Y));
56
                        mLeftButtonDown = true;
57
                    }
1418 chris 58
                }
59
                else
60
                {
61
                    // dragging
62
                    mVertices.Last().set(e.X, e.Y);
63
                }
64
            }
65
 
1420 chris 66
            if ((mVertices.Count >= 3) &&
67
                ((Math.Abs(mVertices.First().x - e.X) <= CLOSING_THRESHOLD) && (Math.Abs(mVertices.First().x - e.X) <= CLOSING_THRESHOLD)))
1418 chris 68
            {
1420 chris 69
                mParent.GlView.Cursor = Cursors.Hand;
1418 chris 70
            }
1420 chris 71
            else
72
            {
73
                mParent.GlView.Cursor = Cursors.Cross;
74
            }
1418 chris 75
 
76
            mLastX = e.X;
77
            mLastY = e.Y;
1399 chris 78
        }
79
 
80
        public override void MouseUp(MouseEventArgs e)
81
        {
1418 chris 82
            if (e.Button == MouseButtons.Left)
83
            {
84
                if (mLeftButtonDown)
85
                {
86
                    mVertices.Last().set(e.X, e.Y);
87
                    mLeftButtonDown = false;
88
                }
89
            }
1399 chris 90
        }
1400 chris 91
 
92
        public override void Render()
93
        {
1418 chris 94
            for (int i = 0; i < (mVertices.Count-1); i++)
95
            {
96
                Vector2 a = mVertices.ElementAt(i);
97
                Vector2 b = mVertices.ElementAt(i+1);
98
                RenderUtil.drawLine(MainForm.App.getGraphics(), a.x, a.y, b.x, b.y, RECTANGLE_CREATE_COLOR);
99
            }
100
 
101
            if (mVertices.Count > 0)
102
            {
103
                Vector2 a = mVertices.Last();
104
                RenderUtil.drawLine(MainForm.App.getGraphics(), a.x, a.y, mLastX, mLastY, RECTANGLE_CREATE_COLOR);
105
            }
1400 chris 106
        }
1399 chris 107
    }
108
}