diff -r ac5c1f691ce2 -r 61f160dfd0f1 QTfrontend/drawmapscene.cpp --- a/QTfrontend/drawmapscene.cpp Tue Oct 15 23:07:22 2013 +0400 +++ b/QTfrontend/drawmapscene.cpp Fri Oct 18 15:26:43 2013 +0400 @@ -20,6 +20,7 @@ #include #include #include +#include #include "drawmapscene.h" @@ -44,6 +45,8 @@ setBackgroundBrush(m_eraser); m_isErasing = false; + m_pathType = Polyline; + m_pen.setWidth(76); m_pen.setJoinStyle(Qt::RoundJoin); m_pen.setCapStyle(Qt::RoundCap); @@ -61,18 +64,41 @@ { QPainterPath path = m_currPath->path(); - if(mouseEvent->modifiers() & Qt::ControlModifier) + switch (m_pathType) { - int c = path.elementCount(); - QPointF pos = mouseEvent->scenePos(); - path.setElementPositionAt(c - 1, pos.x(), pos.y()); + case Polyline: + if(mouseEvent->modifiers() & Qt::ControlModifier) + { + int c = path.elementCount(); + QPointF pos = mouseEvent->scenePos(); + path.setElementPositionAt(c - 1, pos.x(), pos.y()); + } + else + { + path.lineTo(mouseEvent->scenePos()); + paths.first().points.append(mouseEvent->scenePos().toPoint()); + } + break; + case Rectangle: { + path = QPainterPath(); + QPointF p1 = paths.first().initialPoint; + QPointF p2 = mouseEvent->scenePos(); + path.moveTo(p1); + path.lineTo(p1.x(), p2.y()); + path.lineTo(p2); + path.lineTo(p2.x(), p1.y()); + path.lineTo(p1); + break; + } + case Ellipse: { + path = QPainterPath(); + QList points = makeEllipse(paths.first().initialPoint, mouseEvent->scenePos()); + path.addPolygon(QPolygonF(QVector::fromList(points))); + break; } - else - { - path.lineTo(mouseEvent->scenePos()); - paths.first().points.append(mouseEvent->scenePos().toPoint()); } + m_currPath->setPath(path); emit pathChanged(); @@ -96,7 +122,8 @@ PathParams params; params.width = serializePenWidth(m_pen.width()); params.erasing = m_isErasing; - params.points = QList() << mouseEvent->scenePos().toPoint(); + params.initialPoint = mouseEvent->scenePos().toPoint(); + params.points = QList() << params.initialPoint; paths.prepend(params); m_currPath->setPath(path); @@ -107,10 +134,33 @@ { if (m_currPath) { - QPainterPath path = m_currPath->path(); - path.lineTo(mouseEvent->scenePos()); - paths.first().points.append(mouseEvent->scenePos().toPoint()); - m_currPath->setPath(path); + switch (m_pathType) + { + case Polyline: { + QPainterPath path = m_currPath->path(); + path.lineTo(mouseEvent->scenePos()); + paths.first().points.append(mouseEvent->scenePos().toPoint()); + m_currPath->setPath(path); + break; + } + case Rectangle: { + QPoint p1 = paths.first().initialPoint; + QPoint p2 = mouseEvent->scenePos().toPoint(); + QList rpoints; + rpoints << p1 << QPoint(p1.x(), p2.y()) << p2 << QPoint(p2.x(), p1.y()) << p1; + paths.first().points = rpoints; + break; + } + case Ellipse: + QPoint p1 = paths.first().initialPoint; + QPoint p2 = mouseEvent->scenePos().toPoint(); + QList points = makeEllipse(p1, p2); + QList epoints; + foreach(const QPointF & p, points) + epoints.append(p.toPoint()); + paths.first().points = epoints; + break; + } simplifyLast(); @@ -383,3 +433,29 @@ { return width * 10 + 6; } + +void DrawMapScene::setPathType(PathType pathType) +{ + m_pathType = pathType; +} + +QList DrawMapScene::makeEllipse(const QPointF ¢er, const QPointF &corner) +{ + QList l; + qreal r = (center - corner).manhattanLength(); + qreal rx = qAbs(center.x() - corner.x()); + qreal ry = qAbs(center.y() - corner.y()); + + if(r < 4) + { + l.append(center); + } else + { + qreal angleDelta = 12 / r; + for(qreal angle = 0.0; angle < 2*M_PI; angle += angleDelta) + l.append(center + QPointF(rx * cos(angle), ry * sin(angle))); + l.append(l.first()); + } + + return l; +}