diff --git a/resources/OpenBoard.qrc b/resources/OpenBoard.qrc index 03032e226..0b2ce1449 100644 --- a/resources/OpenBoard.qrc +++ b/resources/OpenBoard.qrc @@ -50,6 +50,9 @@ images/reload.svg images/frozen.svg images/unfrozen.svg + images/settingsCompass.svg + images/rightAngleCompass.svg + images/angleRotateCompass.svg images/toolbar/group.png images/toolbar/ungroup.png images/toolbar/window.png diff --git a/resources/i18n/OpenBoard_ru.ts b/resources/i18n/OpenBoard_ru.ts index 23bb78dce..a5de21c2b 100644 --- a/resources/i18n/OpenBoard_ru.ts +++ b/resources/i18n/OpenBoard_ru.ts @@ -1229,6 +1229,29 @@ Do you wish to override the security check and continue ? Закрыть + + UBCompassAngleRotateDialog + + Compass angle rotation + Задать угол поворота циркуля + + + Angle: + Угол: + + + With drawing + Прочертить + + + Rotate absolutely + Повернуть абсолютно + + + Rotate relative + Повернуть относительно + + UBDesktopPalette @@ -1896,6 +1919,17 @@ Providing a new name will create a new document. Загрузка + + UBGraphicsCompass + + Normalize position + Прилипание к сетке + + + Normalize size + Размер по сетке + + UBGraphicsGroupContainerItemDelegate diff --git a/resources/images/angleRotateCompass.svg b/resources/images/angleRotateCompass.svg new file mode 100644 index 000000000..1ab777a90 --- /dev/null +++ b/resources/images/angleRotateCompass.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + diff --git a/resources/images/rightAngleCompass.svg b/resources/images/rightAngleCompass.svg new file mode 100644 index 000000000..1eeb6783f --- /dev/null +++ b/resources/images/rightAngleCompass.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + diff --git a/resources/images/settingsCompass.svg b/resources/images/settingsCompass.svg new file mode 100644 index 000000000..6502e0b7d --- /dev/null +++ b/resources/images/settingsCompass.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/core/UBSettings.cpp b/src/core/UBSettings.cpp index 74962bb41..abfdb8454 100644 --- a/src/core/UBSettings.cpp +++ b/src/core/UBSettings.cpp @@ -839,6 +839,7 @@ void UBSettings::setPageBackground(UBPageBackground background) val = "plain"; setValue("Board/PageBackground", val); + emit(pageBackgroundChanged()); } void UBSettings::setSeyesRuledBackground(bool isSeyesRuledBackground) diff --git a/src/core/UBSettings.h b/src/core/UBSettings.h index e46948e94..46075d5b5 100644 --- a/src/core/UBSettings.h +++ b/src/core/UBSettings.h @@ -463,6 +463,7 @@ class UBSettings : public QObject signals: void colorContextChanged(); + void pageBackgroundChanged(); private: diff --git a/src/domain/UBGraphicsItemUndoCommand.cpp b/src/domain/UBGraphicsItemUndoCommand.cpp index 9c2af6048..529dda68d 100644 --- a/src/domain/UBGraphicsItemUndoCommand.cpp +++ b/src/domain/UBGraphicsItemUndoCommand.cpp @@ -103,6 +103,11 @@ void UBGraphicsItemUndoCommand::undo() bool bApplyTransform = false; UBGraphicsPolygonItem *polygonItem = qgraphicsitem_cast(item); if (polygonItem){ + if (!polygonItem->strokesGroup()) + { + polygonItem->setStrokesGroup(new UBGraphicsStrokesGroup()); + polygonItem->strokesGroup()->addToGroup(polygonItem); + } if (polygonItem->strokesGroup() && polygonItem->strokesGroup()->parentItem() && UBGraphicsGroupContainerItem::Type == polygonItem->strokesGroup()->parentItem()->type()) @@ -276,6 +281,8 @@ void UBGraphicsItemUndoCommand::redo() { mScene->removeItem(polygonItem); mScene->removeItemFromDeletion(polygonItem); + if (!polygonItem->strokesGroup()) + polygonItem->setStrokesGroup(new UBGraphicsStrokesGroup()); polygonItem->strokesGroup()->addToGroup(polygonItem); } } diff --git a/src/domain/UBGraphicsScene.cpp b/src/domain/UBGraphicsScene.cpp index c9ddb3619..d5caf5ca5 100644 --- a/src/domain/UBGraphicsScene.cpp +++ b/src/domain/UBGraphicsScene.cpp @@ -2404,6 +2404,11 @@ void UBGraphicsScene::controlViewportChanged() } } +void UBGraphicsScene::setPreviousPoint(QPointF _point) +{ + mPreviousPoint = _point; +} + void UBGraphicsScene::addCompass(QPointF center) { UBGraphicsCompass* compass = new UBGraphicsCompass(); // mem : owned and destroyed by the scene diff --git a/src/domain/UBGraphicsScene.h b/src/domain/UBGraphicsScene.h index 48281418d..e90c7f94f 100644 --- a/src/domain/UBGraphicsScene.h +++ b/src/domain/UBGraphicsScene.h @@ -394,6 +394,8 @@ public slots: void controlViewportChanged(); + void setPreviousPoint(QPointF _point); + protected: UBGraphicsPolygonItem* lineToPolygonItem(const QLineF& pLine, const qreal& pWidth); diff --git a/src/tools/UBGraphicsCompass.cpp b/src/tools/UBGraphicsCompass.cpp index 8725acfec..7d691865a 100644 --- a/src/tools/UBGraphicsCompass.cpp +++ b/src/tools/UBGraphicsCompass.cpp @@ -25,6 +25,7 @@ */ +#include #include "tools/UBGraphicsCompass.h" @@ -33,9 +34,11 @@ #include "core/UBSettings.h" #include "gui/UBResources.h" #include "domain/UBGraphicsScene.h" +#include "core/UBSettings.h" #include "board/UBBoardController.h" // TODO UB 4.x clean that dependency #include "board/UBDrawingController.h" // TODO UB 4.x clean that dependency +#include "board/UBBoardView.h" // TODO UB 4.x clean that dependency #include "core/memcheck.h" @@ -49,7 +52,7 @@ const QColor UBGraphicsCompass::sDarkBackgroundDrawColor = QColor(0xff, 0xff, 0x const int UBGraphicsCompass::sMinRadius = UBGraphicsCompass::sNeedleLength + UBGraphicsCompass::sNeedleBaseLength + 24 + UBGraphicsCompass::sDefaultRect.height() + 24 + UBGraphicsCompass::sPencilBaseLength - + UBGraphicsCompass::sPencilLength; + + UBGraphicsCompass::sPencilLength + 48 + 48; UBGraphicsCompass::UBGraphicsCompass() : QGraphicsRectItem() @@ -61,8 +64,12 @@ UBGraphicsCompass::UBGraphicsCompass() , mDrewCircle(false) , mCloseSvgItem(0) , mResizeSvgItem(0) + , mSettingsSvgItem(0) + , mRihtAngleSvgItem(0) + , mAngleRotateSvgItem(0) , mAntiScaleRatio(1.0) , mDrewCenterCross(false) + , mSettingsMenu(0) { setRect(sDefaultRect); @@ -80,6 +87,21 @@ UBGraphicsCompass::UBGraphicsCompass() mResizeSvgItem->setVisible(false); mResizeSvgItem->setData(UBGraphicsItemData::ItemLayerType, QVariant(UBItemLayerType::Control)); + mSettingsSvgItem = new QGraphicsSvgItem(":/images/settingsCompass.svg", this); + mSettingsSvgItem->setVisible(false); + mSettingsSvgItem->setData(UBGraphicsItemData::ItemLayerType, QVariant(UBItemLayerType::Control)); + + mRihtAngleSvgItem = new QGraphicsSvgItem(":/images/rightAngleCompass.svg", this); + mRihtAngleSvgItem->setVisible(false); + mRihtAngleSvgItem->setData(UBGraphicsItemData::ItemLayerType, QVariant(UBItemLayerType::Control)); + + mAngleRotateSvgItem = new QGraphicsSvgItem(":/images/angleRotateCompass.svg", this); + mAngleRotateSvgItem->setVisible(false); + mAngleRotateSvgItem->setData(UBGraphicsItemData::ItemLayerType, QVariant(UBItemLayerType::Control)); + + mAngleRotateDialog = new UBCompassAngleRotateDialog(this); + mAngleRotateDialog->setWindowFlags(Qt::Tool); + updateResizeCursor(); updateDrawCursor(); @@ -90,6 +112,10 @@ UBGraphicsCompass::UBGraphicsCompass() connect(UBApplication::boardController, SIGNAL(penColorChanged()), this, SLOT(penColorChanged())); connect(UBDrawingController::drawingController(), SIGNAL(lineWidthIndexChanged(int)), this, SLOT(lineWidthChanged())); + connect(UBSettings::settings(), SIGNAL(pageBackgroundChanged()), this, SLOT(setMenuActions())); + + mNormalizePos = false; + mNormalizeSize = false; } UBGraphicsCompass::~UBGraphicsCompass() @@ -141,6 +167,21 @@ void UBGraphicsCompass::paint(QPainter *painter, const QStyleOptionGraphicsItem resizeButtonRect().center().x() - mResizeSvgItem->boundingRect().width() * mAntiScaleRatio / 2, resizeButtonRect().center().y() - mResizeSvgItem->boundingRect().height() * mAntiScaleRatio / 2); + mSettingsSvgItem->setTransform(antiScaleTransform); + mSettingsSvgItem->setPos( + settingsButtonRect().center().x() - mSettingsSvgItem->boundingRect().width() * mAntiScaleRatio / 2, + settingsButtonRect().center().y() - mSettingsSvgItem->boundingRect().height() * mAntiScaleRatio / 2); + + mRihtAngleSvgItem->setTransform(antiScaleTransform); + mRihtAngleSvgItem->setPos( + rightAngleButtonRect().center().x() - mRihtAngleSvgItem->boundingRect().width() * mAntiScaleRatio / 2, + rightAngleButtonRect().center().y() - mRihtAngleSvgItem->boundingRect().height() * mAntiScaleRatio /2); + + mAngleRotateSvgItem->setTransform(antiScaleTransform); + mAngleRotateSvgItem->setPos( + angleRotateButtonRect().center().x() - mAngleRotateSvgItem->boundingRect().width() * mAntiScaleRatio /2, + angleRotateButtonRect().center().y() - mAngleRotateSvgItem->boundingRect().height() * mAntiScaleRatio /2); + painter->setPen(drawColor()); painter->drawRoundedRect(hingeRect(), sCornerRadius, sCornerRadius); painter->fillPath(hingeShape(), middleFillColor()); @@ -190,6 +231,9 @@ QVariant UBGraphicsCompass::itemChange(GraphicsItemChange change, const QVariant { mCloseSvgItem->setParentItem(this); mResizeSvgItem->setParentItem(this); + mSettingsSvgItem->setParent(this); + mRihtAngleSvgItem->setParent(this); + mAngleRotateSvgItem->setParent(this); } return QGraphicsRectItem::itemChange(change, value); @@ -201,6 +245,9 @@ void UBGraphicsCompass::mousePressEvent(QGraphicsSceneMouseEvent *event) UBDrawingController::drawingController ()->stylusTool() != UBStylusTool::Play) return; + bool setting = false; + bool rightAngle = false; + bool angleRotate = false; bool closing = false; if (resizeButtonRect().contains(event->pos())) @@ -217,6 +264,19 @@ void UBGraphicsCompass::mousePressEvent(QGraphicsSceneMouseEvent *event) event->accept(); qDebug() << "hinge"; } + else if (settingsButtonRect().contains(event->pos())) + { + setting = true; + } + else if (rightAngleButtonRect().contains(event->pos())) + { + rightAngle = true; + } + else if (angleRotateButtonRect().contains((event->pos()))) + { + mBeforeRotatePosition = QLineF(needlePosition(), pencilPosition()); + angleRotate = true; + } else if (!closeButtonRect().contains(event->pos())) { qDebug() << "the rest"; @@ -237,6 +297,9 @@ void UBGraphicsCompass::mousePressEvent(QGraphicsSceneMouseEvent *event) mResizeSvgItem->setVisible(mShowButtons && mResizing); mCloseSvgItem->setVisible(mShowButtons && closing); + mSettingsSvgItem->setVisible(mShowButtons && setting); + mRihtAngleSvgItem->setVisible(mShowButtons && rightAngle); + mAngleRotateSvgItem->setVisible(mShowButtons && angleRotate); } void UBGraphicsCompass::mouseMoveEvent(QGraphicsSceneMouseEvent *event) @@ -290,8 +353,16 @@ void UBGraphicsCompass::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) UBDrawingController::drawingController ()->stylusTool() != UBStylusTool::Play) return; + + if (!mResizing && !mRotating && !mDrawing && mNormalizePos && (UBSettings::settings()->pageBackground()==UBPageBackground::crossed)) + { + normalizePos(); + event->accept(); + } if (mResizing) { + if (mNormalizeSize && (UBSettings::settings()->pageBackground()==UBPageBackground::crossed)) + normalizeSize(); event->accept(); } else if (mRotating) @@ -312,6 +383,30 @@ void UBGraphicsCompass::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) hide(); event->accept(); } + else if (settingsButtonRect().contains(event->pos())) + { + showSettings(); + event->accept(); + } + else if (rightAngleButtonRect().contains(event->pos())) + { + qreal rotateAngle = angleInDegrees(); + if (angleInDegrees() < 270) + { + int neededAngle = 90; + while (angleInDegrees() >= neededAngle) + neededAngle += 90; + rotateAngle -= neededAngle; + } + rotateAroundNeedle(rotateAngle); + event->accept(); + } + else if (angleRotateButtonRect().contains(event->pos())) + { + mAngleRotateDialog->clearData(); + mAngleRotateDialog->show(); + event->accept(); + } else { QGraphicsRectItem::mouseReleaseEvent(event); @@ -336,6 +431,10 @@ void UBGraphicsCompass::hoverEnterEvent(QGraphicsSceneHoverEvent *event) mCloseSvgItem->setParentItem(this); mResizeSvgItem->setParentItem(this); + mSettingsSvgItem->setParent(this); + mRihtAngleSvgItem->setParent(this); + mAngleRotateSvgItem->setParent(this); + mCloseSvgItem->setVisible(mShowButtons); if (mShowButtons) @@ -346,7 +445,10 @@ void UBGraphicsCompass::hoverEnterEvent(QGraphicsSceneHoverEvent *event) setCursor(drawCursor()); else if (resizeButtonRect().contains(event->pos())) setCursor(resizeCursor()); - else if (closeButtonRect().contains(event->pos())) + else if (closeButtonRect().contains(event->pos()) + || settingsButtonRect().contains(event->pos()) + || rightAngleButtonRect().contains(event->pos()) + || angleRotateButtonRect().contains(event->pos())) setCursor(closeCursor()); else setCursor(moveCursor()); @@ -364,6 +466,9 @@ void UBGraphicsCompass::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) mShowButtons = false; mCloseSvgItem->setVisible(mShowButtons); mResizeSvgItem->setVisible(mShowButtons); + mSettingsSvgItem->setVisible(mShowButtons); + mRihtAngleSvgItem->setVisible(mShowButtons); + mAngleRotateSvgItem->setVisible(mShowButtons); unsetCursor(); event->accept(); update(); @@ -378,6 +483,9 @@ void UBGraphicsCompass::hoverMoveEvent(QGraphicsSceneHoverEvent *event) mShowButtons = shape().contains(event->pos()); mCloseSvgItem->setVisible(mShowButtons); mResizeSvgItem->setVisible(mShowButtons); + mSettingsSvgItem->setVisible(mShowButtons); + mRihtAngleSvgItem->setVisible(mShowButtons); + mAngleRotateSvgItem->setVisible(mShowButtons); if (mShowButtons) { if (hingeRect().contains(event->pos())) @@ -386,7 +494,10 @@ void UBGraphicsCompass::hoverMoveEvent(QGraphicsSceneHoverEvent *event) setCursor(drawCursor()); else if (resizeButtonRect().contains(event->pos())) setCursor(resizeCursor()); - else if (closeButtonRect().contains(event->pos())) + else if (closeButtonRect().contains(event->pos()) + || settingsButtonRect().contains(event->pos()) + || rightAngleButtonRect().contains(event->pos()) + || angleRotateButtonRect().contains(event->pos())) setCursor(closeCursor()); else setCursor(moveCursor()); @@ -529,6 +640,60 @@ QRectF UBGraphicsCompass::resizeButtonRect() const return resizeRect; } +QRectF UBGraphicsCompass::settingsButtonRect() const +{ + QPixmap settingsPixmap(":/images/settingsCompass.svg"); + + QSizeF settingsRectSize( + settingsPixmap.width() * mAntiScaleRatio, + settingsPixmap.height() * mAntiScaleRatio); + + QPointF settingsRectTopLeft( + rect().width()/2 - hingeRect().width()/2 - settingsRectSize.width() - 2, + (rect().height() - settingsRectSize.height()) / 2); + + QRectF settingsRect(settingsRectTopLeft, settingsRectSize); + settingsRect.translate(rect().topLeft()); + + return settingsRect; +} + +QRectF UBGraphicsCompass::rightAngleButtonRect() const +{ + QPixmap rightAnglePixmap(":/images/rightAngleCompass.svg"); + + QSizeF rightAngleRectSize( + rightAnglePixmap.width() * mAntiScaleRatio, + rightAnglePixmap.height() * mAntiScaleRatio); + + QPointF rightAngleRectTopLeft( + rect().width()/2 - hingeRect().width()/2 - rightAngleRectSize.width() - settingsButtonRect().width() - 6, + (rect().height() - rightAngleRectSize.height()) / 2); + + QRectF rightAngleRect(rightAngleRectTopLeft, rightAngleRectSize); + rightAngleRect.translate(rect().topLeft()); + + return rightAngleRect; +} + +QRectF UBGraphicsCompass::angleRotateButtonRect() const +{ + QPixmap angleRotatePixmap(":/images/angleRotateCompass.svg"); + + QSizeF angleRotateRectSize( + angleRotatePixmap.width() * mAntiScaleRatio, + angleRotatePixmap.height() * mAntiScaleRatio); + + QPointF angleRotateRectTopLeft( + rect().width()/2 + hingeRect().width()/2 + angleRotateRectSize.width()/2, + (rect().height() - angleRotateRectSize.height()) / 2); + + QRectF angleRotateRect(angleRotateRectTopLeft, angleRotateRectSize); + angleRotateRect.translate(rect().topLeft()); + + return angleRotateRect; +} + void UBGraphicsCompass::rotateAroundNeedle(qreal angle) { QTransform transform; @@ -590,6 +755,61 @@ void UBGraphicsCompass::paintCenterCross() UBDrawingController::drawingController()->stylusTool() == UBStylusTool::Line); } +void UBGraphicsCompass::showSettings() +{ + if (!mSettingsMenu) + { + mSettingsMenu = new QMenu(UBApplication::boardController->controlView()); + decorateSettingsMenu(mSettingsMenu); + } + + UBBoardView* cv = UBApplication::boardController->controlView(); + QRect pinPos = cv->mapFromScene(mSettingsSvgItem->sceneBoundingRect()).boundingRect(); + + mSettingsMenu->exec(cv->mapToGlobal(pinPos.bottomRight())); +} + +void UBGraphicsCompass::decorateSettingsMenu(QMenu* menu) +{ + mNormalizePosAction = menu->addAction(tr("Normalize position"), this, SLOT(setNormalizePos(bool))); + mNormalizePosAction->setCheckable(true); + mNormalizePosAction->setChecked(mNormalizePos); + + mNormalizeSizeAction = menu->addAction(tr("Normalize size"), this, SLOT(setNormalizeSize(bool))); + mNormalizeSizeAction->setCheckable(true); + mNormalizeSizeAction->setChecked(mNormalizeSize); + setMenuActions(); +} + +void UBGraphicsCompass::angleRotateDialogResult() +{ + if (mAngleRotateDialog->isAbsolutely()) + rotateAroundNeedle(angleInDegrees()); + scene()->setPreviousPoint(mapToScene(pencilPosition())); + + qreal rotateAngle = -mAngleRotateDialog->Angle(); + qreal drawingAngle = rotateAngle; + if (!mAngleRotateDialog->isAbsolutely()) + drawingAngle -= angleInDegrees(); + + mSceneArcStartPoint = mapToScene(pencilPosition()); + rotateAroundNeedle(rotateAngle); + + if (mAngleRotateDialog->isDrawing()) + { + mSpanAngleInDegrees = rotateAngle; + if (mSpanAngleInDegrees >= 1080) + mSpanAngleInDegrees -= 360; + else if (mSpanAngleInDegrees < -1080) + mSpanAngleInDegrees += 360; + drawArc(); + } + updateResizeCursor(); + updateDrawCursor(); + scene()->inputDeviceRelease(); + scene()->moveTo(mSceneArcStartPoint); +} + QPointF UBGraphicsCompass::needlePosition() const { return QPointF(rect().x(), rect().y() + rect().height() / 2); @@ -804,3 +1024,178 @@ void UBGraphicsCompass::lineWidthChanged() QRect pencilRect(rect().right() - sPencilLength, rect().top(), sPencilLength, rect().height()); update(pencilRect); } + +void UBGraphicsCompass::setNormalizePos(bool isNormalize) +{ + mNormalizePos = isNormalize; + if (isNormalize) + normalizePos(); +} +void UBGraphicsCompass::setNormalizeSize(bool isNormalize) +{ + mNormalizeSize = isNormalize; + if (isNormalize) + normalizeSize(); +} + +void UBGraphicsCompass::setMenuActions() +{ + mNormalizePosAction->setEnabled(UBSettings::settings()->pageBackground()==UBPageBackground::crossed); + mNormalizeSizeAction->setEnabled(UBSettings::settings()->pageBackground()==UBPageBackground::crossed); +} + +void UBGraphicsCompass::normalizePos() +{ + QPointF newPos = nearPointFromGrid(mapToScene(needlePosition())); + qreal curAngle = angleInDegrees(); + if (curAngle!=0) + rotateAroundNeedle(curAngle); + setRect(newPos.x(), newPos.y() - rect().height() / 2, rect().width(), rect().height()); + setPos(0,0); + if (curAngle !=0) + rotateAroundNeedle(-curAngle); +} + +void UBGraphicsCompass::normalizeSize() +{ + int gridSize = UBSettings::settings()->crossSize; + int divGrid = rect().width()/gridSize; + if ((rect().toRect().width()%gridSize)>(gridSize/2)) + ++divGrid; + setRect(QRectF(rect().topLeft(), QSizeF(gridSize*divGrid,rect().height()))); +} + +QPointF UBGraphicsCompass::nearPointFromGrid(QPointF point) +{ + QPointF result = point; + QList gridPoints; + int sceneHeight = UBApplication::boardController->activeScene()->sceneSize().height(), + sceneWidth = UBApplication::boardController->activeScene()->sceneSize().width(), + gridSize = UBSettings::settings()->crossSize; + for (int i = 0; i >= sceneWidth/-2; i -= gridSize) + { + for (int j = 0; j >= sceneHeight/-2; j -=gridSize) + gridPoints.push_back(QPointF(i,j)); + for (int j = 0; j <= sceneHeight/2; j +=gridSize) + gridPoints.push_back(QPointF(i,j)); + } + for (int i = 0; i <= sceneWidth/2; i += gridSize) + { + for (int j = 0; j >= sceneHeight/-2; j -=gridSize) + gridPoints.push_back(QPointF(i,j)); + for (int j = 0; j <= sceneHeight/2; j +=gridSize) + gridPoints.push_back(QPointF(i,j)); + } + if (gridPoints.count() > 0) + { + result = gridPoints[0]; + QLineF checkLine = QLineF(point, result); + float length = qSqrt(qPow(checkLine.dx(),2) + qPow(checkLine.dy(),2)); + for (int i = 1; i < gridPoints.count(); ++i) + { + checkLine = QLineF(point, gridPoints[i]); + float checkLength = qSqrt(qPow(checkLine.dx(),2) + qPow(checkLine.dy(),2)); + if (checkLengthsetWindowTitle(tr("Compass angle rotation")); + window()->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); + + mAngleSpinBox = new QDoubleSpinBox(this); + mAngleSpinBox->setMaximum(360); + mAngleSpinBox->setMinimum(-360); + QHBoxLayout* hLayout = new QHBoxLayout(this); + QLabel* angleLabel = new QLabel(this); + angleLabel->setText(tr("Angle:")); + angleLabel->setAlignment(Qt::AlignVCenter); + angleLabel->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); + hLayout->addWidget(angleLabel); + hLayout->addWidget(mAngleSpinBox); + hLayout->addSpacerItem(new QSpacerItem(26,20, QSizePolicy::Expanding, QSizePolicy::Preferred)); + QWidget* angleFrame = new QWidget(this); + angleFrame->setLayout(hLayout); + angleFrame->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + mainLayout->addWidget(angleFrame); + + mDrawingCheckBox = new QCheckBox(this); + mDrawingCheckBox->setText(tr("With drawing")); + mDrawingCheckBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + QWidget* drawingCheckBoxWidget = new QWidget(this); + drawingCheckBoxWidget->setLayout(new QHBoxLayout(this)); + drawingCheckBoxWidget->layout()->addWidget(mDrawingCheckBox); + mainLayout->addWidget(drawingCheckBoxWidget); + + mainLayout->addSpacerItem(new QSpacerItem(26,20, QSizePolicy::Preferred, QSizePolicy::Expanding)); + + QWidget* buttonsWidget = new QWidget(this); + QPushButton* absolutButton = new QPushButton(this); + absolutButton->setText(tr("Rotate absolutely")); + absolutButton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); + QHBoxLayout* hLayout2 = new QHBoxLayout(this); + hLayout2->addWidget(absolutButton); + hLayout2->addSpacerItem(new QSpacerItem(26,20, QSizePolicy::Expanding, QSizePolicy::Preferred)); + QPushButton* relativeButton = new QPushButton(this); + relativeButton->setText(tr("Rotate relative")); + relativeButton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); + hLayout2->addWidget(relativeButton); + buttonsWidget->setLayout(hLayout2); + mainLayout->addWidget(buttonsWidget); + setLayout(mainLayout); + + connect(absolutButton, SIGNAL(clicked()), this, SLOT(RotateAbsolutely())); + connect(relativeButton, SIGNAL(clicked()), this, SLOT(RotateRelative())); +} + +UBCompassAngleRotateDialog::~UBCompassAngleRotateDialog() +{ + delete mDrawingCheckBox; + delete mAngleSpinBox; +} + +void UBCompassAngleRotateDialog::RotateAbsolutely() +{ + mIsAbsolutely = true; + mCompass->angleRotateDialogResult(); + emit accept(); +} + +void UBCompassAngleRotateDialog::RotateRelative() +{ + mIsAbsolutely = false; + mCompass->angleRotateDialogResult(); + emit accept(); +} + +bool UBCompassAngleRotateDialog::isDrawing() +{ + return mDrawingCheckBox->isChecked(); +} + +bool UBCompassAngleRotateDialog::isAbsolutely() +{ + return mIsAbsolutely; +} + +qreal UBCompassAngleRotateDialog::Angle() +{ + return mAngleSpinBox->value(); +} + +void UBCompassAngleRotateDialog::clearData() +{ + mDrawingCheckBox->setChecked(false); + mAngleSpinBox->setValue(0); +} diff --git a/src/tools/UBGraphicsCompass.h b/src/tools/UBGraphicsCompass.h index 2af5e23cb..a6a296393 100644 --- a/src/tools/UBGraphicsCompass.h +++ b/src/tools/UBGraphicsCompass.h @@ -32,11 +32,39 @@ #include #include +#include +#include +#include #include "core/UB.h" #include "domain/UBItem.h" class UBGraphicsScene; +class UBGraphicsCompass; + +class UBCompassAngleRotateDialog: public QDialog +{ + Q_OBJECT; + + public: + explicit UBCompassAngleRotateDialog(UBGraphicsCompass* compass, QWidget *parent = nullptr); + bool isDrawing(); + bool isAbsolutely(); + void clearData(); + qreal Angle(); + ~UBCompassAngleRotateDialog(); + private: + QCheckBox* mDrawingCheckBox; + QDoubleSpinBox* mAngleSpinBox; + bool mIsAbsolutely; + UBGraphicsCompass* mCompass; + protected slots: + void RotateAbsolutely(); + void RotateRelative(); + signals: + void rotate(); + +}; class UBGraphicsCompass: public QObject, public QGraphicsRectItem, public UBItem { @@ -57,6 +85,9 @@ class UBGraphicsCompass: public QObject, public QGraphicsRectItem, public UBItem virtual void copyItemParameters(UBItem *copy) const; + + void angleRotateDialogResult(); + protected: virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *styleOption, QWidget *widget); virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value); @@ -72,6 +103,9 @@ class UBGraphicsCompass: public QObject, public QGraphicsRectItem, public UBItem private slots: void penColorChanged(); void lineWidthChanged(); + void setNormalizePos(bool); + void setNormalizeSize(bool); + void setMenuActions(); private: // Helpers @@ -82,6 +116,11 @@ class UBGraphicsCompass: public QObject, public QGraphicsRectItem, public UBItem void updateResizeCursor(); void updateDrawCursor(); void paintCenterCross(); + void normalizePos(); + void normalizeSize(); + QPointF nearPointFromGrid(QPointF point); + void showSettings(); + void decorateSettingsMenu(QMenu* menu); QCursor moveCursor() const; QCursor resizeCursor() const; @@ -93,6 +132,9 @@ class UBGraphicsCompass: public QObject, public QGraphicsRectItem, public UBItem QPointF pencilPosition() const; QRectF closeButtonRect() const; QRectF resizeButtonRect() const; + QRectF settingsButtonRect() const; + QRectF rightAngleButtonRect() const; + QRectF angleRotateButtonRect() const; virtual QPainterPath shape() const; QPainterPath needleShape() const; QPainterPath pencilShape() const; @@ -121,8 +163,18 @@ class UBGraphicsCompass: public QObject, public QGraphicsRectItem, public UBItem bool mDrewCircle; QGraphicsSvgItem* mCloseSvgItem; QGraphicsSvgItem* mResizeSvgItem; + QGraphicsSvgItem* mSettingsSvgItem; + QGraphicsSvgItem* mRihtAngleSvgItem; + QGraphicsSvgItem* mAngleRotateSvgItem; qreal mAntiScaleRatio; bool mDrewCenterCross; + bool mNormalizePos; + bool mNormalizeSize; + QMenu* mSettingsMenu; + QAction *mNormalizePosAction; + QAction *mNormalizeSizeAction; + UBCompassAngleRotateDialog* mAngleRotateDialog; + QLineF mBeforeRotatePosition; // Constants static const int sNeedleLength = 12;