From 2491e7e33d3ab52db34ce9917ac96c179ec676ad Mon Sep 17 00:00:00 2001 From: Anatoly Mihalchenko Date: Tue, 5 Jul 2011 16:49:46 +0300 Subject: [PATCH] Graphics Triangle Tool --- src/tools/UBGraphicsTriangle.cpp | 463 +++++++++++++++++++++++-------- src/tools/UBGraphicsTriangle.h | 17 +- 2 files changed, 363 insertions(+), 117 deletions(-) diff --git a/src/tools/UBGraphicsTriangle.cpp b/src/tools/UBGraphicsTriangle.cpp index 3be1140b..7c9e4605 100644 --- a/src/tools/UBGraphicsTriangle.cpp +++ b/src/tools/UBGraphicsTriangle.cpp @@ -40,9 +40,35 @@ UBGraphicsTriangle::UBGraphicsTriangle() mRotateSvgItem->setVisible(false); mRotateSvgItem->setData(UBGraphicsItemData::ItemLayerType, QVariant(UBItemLayerType::Control)); - //updateResizeCursor(); + updateResizeCursor(); } + +void UBGraphicsTriangle::updateResizeCursor() +{ + QPixmap pix(":/images/cursors/resize.png"); + QTransform itemTransform = sceneTransform(); + QRectF itemRect = boundingRect(); + + QPointF topLeft = itemTransform.map(itemRect.topLeft()); + QPointF topRight = itemTransform.map(itemRect.topRight()); + QPointF bottomLeft = itemTransform.map(itemRect.bottomLeft()); + + QLineF topLine(topLeft, topRight); + QLineF leftLine(topLeft, bottomLeft); + + qreal angle = topLine.angle(); + QTransform tr1; + tr1.rotate(- angle); + mResizeCursor1 = QCursor(pix.transformed(tr1, Qt::SmoothTransformation), pix.width() / 2, pix.height() / 2); + + angle = leftLine.angle(); + QTransform tr2; + tr2.rotate(- angle); + mResizeCursor2 = QCursor(pix.transformed(tr2, Qt::SmoothTransformation), pix.width() / 2, pix.height() / 2); +} + + UBGraphicsTriangle::~UBGraphicsTriangle() { } @@ -65,7 +91,7 @@ UBItem* UBGraphicsTriangle::deepCopy(void) const void UBGraphicsTriangle::setRect(qreal x, qreal y, qreal w, qreal h, UBGraphicsTriangleOrientation orientation) { QPolygonF polygon; - polygon << QPointF(x, y) << QPoint(x, y + h) << QPoint(x+w, y + h) << QPoint(x, y); + polygon << QPointF(x, y) << QPoint(x, y + h) << QPoint(x+w, y + h); setPolygon(polygon); setOrientation(orientation); @@ -73,30 +99,12 @@ void UBGraphicsTriangle::setRect(qreal x, qreal y, qreal w, qreal h, UBGraphicsT void UBGraphicsTriangle::setOrientation(UBGraphicsTriangleOrientation orientation) { - if (mOrientation != orientation) - { - mOrientation = orientation; - QTransform t; - switch(orientation) - { - case BottomLeft: - t.setMatrix(1, 0, 0, 0, 1, 0, 0, 0, 1); - break; - case BottomRight: - t.setMatrix(-1, 0, 0, 0, 1, 0, boundingRect().right(), 0, 1); - break; - case TopLeft: - t.setMatrix(1, 0, 0, 0, -1, 0, 0, boundingRect().bottom(), 1); - break; - case TopRight: - t.setMatrix(-1, 0, 0, 0, -1, 0, boundingRect().right(), boundingRect().bottom(), 1); - break; - } - - this->angle = -this->angle; - rotateAroundCenter(t, rotationCenter()); - setTransform(t); - } + mOrientation = orientation; + calculatePoints(boundingRect()); + + QPolygonF polygon; + polygon << A1 << B1 << C1; + setPolygon(polygon); } UBGraphicsScene* UBGraphicsTriangle::scene() const @@ -104,25 +112,81 @@ UBGraphicsScene* UBGraphicsTriangle::scene() const return static_cast(QGraphicsPolygonItem::scene()); } -void UBGraphicsTriangle::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) +void UBGraphicsTriangle::calculatePoints(const QRectF& r) { - QPointF A1(rect().x(), rect().y()); - QPointF B1(rect().x(), rect().y() + rect().height()); - QPointF C1(rect().x() + rect().width(), rect().y() + rect().height()); + 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; + } - qreal C = sqrt(rect().width() * rect().width() + rect().height() * rect().height()); + C = sqrt(rect().width() * rect().width() + rect().height() * rect().height()); qreal L = (C * d + rect().width() * d)/ rect().height(); qreal K = (C * d + rect().height() * d)/ rect().width(); - qreal W1 = rect().height() * d / C; - qreal H1 = rect().width() * d / C; + switch(mOrientation) + { + case BottomLeft: + A2.setX(r.left() + d); A2.setY(r.top() + K); + B2.setX(r.left() + d); B2.setY(r.bottom() - d); + C2.setX(r.right() - L); C2.setY(r.bottom() - d); + break; + case TopLeft: + A2.setX(r.left() + d); A2.setY(r.bottom() - K); + B2.setX(r.left() + d); B2.setY(r.top() + d); + C2.setX(r.right() - L); C2.setY(r.top() + d); + break; + case TopRight: + A2.setX(r.right() - d); A2.setY(r.bottom() - K); + B2.setX(r.right() - d); B2.setY(r.top() + d); + C2.setX(r.left() + L); C2.setY(r.top() + d); + break; + case BottomRight: + A2.setX(r.right() - d); A2.setY(r.top() + K); + B2.setX(r.right() - d); B2.setY(r.bottom() - d); + C2.setX(r.left() + L); C2.setY(r.bottom() - d); + break; + } + W1 = rect().height() * d / C; + H1 = rect().width() * d / C; - QPointF A2(rect().x() + d, rect().y() + K); - QPointF B2(rect().x() + d, rect().y() + rect().height() - d); - QPointF C2(rect().x() + rect().width() - L, rect().y() + rect().height() - d); + switch(mOrientation) + { + case BottomLeft: + CC.setX(r.right() - L + W1); CC.setY(r.bottom() - d - H1); + break; + case TopLeft: + CC.setX(r.right() - L + W1); CC.setY(r.top() + d + H1); + break; + case TopRight: + CC.setX(r.left() + L - W1); CC.setY(r.top() + d + H1); + break; + case BottomRight: + CC.setX(r.left() + L - W1); CC.setY(r.top() - d - H1); + break; + } +} - QPoint CC(rect().x() + rect().width() - L + W1, - rect().y() + rect().height() - d - H1); +void UBGraphicsTriangle::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) +{ painter->setPen(Qt::NoPen); @@ -197,41 +261,76 @@ void UBGraphicsTriangle::paintGraduations(QPainter *painter) const int millimetersPerCentimeter = 10; const int millimetersPerHalfCentimeter = 5; + qreal kx = (mOrientation == TopLeft || mOrientation == BottomLeft) ? 1 : -1; + qreal ky = (mOrientation == BottomLeft || mOrientation == BottomRight) ? 1 : -1; + painter->save(); painter->setFont(font()); QFontMetricsF fontMetrics(painter->font()); for (int millimeters = 0; millimeters < (rect().width() - sLeftEdgeMargin - sRoundingRadius) / sPixelsPerMillimeter; millimeters++) { - int graduationX = rotationCenter().x() + sPixelsPerMillimeter * millimeters; + int graduationX = rotationCenter().x() + kx * sPixelsPerMillimeter * millimeters; int graduationHeight = (0 == millimeters % millimetersPerCentimeter) ? centimeterGraduationHeight : ((0 == millimeters % millimetersPerHalfCentimeter) ? halfCentimeterGraduationHeight : millimeterGraduationHeight); // Check that grad. line inside triangle - qreal lineY = rect().bottom() - rect().height()/rect().width()*(rect().width() - graduationX); - if (lineY >= rotationCenter().y() - graduationHeight) - break; + qreal dx = (kx > 0) ? rect().width() - graduationX : graduationX - rect().x(); + qreal lineY = rotationCenter().y() - ky * rect().height()/rect().width() * dx; + if (mOrientation == BottomLeft || mOrientation == BottomRight) + { + if (lineY >= rotationCenter().y() - ky * graduationHeight) + break; + } + else + { + if (lineY <= rotationCenter().y() - ky * graduationHeight) + break; + } - painter->drawLine(QLine(graduationX, rotationCenter().y(), graduationX, rotationCenter().y() - graduationHeight)); + painter->drawLine(QLine(graduationX, rotationCenter().y(), graduationX, rotationCenter().y() - ky * graduationHeight)); if (0 == millimeters % millimetersPerCentimeter) { QString text = QString("%1").arg((int)(millimeters / millimetersPerCentimeter)); int textXRight = graduationX + fontMetrics.width(text) / 2; qreal textWidth = fontMetrics.width(text); qreal textHeight = fontMetrics.tightBoundingRect(text).height() + 5; - int textY = rect().bottom() - 5 - centimeterGraduationHeight - textHeight; - lineY = rect().bottom() - rect().height()/rect().width()*(rect().width() - textXRight); + int textY = (ky > 0) ? rotationCenter().y() - 5 - centimeterGraduationHeight - textHeight + : rotationCenter().y() + 5 + centimeterGraduationHeight; - if (textXRight < rect().right() - && lineY < textY) + bool bText = false; + switch(mOrientation) { + case BottomLeft: + dx = rect().width() - textXRight; + lineY = rotationCenter().y() - rect().height()/rect().width() * dx; + bText = lineY <= textY; + break; + case TopLeft: + dx = rect().width() - textXRight; + lineY = rotationCenter().y() + rect().height()/rect().width() * dx; + bText = lineY >= textY + textHeight; + break; + case TopRight: + dx = textXRight - textWidth - rect().left(); + lineY = rotationCenter().y() + rect().height()/rect().width() * dx; + bText = lineY >= textY + textHeight; + break; + case BottomRight: + dx = textXRight - textWidth - rect().left(); + lineY = rotationCenter().y() - rect().height()/rect().width() * dx; + bText = lineY <= textY; + break; + } + + if (bText) painter->drawText( QRectF(graduationX - textWidth / 2, - textY, textWidth, textHeight), + textY, textWidth, textHeight), Qt::AlignVCenter, text); - } + } } painter->restore(); @@ -258,82 +357,192 @@ void UBGraphicsTriangle::rotateAroundCenter(QTransform& transform, QPointF cente QPointF UBGraphicsTriangle::rotationCenter() const { - return QPointF(rect().x() + sLeftEdgeMargin , rect().bottom()); + switch(mOrientation) + { + case BottomLeft: + case TopLeft: + return B1 + QPointF(sLeftEdgeMargin, 0); + case TopRight: + case BottomRight: + return B1 - QPointF(sLeftEdgeMargin, 0); + } + return QPointF(0, 0); } QRectF UBGraphicsTriangle::closeButtonRect() const { - return QRectF(rect().x() + d - mCloseSvgItem->boundingRect().width() - 5, - rect().bottom() - d - mCloseSvgItem->boundingRect().height() - 5, - mCloseSvgItem->boundingRect().width(), - mCloseSvgItem->boundingRect().height()); + switch(mOrientation) + { + case BottomLeft: + return QRectF(B2.x() - mCloseSvgItem->boundingRect().width() - 5, + B2.y() - mCloseSvgItem->boundingRect().height() - 5, + mCloseSvgItem->boundingRect().width(), + mCloseSvgItem->boundingRect().height()); + case TopLeft: + return QRectF(B2.x() - mCloseSvgItem->boundingRect().width() - 5, + B2.y() + 5, + mCloseSvgItem->boundingRect().width(), + mCloseSvgItem->boundingRect().height()); + case TopRight: + return QRectF(B2.x() + 5, + B2.y() + 5, + mCloseSvgItem->boundingRect().width(), + mCloseSvgItem->boundingRect().height()); + case BottomRight: + return QRectF(B2.x() + 5, + B2.y() - mCloseSvgItem->boundingRect().height() - 5, + mCloseSvgItem->boundingRect().width(), + mCloseSvgItem->boundingRect().height()); + } + return QRectF(0,0,0,0); } QPolygonF UBGraphicsTriangle::resize1Polygon() const { - qreal C = sqrt(rect().width() * rect().width() + rect().height() * rect().height()); - + qreal x1, y1; + switch(mOrientation) + { + case BottomLeft: + x1 = -1; + y1 = -1; + break; + case TopLeft: + x1 = -1; + y1 = 1; + break; + case TopRight: + x1 = 1; + y1 = 1; + break; + case BottomRight: + x1 = 1; + y1 = -1; + break; + } + QPointF P1(C1.x() + x1 * sArrowLength, C1.y()); + QPointF P2(C1.x() + x1 * sArrowLength * rect().width()/C, C1.y() + y1 * sArrowLength * rect().height() / C); QPolygonF p; - - QPointF P1(rect().right() - sArrowLength, rect().bottom()); - QPointF P2(rect().right() - sArrowLength * rect().width() / C, - rect().bottom() - sArrowLength * rect().height() / C ); - - p << QPointF(rect().right(), rect().bottom()) << P1 << P2; - + p << C1 << P1 << P2; return p; } QPolygonF UBGraphicsTriangle::resize2Polygon() const { - qreal C = sqrt(rect().width() * rect().width() + rect().height() * rect().height()); - + qreal x1, y1; + switch(mOrientation) + { + case BottomLeft: + x1 = 1; + y1 = 1; + break; + case TopLeft: + x1 = 1; + y1 = -1; + break; + case TopRight: + x1 = -1; + y1 = -1; + break; + case BottomRight: + x1 = -1; + y1 = 1; + break; + } + QPointF P1(A1.x(), A1.y() + y1 * sArrowLength); + QPointF P2(A1.x() + x1 * sArrowLength * rect().width()/C, + A1.y() + y1 * sArrowLength * rect().height() / C); QPolygonF p; - - QPointF P1(rect().left(), rect().top() + sArrowLength); - QPointF P2(rect().left() + sArrowLength * rect().width() / C, - rect().top() + sArrowLength * rect().height() / C ); - - p << QPointF(rect().left(), rect().top()) << P1 << P2; - + p << A1 << P1 << P2; return p; } QRectF UBGraphicsTriangle::hFlipRect() const { - return QRectF(rect().x() + d - mHFlipSvgItem->boundingRect().width() - 5, - rect().bottom() - d - mCloseSvgItem->boundingRect().height() - mVFlipSvgItem->boundingRect().height() - - mVFlipSvgItem->boundingRect().height() - 15, - mHFlipSvgItem->boundingRect().width(), - mHFlipSvgItem->boundingRect().height()); + qreal dy = mVFlipSvgItem->boundingRect().height() + mCloseSvgItem->boundingRect().height() + 10; + switch(mOrientation) + { + case BottomLeft: + return QRectF(B2.x() - mHFlipSvgItem->boundingRect().width() - 5, + B2.y() - mHFlipSvgItem->boundingRect().height() - 5 - dy, + mHFlipSvgItem->boundingRect().width(), + mHFlipSvgItem->boundingRect().height()); + case TopLeft: + return QRectF(B2.x() - mHFlipSvgItem->boundingRect().width() - 5, + B2.y() + 5 + dy, + mHFlipSvgItem->boundingRect().width(), + mHFlipSvgItem->boundingRect().height()); + case TopRight: + return QRectF(B2.x() + 5, + B2.y() + 5 + dy, + mHFlipSvgItem->boundingRect().width(), + mHFlipSvgItem->boundingRect().height()); + case BottomRight: + return QRectF(B2.x() + 5, + B2.y() - mHFlipSvgItem->boundingRect().height() - 5 - dy, + mHFlipSvgItem->boundingRect().width(), + mHFlipSvgItem->boundingRect().height()); + } + return QRectF(0,0,0,0); } QRectF UBGraphicsTriangle::vFlipRect() const { - return QRectF(rect().x() + d - mVFlipSvgItem->boundingRect().width() - 5, - rect().bottom() - d - mCloseSvgItem->boundingRect().height() - mVFlipSvgItem->boundingRect().height() - 10, - mVFlipSvgItem->boundingRect().width(), - mVFlipSvgItem->boundingRect().height()); + qreal dy = mCloseSvgItem->boundingRect().height() + 5; + switch(mOrientation) + { + case BottomLeft: + return QRectF(B2.x() - mVFlipSvgItem->boundingRect().width() - 5, + B2.y() - mVFlipSvgItem->boundingRect().height() - 5 - dy, + mVFlipSvgItem->boundingRect().width(), + mVFlipSvgItem->boundingRect().height()); + case TopLeft: + return QRectF(B2.x() - mVFlipSvgItem->boundingRect().width() - 5, + B2.y() + 5 + dy, + mVFlipSvgItem->boundingRect().width(), + mVFlipSvgItem->boundingRect().height()); + case TopRight: + return QRectF(B2.x() + 5, + B2.y() + 5 + dy, + mVFlipSvgItem->boundingRect().width(), + mVFlipSvgItem->boundingRect().height()); + case BottomRight: + return QRectF(B2.x() + 5, + B2.y() - mVFlipSvgItem->boundingRect().height() - 5 - dy, + mVFlipSvgItem->boundingRect().width(), + mVFlipSvgItem->boundingRect().height()); + } + return QRectF(0,0,0,0); } QRectF UBGraphicsTriangle::rotateRect() const { - QPointF A1(rect().x(), rect().y()); - QPointF B1(rect().x(), rect().y() + rect().height()); - QPointF C1(rect().x() + rect().width(), rect().y() + rect().height()); - - qreal C = sqrt(rect().width() * rect().width() + rect().height() * rect().height()); - qreal L = (C * d + rect().width() * d)/ rect().height(); - - QPointF C2(rect().x() + rect().width() - L, rect().y() + rect().height() - d); - - return QRectF(C2 + QPointF(20, 5), QSizeF(mRotateSvgItem->boundingRect().size())); + QPointF p(C2); + switch(mOrientation) + { + case BottomLeft: + p += QPointF(20, 5); + break; + case TopLeft: + p += QPointF(20, -5 - mRotateSvgItem->boundingRect().height()); + break; + case TopRight: + p += QPointF(-20 - mRotateSvgItem->boundingRect().width(), -5 - mRotateSvgItem->boundingRect().height()); + break; + case BottomRight: + p += QPointF(-20 - mRotateSvgItem->boundingRect().width(), 5); + break; + } + return QRectF(p, QSizeF(mRotateSvgItem->boundingRect().size())); +} +QCursor UBGraphicsTriangle::resizeCursor1() const +{ + return mResizeCursor1; } -QCursor UBGraphicsTriangle::moveResizeCursor() const +QCursor UBGraphicsTriangle::resizeCursor2() const { - return Qt::OpenHandCursor; + return mResizeCursor2; } QCursor UBGraphicsTriangle::flipCursor() const @@ -382,8 +591,16 @@ void UBGraphicsTriangle::mouseMoveEvent(QGraphicsSceneMouseEvent *event) if (mResizing1) { QPointF delta = event->pos() - event->lastPos(); - if (rect().width() + delta.x() < sMinWidth) - delta.setX(sMinWidth - rect().width()); + if (mOrientation == TopLeft || mOrientation == BottomLeft) + { + if (rect().width() + delta.x() < sMinWidth) + delta.setX(sMinWidth - rect().width()); + } + else + { + if (rect().width() - delta.x() < sMinWidth) + delta.setX(sMinWidth - rect().width()); + } if (mOrientation == TopLeft || mOrientation == BottomLeft) { setRect(QRectF( @@ -395,9 +612,9 @@ void UBGraphicsTriangle::mouseMoveEvent(QGraphicsSceneMouseEvent *event) else { setRect(QRectF( - rect().left() - delta.x(), + rect().left() + delta.x(), rect().top(), - rect().width() + delta.x(), + rect().width() - delta.x(), rect().height()), mOrientation ); @@ -406,18 +623,30 @@ void UBGraphicsTriangle::mouseMoveEvent(QGraphicsSceneMouseEvent *event) if (mResizing2) { QPointF delta = event->pos() - event->lastPos(); - if (rect().height() - delta.y() < sMinHeight) - delta.setY(sMinHeight - rect().height()); - qDebug() << event->pos() << event->lastPos() << delta; - QRectF r( - rect().left(), - rect().top() + delta.y(), - rect().width(), - rect().height() - delta.y()); - qDebug() << r; - setRect(r, mOrientation); - - + if (mOrientation == BottomRight || mOrientation == BottomLeft) + { + if (rect().height() - delta.y() < sMinHeight) + delta.setY(sMinHeight - rect().height()); + } + else + { + if (rect().height() + delta.y() < sMinHeight) + delta.setY(sMinHeight - rect().height()); + } + if (mOrientation == BottomRight || mOrientation == BottomLeft) + setRect(QRectF( + rect().left(), + rect().top() + delta.y(), + rect().width(), + rect().height() - delta.y()), + mOrientation); + else + setRect(QRectF( + rect().left(), + rect().top(), + rect().width(), + rect().height() + delta.y()), + mOrientation); } if (mRotating) { @@ -434,6 +663,8 @@ void UBGraphicsTriangle::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { if (mResizing1 || mResizing2 || mRotating) { + if (mRotating) + updateResizeCursor(); mResizing1 = false; mResizing2 = false; mRotating = false; @@ -505,9 +736,10 @@ void UBGraphicsTriangle::hoverEnterEvent(QGraphicsSceneHoverEvent *event) mVFlipSvgItem->setVisible(true); mRotateSvgItem->setVisible(true); - if (resize1Polygon().containsPoint(event->pos().toPoint(), Qt::OddEvenFill) || - resize2Polygon().containsPoint(event->pos().toPoint(), Qt::OddEvenFill)) - setCursor(moveResizeCursor()); + if (resize1Polygon().containsPoint(event->pos().toPoint(), Qt::OddEvenFill)) + setCursor(resizeCursor1()); + else if(resize2Polygon().containsPoint(event->pos().toPoint(), Qt::OddEvenFill)) + setCursor(resizeCursor2()); else if (closeButtonRect().contains(event->pos())) setCursor(closeCursor()); else if (hFlipRect().contains(event->pos()) @@ -546,9 +778,10 @@ void UBGraphicsTriangle::hoverMoveEvent(QGraphicsSceneHoverEvent *event) mHFlipSvgItem->setVisible(mShowButtons); mRotateSvgItem->setVisible(mShowButtons); - if (resize1Polygon().containsPoint(event->pos().toPoint(), Qt::OddEvenFill) || - resize2Polygon().containsPoint(event->pos().toPoint(), Qt::OddEvenFill)) - setCursor(moveResizeCursor()); + if (resize1Polygon().containsPoint(event->pos().toPoint(), Qt::OddEvenFill)) + setCursor(resizeCursor1()); + else if (resize2Polygon().containsPoint(event->pos().toPoint(), Qt::OddEvenFill)) + setCursor(resizeCursor2()); else if (closeButtonRect().contains(event->pos())) setCursor(closeCursor()); else if (hFlipRect().contains(event->pos()) diff --git a/src/tools/UBGraphicsTriangle.h b/src/tools/UBGraphicsTriangle.h index 756a1fc6..1ff52999 100644 --- a/src/tools/UBGraphicsTriangle.h +++ b/src/tools/UBGraphicsTriangle.h @@ -67,6 +67,8 @@ class UBGraphicsTriangle : public UBAbstractDrawRuler, public QGraphicsPolygonIt protected: + void updateResizeCursor(); + virtual void paint (QPainter *painter, const QStyleOptionGraphicsItem *styleOption, QWidget *widget); virtual void rotateAroundCenter(qreal angle); @@ -80,7 +82,9 @@ class UBGraphicsTriangle : public UBAbstractDrawRuler, public QGraphicsPolygonIt QRectF vFlipRect() const; QRectF rotateRect() const; - QCursor moveResizeCursor() const; + QCursor resizeCursor1() const; + QCursor resizeCursor2() const; + QCursor flipCursor() const; virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); @@ -92,6 +96,9 @@ class UBGraphicsTriangle : public UBAbstractDrawRuler, public QGraphicsPolygonIt private: + QCursor mResizeCursor1; + QCursor mResizeCursor2; + QTransform calculateRotationTransform(); qreal angle; void rotateAroundCenter(QTransform& transform, QPointF center); @@ -112,9 +119,15 @@ class UBGraphicsTriangle : public UBAbstractDrawRuler, public QGraphicsPolygonIt UBGraphicsTriangleOrientation mOrientation; + QPointF A1, B1, C1, A2, B2, C2; // coordinates of points in ext and int triangles + qreal C; + qreal W1, H1; // Neccessary for filling + QPointF CC; // Hyp. fillining gradient - top point + void calculatePoints(const QRectF& rect); + static const int d = 70; // width of triangle border static const int sArrowLength = 30; - static const int sMinWidth = 200; + static const int sMinWidth = 380; static const int sMinHeight = 200; };