src/editmodes/drawMode.cpp

branch
projects
changeset 935
8d98ee0dc917
parent 933
f4c80d92e71e
equal deleted inserted replaced
930:ab77deb851fa 935:8d98ee0dc917
1 /*
2 * LDForge: LDraw parts authoring CAD
3 * Copyright (C) 2013 - 2015 Teemu Piippo
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19 #include <QPainter>
20 #include <QMouseEvent>
21 #include "drawMode.h"
22 #include "../ldObject.h"
23 #include "../glRenderer.h"
24 #include "../miscallenous.h"
25
26 DrawMode::DrawMode (GLRenderer* renderer) :
27 Super (renderer) {}
28
29 EditModeType DrawMode::type() const
30 {
31 return EditModeType::Draw;
32 }
33
34 void DrawMode::render (QPainter& painter) const
35 {
36 QVector<Vertex> poly;
37 QFontMetrics metrics = QFontMetrics (QFont());
38
39 for (Vertex const& vert : m_drawedVerts)
40 poly << vert;
41
42 // Draw the cursor vertex as the last one in the list.
43 if (poly.size() < 4)
44 poly << getCursorVertex();
45
46 renderPolygon (painter, poly, true, true);
47 }
48
49 bool DrawMode::preAddVertex (Vertex const& pos)
50 {
51 // If we picked an already-existing vertex, stop drawing
52 for (Vertex& vert : m_drawedVerts)
53 {
54 if (vert == pos)
55 {
56 endDraw();
57 return true;
58 }
59 }
60
61 return false;
62 }
63
64 bool DrawMode::mouseReleased (MouseEventData const& data)
65 {
66 if (Super::mouseReleased (data))
67 return true;
68
69 if (data.releasedButtons & Qt::LeftButton)
70 {
71 // If we have 4 verts, stop drawing.
72 if (m_drawedVerts.size() >= 4)
73 {
74 endDraw();
75 return true;
76 }
77
78 addDrawnVertex (getCursorVertex());
79 return true;
80 }
81
82 return false;
83 }
84
85 void DrawMode::endDraw()
86 {
87 // Clean the selection and create the object
88 QList<Vertex>& verts = m_drawedVerts;
89 LDObjectList objs;
90
91 switch (verts.size())
92 {
93 case 1:
94 return;
95
96 case 2:
97 {
98 // 2 verts - make a line
99 LDLinePtr obj = LDSpawn<LDLine> (verts[0], verts[1]);
100 obj->setColor (EdgeColor());
101 objs << obj;
102 break;
103 }
104
105 case 3:
106 case 4:
107 {
108 LDObjectPtr obj = (verts.size() == 3) ?
109 static_cast<LDObjectPtr> (LDSpawn<LDTriangle>()) :
110 static_cast<LDObjectPtr> (LDSpawn<LDQuad>());
111
112 obj->setColor (MainColor());
113
114 for (int i = 0; i < verts.size(); ++i)
115 obj->setVertex (i, verts[i]);
116
117 objs << obj;
118 break;
119 }
120 }
121
122 finishDraw (objs);
123 }
124
125 template<typename _Type>
126 _Type IntervalClamp (_Type a, _Type interval)
127 {
128 _Type remainder = a % interval;
129
130 if (remainder >= float (interval / 2))
131 a += interval;
132
133 a -= remainder;
134 return a;
135 }
136
137 Vertex DrawMode::getCursorVertex() const
138 {
139 Vertex result = renderer()->position3D();
140
141 if (renderer()->keyboardModifiers() & Qt::ControlModifier
142 and not m_drawedVerts.isEmpty())
143 {
144 Vertex const& v0 = m_drawedVerts.last();
145 Vertex const& v1 = result;
146 Axis relX, relY;
147
148 renderer()->getRelativeAxes (relX, relY);
149 QLineF ln (v0[relX], v0[relY], v1[relX], v1[relY]);
150 ln.setAngle (IntervalClamp<int> (ln.angle(), 45));
151 result.setCoordinate (relX, Grid::Snap (ln.x2(), Grid::Coordinate));
152 result.setCoordinate (relY, Grid::Snap (ln.y2(), Grid::Coordinate));
153 }
154
155 return result;
156 }

mercurial