From 80f48f739dc6c5df742ef18eb40828c09fff5f2b Mon Sep 17 00:00:00 2001 From: Anatoly Mihalchenko Date: Mon, 22 Aug 2011 15:02:07 +0300 Subject: [PATCH] Triangle Graphics tool - drawing possibility --- src/tools/UBGraphicsTriangle.cpp | 121 +++++++++++++++++++++++++------ src/tools/UBGraphicsTriangle.h | 7 +- 2 files changed, 105 insertions(+), 23 deletions(-) diff --git a/src/tools/UBGraphicsTriangle.cpp b/src/tools/UBGraphicsTriangle.cpp index 44c504f2..90fde242 100644 --- a/src/tools/UBGraphicsTriangle.cpp +++ b/src/tools/UBGraphicsTriangle.cpp @@ -130,26 +130,27 @@ void UBGraphicsTriangle::calculatePoints(const QRectF& r) { switch(mOrientation) { - case BottomLeft: - A1.setX(r.left()); A1.setY(r.top()); - B1.setX(r.left()); B1.setY(r.bottom()); - C1.setX(r.right()); C1.setY(r.bottom()); - break; - case TopLeft: - A1.setX(r.left()); A1.setY(r.bottom()); - B1.setX(r.left()); B1.setY(r.top()); - C1.setX(r.right()); C1.setY(r.top()); - break; - case TopRight: - A1.setX(r.right()); A1.setY(r.bottom()); - B1.setX(r.right()); B1.setY(r.top()); - C1.setX(r.left()); C1.setY(r.top()); - break; - case BottomRight: - A1.setX(r.right()); A1.setY(r.top()); - B1.setX(r.right()); B1.setY(r.bottom()); - C1.setX(r.left()); C1.setY(r.bottom()); - break; + + case BottomLeft: + A1.setX(r.left()); A1.setY(r.top()); + B1.setX(r.left()); B1.setY(r.bottom()); + C1.setX(r.right()); C1.setY(r.bottom()); + break; + case TopLeft: + A1.setX(r.left()); A1.setY(r.bottom()); + B1.setX(r.left()); B1.setY(r.top()); + C1.setX(r.right()); C1.setY(r.top()); + break; + case TopRight: + A1.setX(r.right()); A1.setY(r.bottom()); + B1.setX(r.right()); B1.setY(r.top()); + C1.setX(r.left()); C1.setY(r.top()); + break; + case BottomRight: + A1.setX(r.right()); A1.setY(r.top()); + B1.setX(r.right()); B1.setY(r.bottom()); + C1.setX(r.left()); C1.setY(r.bottom()); + break; } C = sqrt(rect().width() * rect().width() + rect().height() * rect().height()); @@ -267,6 +268,22 @@ void UBGraphicsTriangle::paint(QPainter *painter, const QStyleOptionGraphicsItem } } +QPainterPath UBGraphicsTriangle::shape() const +{ + QPainterPath tShape; + QPolygonF tPolygon; + + tPolygon << A1 << B1 << C1; + tShape.addPolygon(tPolygon); + tPolygon.clear(); + + tPolygon << A2 << B2 << C2; + tShape.addPolygon(tPolygon); + tPolygon.clear(); + + return tShape; +} + void UBGraphicsTriangle::paintGraduations(QPainter *painter) { const int centimeterGraduationHeight = 15; @@ -744,8 +761,7 @@ void UBGraphicsTriangle::hoverEnterEvent(QGraphicsSceneHoverEvent *event) { UBStylusTool::Enum currentTool = (UBStylusTool::Enum)UBDrawingController::drawingController ()->stylusTool (); - if (currentTool == UBStylusTool::Selector) - { + if (currentTool == UBStylusTool::Selector) { mCloseSvgItem->setParentItem(this); mShowButtons = true; @@ -770,6 +786,11 @@ void UBGraphicsTriangle::hoverEnterEvent(QGraphicsSceneHoverEvent *event) event->accept(); update(); + + } else if (UBDrawingController::drawingController()->isDrawingTool()) { + setCursor(drawRulerLineCursor()); + UBDrawingController::drawingController()->mActiveRuler = this; + event->accept(); } } @@ -813,3 +834,59 @@ void UBGraphicsTriangle::hoverMoveEvent(QGraphicsSceneHoverEvent *event) event->accept(); } } +void UBGraphicsTriangle::StartLine(const QPointF &scenePos, qreal width) +{ + qDebug() << "morientation" << mOrientation; + //qDebug() << "triangle rect()" << rect(); + + QPointF itemPos = mapFromScene(scenePos); + + qreal y; + + if (mOrientation == 0 || mOrientation == 1) { + y = rect().y() + rect().height() + width / 2; + } else if (mOrientation == 2 || mOrientation == 3) { + y = rect().y() - width / 2; + } + + if (itemPos.x() < rect().x() + sLeftEdgeMargin) + itemPos.setX(rect().x() + sLeftEdgeMargin); + if (itemPos.x() > rect().x() + rect().width() - sLeftEdgeMargin) + itemPos.setX(rect().x() + rect().width() - sLeftEdgeMargin); + + itemPos.setY(y); + itemPos = mapToScene(itemPos); + + scene()->moveTo(itemPos); + scene()->drawLineTo(itemPos, width, true); +} + +void UBGraphicsTriangle::DrawLine(const QPointF &scenePos, qreal width) +{ + QPointF itemPos = mapFromScene(scenePos); + + qreal y; + + if (mOrientation == 0 || mOrientation == 1) { + y = rect().y() + rect().height() + width / 2; + } else if (mOrientation == 2 || mOrientation == 3) { + y = rect().y() - width / 2; + } + + if (itemPos.x() < rect().x() + sLeftEdgeMargin) + itemPos.setX(rect().x() + sLeftEdgeMargin); + if (itemPos.x() > rect().x() + rect().width() - sLeftEdgeMargin) + itemPos.setX(rect().x() + rect().width() - sLeftEdgeMargin); + + itemPos.setY(y); + itemPos = mapToScene(itemPos); + + // We have to use "pointed" line for marker tool + scene()->drawLineTo(itemPos, width, + UBDrawingController::drawingController()->stylusTool() != UBStylusTool::Marker); +} + +void UBGraphicsTriangle::EndLine() +{ +} + diff --git a/src/tools/UBGraphicsTriangle.h b/src/tools/UBGraphicsTriangle.h index e541a280..dc61e05c 100644 --- a/src/tools/UBGraphicsTriangle.h +++ b/src/tools/UBGraphicsTriangle.h @@ -30,7 +30,7 @@ class UBItem; class UBGraphicsTriangle : public UBAbstractDrawRuler, public QGraphicsPolygonItem, public UBItem { - Q_OBJECT; + Q_OBJECT public: UBGraphicsTriangle(); @@ -46,6 +46,10 @@ class UBGraphicsTriangle : public UBAbstractDrawRuler, public QGraphicsPolygonIt virtual UBItem* deepCopy(void) const; + virtual void StartLine(const QPointF& scenePos, qreal width); + virtual void DrawLine(const QPointF& position, qreal width); + virtual void EndLine(); + enum UBGraphicsTriangleOrientation { BottomLeft = 0, @@ -77,6 +81,7 @@ class UBGraphicsTriangle : public UBAbstractDrawRuler, public QGraphicsPolygonIt void updateResizeCursor(); virtual void paint (QPainter *painter, const QStyleOptionGraphicsItem *styleOption, QWidget *widget); + virtual QPainterPath shape() const; virtual void rotateAroundCenter(qreal angle);