-
Notifications
You must be signed in to change notification settings - Fork 1
/
ShapeControlPainter.cpp
111 lines (90 loc) · 3.84 KB
/
ShapeControlPainter.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*
* ShapeControlPainter.cpp
*
* (c) 2013 Sofian Audry -- info(@)sofianaudry(.)com
* (c) 2013 Alexandre Quessy -- alexandre(@)quessy(.)net
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "ShapeControlPainter.h"
namespace mmp {
ShapeControlPainter::ShapeControlPainter(ShapeGraphicsItem* shapeItem)
: _shapeItem(shapeItem)
{}
MShape::ptr ShapeControlPainter::getShape() const { return _shapeItem->getShape(); }
void ShapeControlPainter::paint(QPainter *painter, MapperGLCanvas* canvas, const QList<int>& selectedVertices)
{
paintShape(painter, canvas);
_paintVertices(painter, canvas, selectedVertices);
}
void ShapeControlPainter::_paintVertices(QPainter *painter, MapperGLCanvas* canvas, const QList<int>& selectedVertices)
{
qreal zoomFactor = canvas->getZoomFactor();
qreal selectRadius = (getShape()->isLocked() ? MM::VERTEX_LOCKED_RADIUS : MM::VERTEX_SELECT_RADIUS) / zoomFactor;
qreal strokeWidth = MM::VERTEX_SELECT_STROKE_WIDTH / zoomFactor;
for (int i=0; i<getShape()->nVertices(); i++)
Util::drawControlsVertex(painter, getShape()->getVertex(i), selectedVertices.contains(i), getShape()->isLocked(), selectRadius, strokeWidth);
}
QPen ShapeControlPainter::getRescaledShapeStroke(MapperGLCanvas* canvas, bool selected, bool innerStroke)
{
const QBrush& brush =
(selected ?
(getShape()->isLocked() ? QBrush(MM::CONTROL_LOCKED_COLOR) : QBrush(MM::CONTROL_COLOR)) :
QBrush(MM::CONTROL_COLOR_NON_SELECTED));
return QPen(brush,
(innerStroke ? MM::SHAPE_INNER_STROKE_WIDTH : MM::SHAPE_STROKE_WIDTH) / canvas->getZoomFactor());
}
void PolygonControlPainter::paintShape(QPainter *painter, MapperGLCanvas* canvas, bool selected)
{
Polygon* poly = static_cast<Polygon*>(getShape().data());
Q_ASSERT(poly);
// Init colors and stroke.
painter->setPen(getRescaledShapeStroke(canvas, selected));
painter->setBrush(Qt::NoBrush);
// Draw inner quads.
painter->drawPolygon(poly->toPolygon());
}
void EllipseControlPainter::paintShape(QPainter *painter, MapperGLCanvas* canvas, bool selected)
{
Ellipse* ellipse = static_cast<Ellipse*>(getShape().data());
Q_ASSERT(ellipse);
// Init colors and stroke.
painter->setPen(getRescaledShapeStroke(canvas, selected));
painter->setBrush(Qt::NoBrush);
// Draw ellipse contour.
QPainterPath path;
QTransform transform;
transform.translate(ellipse->getCenter().x(), ellipse->getCenter().y());
transform.rotate(ellipse->getRotation());
path.addEllipse(QPoint(0,0), ellipse->getHorizontalRadius(), ellipse->getVerticalRadius());
painter->drawPath(transform.map(path));
}
void MeshControlPainter::paintShape(QPainter *painter, MapperGLCanvas* canvas, bool selected)
{
Mesh* mesh = static_cast<Mesh*>(getShape().data());
Q_ASSERT(mesh);
// Init colors and stroke.
painter->setPen(getRescaledShapeStroke(canvas, selected, true));
painter->setBrush(Qt::NoBrush);
// Draw inner quads.
QVector<Quad::ptr> quads = mesh->getQuads();
for (QVector<Quad::ptr>::const_iterator it = quads.begin(); it != quads.end(); ++it)
{
painter->drawPolygon((*it)->toPolygon());
}
// Draw outer quad.
painter->setPen(getRescaledShapeStroke(canvas, selected));
painter->drawPolygon(_shapeItem->mapFromScene(mesh->toPolygon()));
}
}