PyObject *scribus_newline(PyObject* /* self */, PyObject* args) { double x, y, w, h; char *Name = const_cast<char*>(""); if (!PyArg_ParseTuple(args, "dddd|es", &x, &y, &w, &h, "utf-8", &Name)) return NULL; if(!checkHaveDocument()) return NULL; x = pageUnitXToDocX(x); y = pageUnitYToDocY(y); w = pageUnitXToDocX(w); h = pageUnitYToDocY(h); // if (ItemExists(QString::fromUtf8(Name))) // { // PyErr_SetString(NameExistsError, // QObject::tr("An object with the requested name already exists.", // "python error")); // return NULL; // } int i = ScCore->primaryMainWindow()->doc->itemAdd(PageItem::Line, PageItem::Unspecified, x, y, w, h, ScCore->primaryMainWindow()->doc->itemToolPrefs().shapeLineWidth, ScCore->primaryMainWindow()->doc->itemToolPrefs().shapeFillColor, ScCore->primaryMainWindow()->doc->itemToolPrefs().shapeLineColor, true); PageItem *it = ScCore->primaryMainWindow()->doc->Items->at(i); it->setRotation(xy2Deg(w-x, h-y)); it->setWidthHeight(sqrt(pow(x-w, 2.0) + pow(y-h, 2.0)), 1.0); it->Sizing = false; it->updateClip(); it->setRedrawBounding(); // ScCore->primaryMainWindow()->doc->setRedrawBounding(it); /* WTF? maybe I'll examine who's author later. Or maybe I'll remove it later ;) it->PoLine.resize(4); it->PoLine.setPoint(0, 0, 0); it->PoLine.setPoint(1, 0, 0); it->PoLine.setPoint(2, w-x, h-y); it->PoLine.setPoint(3, w-x, h-y); FPoint np2 = getMinClipF(&it->PoLine); if (np2.x() < 0) { it->PoLine.translate(-np2.x(), 0); ScCore->primaryMainWindow()->view->MoveItem(np2.x(), 0, it); } if (np2.y() < 0) { it->PoLine.translate(0, -np2.y()); ScCore->primaryMainWindow()->view->MoveItem(0, np2.y(), it); } ScCore->primaryMainWindow()->view->SizeItem(it->PoLine.WidthHeight().x(), it->PoLine.WidthHeight().y(), i, false, false, false); ScCore->primaryMainWindow()->view->AdjustItemSize(it);*/ if (Name != EMPTY_STRING) { QString objName = QString::fromUtf8(Name); if (!ItemExists(objName)) ScCore->primaryMainWindow()->doc->Items->at(i)->setItemName(objName); } return PyString_FromString(it->itemName().toUtf8()); }
double LineMove::rotation() const { double rot = xy2Deg(m_bounds.width(), m_bounds.height()); if (rot < 0.0) return 360 + rot; else return rot; }
void PropertiesPalette_Group::handleSpecialGradient(double x1, double y1, double x2, double y2, double fx, double fy, double sg, double sk) { if (!m_ScMW || m_ScMW->scriptIsRunning()) return; if ((m_haveDoc) && (m_haveItem)) { QRectF upRect; m_item->GrMaskStartX = x1 / m_unitRatio; m_item->GrMaskStartY = y1 / m_unitRatio; m_item->GrMaskEndX = x2 / m_unitRatio; m_item->GrMaskEndY = y2 / m_unitRatio; m_item->GrMaskFocalX = fx / m_unitRatio; m_item->GrMaskFocalY = fy / m_unitRatio; m_item->GrMaskScale = sg; m_item->GrMaskSkew = sk; if ((m_item->GrMask == 1) || (m_item->GrMask == 4)) { m_item->GrMaskFocalX = m_item->GrMaskStartX; m_item->GrMaskFocalY = m_item->GrMaskStartY; } m_item->update(); upRect = QRectF(QPointF(m_item->GrMaskStartX, m_item->GrMaskStartY), QPointF(m_item->GrMaskEndX, m_item->GrMaskEndY)); double radEnd = distance(m_item->GrMaskEndX - m_item->GrMaskStartX, m_item->GrMaskEndY - m_item->GrMaskStartY); double rotEnd = xy2Deg(m_item->GrMaskEndX - m_item->GrMaskStartX, m_item->GrMaskEndY - m_item->GrMaskStartY); QTransform m; m.translate(m_item->GrMaskStartX, m_item->GrMaskStartY); m.rotate(rotEnd); m.rotate(-90); m.rotate(m_item->GrMaskSkew); m.translate(radEnd * m_item->GrMaskScale, 0); QPointF shP = m.map(QPointF(0,0)); upRect |= QRectF(shP, QPointF(m_item->GrMaskEndX, m_item->GrMaskEndY)).normalized(); upRect |= QRectF(shP, QPointF(m_item->GrMaskStartX, m_item->GrMaskStartY)).normalized(); upRect |= QRectF(shP, QPointF(0, 0)).normalized(); upRect |= QRectF(shP, QPointF(m_item->width(), m_item->height())).normalized(); upRect.translate(m_item->xPos(), m_item->yPos()); m_doc->regionsChanged()->update(upRect.adjusted(-10.0, -10.0, 10.0, 10.0)); emit DocChanged(); } }
PageItem* CreateMode::doCreateNewObject(void) { int z = -1; double rot, len; double wSize = canvasCurrCoord.x() - createObjectPos.x(); double hSize = canvasCurrCoord.y() - createObjectPos.y(); bool skipOneClick = (modifiers == Qt::ShiftModifier); if ((createObjectMode == modeDrawLine) || (createObjectMode == modeDrawTable2) || (createObjectMode == modeInsertPDFButton) || (createObjectMode == modeInsertPDFTextfield) || (createObjectMode == modeInsertPDFTextfield) || (createObjectMode == modeInsertPDFCheckbox) || (createObjectMode == modeInsertPDFCombobox) || (createObjectMode == modeInsertPDFListbox) || (createObjectMode == modeInsertPDFTextAnnotation) || (createObjectMode == modeInsertPDFLinkAnnotation) || (createObjectMode == modeInsertPDF3DAnnotation) || (createObjectMode == modeInsertPDFRadioButton)) { skipOneClick = false; } if (!skipOneClick) { if ((!m_view->moveTimerElapsed()) || ((fabs(wSize) < 2.0) && (fabs(hSize) < 2.0))) { if (!doOneClick(createObjectPos, canvasCurrCoord)) { return NULL; } } } wSize = canvasCurrCoord.x() - createObjectPos.x(); hSize = canvasCurrCoord.y() - createObjectPos.y(); //Lock Height to Width for Control Modifier for final item creation if (createObjectMode != modeDrawLine) { if (modifiers == Qt::ControlModifier) hSize = wSize; } PageItem *newObject = NULL, *currItem = NULL; // FIXME for modeDrawLine QRectF createObjectRect(createObjectPos.x(), createObjectPos.y(), wSize, hSize); if (createObjectMode != modeDrawLine) { createObjectRect = createObjectRect.normalized(); if (modifiers==Qt::ControlModifier) { //bottom right and upper left are ok //upper right if (canvasCurrCoord.y() < createObjectPos.y() && createObjectPos.x()<canvasCurrCoord.x()) createObjectRect.translate(0.0, -createObjectRect.height()); //bottom left if (canvasCurrCoord.x()<createObjectPos.x() && canvasCurrCoord.y()>createObjectPos.y()) createObjectRect.translate(0.0, createObjectRect.height()); } } double Rxp = createObjectRect.x(); double Ryp = createObjectRect.y(); double Rxpd = createObjectRect.width(); double Rypd = createObjectRect.height(); switch (createObjectMode) { case modeDrawShapes: switch (createObjectSubMode) { case 0: if (modifiers == Qt::ShiftModifier) z = m_doc->itemAddArea(PageItem::Polygon, PageItem::Rectangle, Rxp, Ryp, m_doc->itemToolPrefs().shapeLineWidth, m_doc->itemToolPrefs().shapeFillColor, m_doc->itemToolPrefs().shapeLineColor); else z = m_doc->itemAdd(PageItem::Polygon, PageItem::Rectangle, Rxp, Ryp, Rxpd, Rypd, m_doc->itemToolPrefs().shapeLineWidth, m_doc->itemToolPrefs().shapeFillColor, m_doc->itemToolPrefs().shapeLineColor); m_doc->Items->at(z)->FrameType = 0; break; case 1: if (modifiers == Qt::ShiftModifier) z = m_doc->itemAddArea(PageItem::Polygon, PageItem::Ellipse, Rxp, Ryp, m_doc->itemToolPrefs().shapeLineWidth, m_doc->itemToolPrefs().shapeFillColor, m_doc->itemToolPrefs().shapeLineColor); else z = m_doc->itemAdd(PageItem::Polygon, PageItem::Ellipse, Rxp, Ryp, Rxpd, Rypd, m_doc->itemToolPrefs().shapeLineWidth, m_doc->itemToolPrefs().shapeFillColor, m_doc->itemToolPrefs().shapeLineColor); m_doc->Items->at(z)->FrameType = 1; break; default: if (modifiers == Qt::ShiftModifier) z = m_doc->itemAddArea(PageItem::Polygon, PageItem::Unspecified, Rxp, Ryp, m_doc->itemToolPrefs().shapeLineWidth, m_doc->itemToolPrefs().shapeFillColor, m_doc->itemToolPrefs().shapeLineColor); else z = m_doc->itemAdd(PageItem::Polygon, PageItem::Unspecified, Rxp, Ryp, Rxpd, Rypd, m_doc->itemToolPrefs().shapeLineWidth, m_doc->itemToolPrefs().shapeFillColor, m_doc->itemToolPrefs().shapeLineColor); m_doc->Items->at(z)->SetFrameShape(m_doc->ValCount, m_doc->ShapeValues); m_doc->adjustItemSize(m_doc->Items->at(z)); m_doc->setRedrawBounding(m_doc->Items->at(z)); m_doc->Items->at(z)->FrameType = createObjectSubMode + 2; break; } break; case modeDrawLine: Rxp = createObjectPos.x(); Ryp = createObjectPos.y(); m_doc->ApplyGuides(&Rxp, &Ryp); m_doc->ApplyGuides(&Rxp, &Ryp,true); rot = xy2Deg(Rxpd, Rypd); if (rot < 0.0) rot += 360; len = qMax(0.01, distance(Rxpd, Rypd)); z = m_doc->itemAdd(PageItem::Line, PageItem::Unspecified, Rxp, Ryp, len, 1, m_doc->itemToolPrefs().lineWidth, CommonStrings::None, m_doc->itemToolPrefs().lineColor); m_doc->Items->at(z)->setRotation(rot); m_doc->Items->at(z)->setRedrawBounding(); break; case modeDrawLatex: if (modifiers == Qt::ShiftModifier) z = m_doc->itemAddArea(PageItem::LatexFrame, PageItem::Unspecified, Rxp, Ryp, 1, m_doc->itemToolPrefs().imageFillColor, m_doc->itemToolPrefs().imageStrokeColor); else z = m_doc->itemAdd(PageItem::LatexFrame, PageItem::Unspecified, Rxp, Ryp, Rxpd, Rypd, m_doc->itemToolPrefs().shapeLineWidth, m_doc->itemToolPrefs().imageFillColor, m_doc->itemToolPrefs().imageStrokeColor); break; case modeDrawImage: if (modifiers == Qt::ShiftModifier) z = m_doc->itemAddArea(PageItem::ImageFrame, PageItem::Unspecified, Rxp, Ryp, 1, m_doc->itemToolPrefs().imageFillColor, m_doc->itemToolPrefs().imageStrokeColor); else z = m_doc->itemAdd(PageItem::ImageFrame, PageItem::Unspecified, Rxp, Ryp, Rxpd, Rypd, m_doc->itemToolPrefs().shapeLineWidth, m_doc->itemToolPrefs().imageFillColor, m_doc->itemToolPrefs().imageStrokeColor); break; case modeDrawText: if (modifiers == Qt::ShiftModifier) z = m_doc->itemAddArea(PageItem::TextFrame, PageItem::Unspecified, Rxp, Ryp, m_doc->itemToolPrefs().shapeLineWidth, CommonStrings::None, m_doc->itemToolPrefs().textFont); else z = m_doc->itemAdd(PageItem::TextFrame, PageItem::Unspecified, Rxp, Ryp, Rxpd, Rypd, m_doc->itemToolPrefs().shapeLineWidth, CommonStrings::None, m_doc->itemToolPrefs().textFont); break; case modeDrawRegularPolygon: if (modifiers == Qt::ShiftModifier) z = m_doc->itemAddArea(PageItem::RegularPolygon, PageItem::Unspecified, Rxp, Ryp, m_doc->itemToolPrefs().shapeLineWidth, m_doc->itemToolPrefs().shapeFillColor, m_doc->itemToolPrefs().lineColor); else z = m_doc->itemAdd(PageItem::RegularPolygon, PageItem::Unspecified, Rxp, Ryp, Rxpd, Rypd, m_doc->itemToolPrefs().shapeLineWidth, m_doc->itemToolPrefs().shapeFillColor, m_doc->itemToolPrefs().lineColor); break; case modeDrawArc: if (modifiers == Qt::ShiftModifier) z = m_doc->itemAddArea(PageItem::Arc, PageItem::Unspecified, Rxp, Ryp, m_doc->itemToolPrefs().shapeLineWidth, m_doc->itemToolPrefs().shapeFillColor, m_doc->itemToolPrefs().lineColor); else z = m_doc->itemAdd(PageItem::Arc, PageItem::Unspecified, Rxp, Ryp, Rxpd, Rypd, m_doc->itemToolPrefs().shapeLineWidth, m_doc->itemToolPrefs().shapeFillColor, m_doc->itemToolPrefs().lineColor); m_doc->setRedrawBounding(m_doc->Items->at(z)); break; case modeDrawSpiral: if (modifiers == Qt::ShiftModifier) z = m_doc->itemAddArea(PageItem::Spiral, PageItem::Unspecified, Rxp, Ryp, m_doc->itemToolPrefs().shapeLineWidth, CommonStrings::None, m_doc->itemToolPrefs().lineColor); else z = m_doc->itemAdd(PageItem::Spiral, PageItem::Unspecified, Rxp, Ryp, Rxpd, Rypd, m_doc->itemToolPrefs().shapeLineWidth, CommonStrings::None, m_doc->itemToolPrefs().lineColor); m_doc->adjustItemSize(m_doc->Items->at(z)); m_doc->setRedrawBounding(m_doc->Items->at(z)); break; case modeInsertPDFButton: case modeInsertPDFRadioButton: case modeInsertPDFTextfield: case modeInsertPDFCheckbox: case modeInsertPDFCombobox: case modeInsertPDFListbox: case modeInsertPDFTextAnnotation: case modeInsertPDFLinkAnnotation: z = m_doc->itemAdd(PageItem::TextFrame, PageItem::Unspecified, Rxp, Ryp, Rxpd, Rypd, m_doc->itemToolPrefs().shapeLineWidth, CommonStrings::None, m_doc->itemToolPrefs().textColor); currItem = m_doc->Items->at(z); currItem->setIsAnnotation(true); currItem->AutoName = false; switch (m_doc->appMode) { case modeInsertPDFButton: currItem->annotation().setType(Annotation::Button); currItem->annotation().setFlag(Annotation::Flag_PushButton); currItem->setItemName( CommonStrings::itemName_PushButton + QString("%1").arg(m_doc->TotalItems)); break; case modeInsertPDFRadioButton: currItem->annotation().setType(Annotation::RadioButton); currItem->annotation().setFlag(Annotation::Flag_Radio | Annotation::Flag_NoToggleToOff); currItem->setItemName( CommonStrings::itemName_RadioButton + QString("%1").arg(m_doc->TotalItems)); break; case modeInsertPDFTextfield: currItem->annotation().setType(Annotation::Textfield); currItem->setItemName( CommonStrings::itemName_TextField + QString("%1").arg(m_doc->TotalItems)); break; case modeInsertPDFCheckbox: currItem->annotation().setType(Annotation::Checkbox); currItem->setItemName( CommonStrings::itemName_CheckBox + QString("%1").arg(m_doc->TotalItems)); break; case modeInsertPDFCombobox: currItem->annotation().setType(Annotation::Combobox); currItem->annotation().setFlag(Annotation::Flag_Combo); currItem->setItemName( CommonStrings::itemName_ComboBox + QString("%1").arg(m_doc->TotalItems)); break; case modeInsertPDFListbox: currItem->annotation().setType(Annotation::Listbox); currItem->setItemName( CommonStrings::itemName_ListBox + QString("%1").arg(m_doc->TotalItems)); break; case modeInsertPDFTextAnnotation: currItem->annotation().setType(Annotation::Text); currItem->setItemName( CommonStrings::itemName_TextAnnotation + QString("%1").arg(m_doc->TotalItems)); break; case modeInsertPDFLinkAnnotation: currItem->annotation().setType(Annotation::Link); currItem->annotation().setZiel(m_doc->currentPage()->pageNr()); currItem->annotation().setAction("0 0"); currItem->setItemName( CommonStrings::itemName_LinkAnnotation + QString("%1").arg(m_doc->TotalItems)); currItem->setTextFlowMode(PageItem::TextFlowDisabled); break; } break; case modeDrawTable2: // TODO: Figure out what these conditions actually do. if ((m_doc->m_Selection->count() == 0) && (m_view->HaveSelRect) && (!m_view->MidButt)) { m_view->HaveSelRect = false; // Calculate table rectangle. FRect tableRect = adjustedRect(canvasPressCoord, canvasCurrCoord); if (tableRect.width() < 6 || tableRect.height() < 6) { // Ignore tiny tables. m_view->requestMode(submodePaintingDone); break; } // Show table insert dialog. // qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor)); InsertTable *dia = new InsertTable(m_view, static_cast<int>(tableRect.height()/6), static_cast<int>(tableRect.width()/6)); if (!dia->exec()) { m_view->requestMode(submodePaintingDone); delete dia; dia = 0; break; } int numRows = dia->Rows->value(); int numColumns = dia->Cols->value(); delete dia; dia = 0; // Add the table item. // TODO: This should be done in an undo transaction. m_doc->dontResize = true; z = m_doc->itemAdd(PageItem::Table, PageItem::Unspecified, tableRect.x(), tableRect.y(), tableRect.width(), tableRect.height(), 0, // Unused. CommonStrings::None, // Unused. CommonStrings::None); // Unused. PageItem_Table *table = m_doc->Items->at(z)->asTable(); table->insertRows(0, numRows - 1); table->insertColumns(0, numColumns - 1); table->adjustTableToFrame(); table->adjustFrameToTable(); m_doc->dontResize = false; m_doc->setRedrawBounding(table); } break; case modeInsertPDF3DAnnotation: if (modifiers == Qt::ShiftModifier) { z = m_doc->itemAddArea(PageItem::OSGFrame, PageItem::Unspecified, Rxp, Ryp, 1, m_doc->itemToolPrefs().imageFillColor, m_doc->itemToolPrefs().imageStrokeColor); } else { z = m_doc->itemAdd(PageItem::OSGFrame, PageItem::Unspecified, Rxp, Ryp, Rxpd, Rypd, m_doc->itemToolPrefs().shapeLineWidth, m_doc->itemToolPrefs().imageFillColor, m_doc->itemToolPrefs().imageStrokeColor); } currItem = m_doc->Items->at(z); currItem->setIsAnnotation(true); currItem->AutoName = false; currItem->annotation().setType(Annotation::Annot3D); currItem->setItemName( tr("3DAnnot") + QString("%1").arg(m_doc->TotalItems)); break; } if (z >= 0) { SetupDrawNoResize(z); newObject = m_doc->Items->at(z); newObject->ContourLine = newObject->PoLine.copy(); } return newObject; }
void CreateMode::mouseMoveEvent(QMouseEvent *m) { const FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos()); modifiers = m->modifiers(); double newX, newY; PageItem *currItem; QPoint np, np2, mop; QPainter p; QRect tx; m->accept(); // qDebug() << "legacy mode move:" << m->x() << m->y() << m_canvas->globalToCanvas(m->globalPos()).x() << m_canvas->globalToCanvas(m->globalPos()).y(); // emit MousePos(m->x()/m_canvas->scale(),// + m_doc->minCanvasCoordinate.x(), // m->y()/m_canvas->scale()); // + m_doc->minCanvasCoordinate.y()); if (commonMouseMove(m)) return; if (GetItem(&currItem)) { newX = mousePointDoc.x(); //m_view->translateToDoc(m->x(), m->y()).x()); newY = mousePointDoc.y(); //m_view->translateToDoc(m->x(), m->y()).y()); if (m_doc->DragP) return; } else { if ((m_MouseButtonPressed) && (m->buttons() & Qt::LeftButton)) { newX = mousePointDoc.x(); newY = mousePointDoc.y(); if (createObjectMode == modeDrawLine) { if (m_doc->SnapGrid) { newX = qRound(newX / m_doc->guidesPrefs().minorGridSpacing) * m_doc->guidesPrefs().minorGridSpacing; newY = qRound(newY / m_doc->guidesPrefs().minorGridSpacing) * m_doc->guidesPrefs().minorGridSpacing; } if (m->modifiers() & Qt::ControlModifier) { QRectF bounds(QPointF(createObjectPos.x(), createObjectPos.y()), QPointF(newX, newY)); double newRot = xy2Deg(bounds.width(), bounds.height()); if (newRot < 0.0) newRot += 360; newRot = constrainAngle(newRot, m_doc->opToolPrefs().constrain); double len = qMax(0.01, distance(bounds.width(), bounds.height())); bounds.setSize(len * QSizeF(cosd(newRot), sind(newRot))); newX = bounds.right(); newY = bounds.bottom(); } } //CB: #8099: Readd snapping for drag creation of lines by commenting this else.. //else //{ FPoint np2 = m_doc->ApplyGridF(FPoint(newX, newY)); double nx = np2.x(); double ny = np2.y(); m_doc->ApplyGuides(&nx, &ny); m_doc->ApplyGuides(&nx, &ny,true); if(nx!=np2.x()) xSnap = nx; if(ny!=np2.y()) ySnap = ny; // #8959 : suppress qRound here as this prevent drawing line with angle constrain // precisely and does not allow to stick precisely to grid or guides newX = /*qRound(*/nx/*)*/; newY = /*qRound(*/ny/*)*/; //} canvasCurrCoord.setXY(newX, newY); m_view->HaveSelRect = true; double wSize = canvasCurrCoord.x() - createObjectPos.x(); double hSize = canvasCurrCoord.y() - createObjectPos.y(); QRectF createObjectRect(createObjectPos.x(), createObjectPos.y(), wSize, hSize); createObjectRect = createObjectRect.normalized(); if (createObjectMode != modeDrawLine) { if (modifiers == Qt::ControlModifier) hSize = wSize; m_canvas->displaySizeHUD(m->globalPos(), wSize, hSize, false); } else { double angle = -xy2Deg(wSize, hSize); if (angle < 0.0) angle = angle + 360; double trueLength = sqrt(pow(createObjectRect.width(), 2) + pow(createObjectRect.height(), 2)); m_canvas->displaySizeHUD(m->globalPos(), trueLength, angle, true); } // Necessary for drawControls to be called m_canvas->repaint(); } else m_canvas->displayCorrectedXYHUD(m->globalPos(), mousePointDoc.x(), mousePointDoc.y()); } }
void MeasurementsMode::showValues() { double dx = m_currentDoc.x() - m_startDoc.x(); double dy = m_currentDoc.y() - m_startDoc.y(); m_palette->setValues(m_startDoc.x(), m_startDoc.y(), m_currentDoc.x(), m_currentDoc.y(), -xy2Deg(dx, dy), sqrt(dx*dx + dy*dy)); m_canvas->update(QRect(m_start, m_current).normalized()); }
void CanvasMode_Rotate::getNewItemPosition(PageItem* item, FPoint& pos, double& rotation) { double newAngle = xy2Deg(m_canvasCurrCoord.x() - m_rotCenter.x(), m_canvasCurrCoord.y() - m_rotCenter.y()); if (m_angleConstrained) { newAngle = constrainAngle(newAngle, m_doc->toolSettings.constrain); /*double oldAngle = constrainAngle(m_startAngle, m_doc->toolSettings.constrain); newAngle = m_doc->m_Selection->isMultipleSelection() ? (newAngle - oldAngle) : newAngle;*/ m_view->oldW = constrainAngle(m_view->oldW, m_doc->toolSettings.constrain); newAngle = m_doc->m_Selection->isMultipleSelection() ? (newAngle - m_view->oldW) : newAngle; } else if (m_doc->m_Selection->isMultipleSelection()) newAngle = (newAngle - m_startAngle); else newAngle = item->rotation() - (m_startAngle - newAngle); if (m_doc->m_Selection->isMultipleSelection()) { QMatrix ma; ma.translate(m_rotCenter.x(), m_rotCenter.y()); ma.scale(1, 1); ma.rotate(newAngle); FPoint n(item->xPos() - m_rotCenter.x(), item->yPos() - m_rotCenter.y()); pos.setXY(ma.m11() * n.x() + ma.m21() * n.y() + ma.dx(), ma.m22() * n.y() + ma.m12() * n.x() + ma.dy()); rotation = item->rotation() + newAngle; } else if (m_rotMode != 0) { FPoint n(0,0); QMatrix ma; ma.translate(item->xPos(), item->yPos()); ma.scale(1, 1); ma.rotate(item->rotation()); double ro = newAngle - item->rotation(); switch (m_rotMode) { case 2: ma.translate(item->width()/2.0, item->height()/2.0); n = FPoint(-item->width()/2.0, -item->height()/2.0); break; case 4: ma.translate(item->width(), item->height()); n = FPoint(-item->width(), -item->height()); break; case 3: ma.translate(0, item->height()); n = FPoint(0, -item->height()); break; case 1: ma.translate(item->width(), 0); n = FPoint(-item->width(), 0); break; } ma.rotate(ro); pos.setXY(ma.m11() * n.x() + ma.m21() * n.y() + ma.dx(), ma.m22() * n.y() + ma.m12() * n.x() + ma.dy()); rotation = newAngle; } else { pos.setXY(item->xPos(), item->yPos()); rotation = newAngle; } }
void CanvasMode_Rotate::mouseReleaseEvent(QMouseEvent *m) { #ifdef GESTURE_FRAME_PREVIEW clearPixmapCache(); #endif // GESTURE_FRAME_PREVIEW const FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos()); PageItem *currItem; m_canvas->m_viewMode.m_MouseButtonPressed = false; m_canvas->resetRenderMode(); m->accept(); // m_view->stopDragTimer(); if ((GetItem(&currItem)) && (m->button() == Qt::RightButton)) { createContextMenu(currItem, mousePointDoc.x(), mousePointDoc.y()); return; } m_inItemRotation = false; if (m_view->moveTimerElapsed() && (GetItem(&currItem))) { // m_view->stopDragTimer(); //Always start group transaction as a rotate action is generally a combination of //a change of rotation + a change of position if (!m_view->groupTransactionStarted() /*&& m_doc->m_Selection->isMultipleSelection()*/) { m_view->startGroupTransaction(Um::Rotate, "", Um::IRotate); } double newW = xy2Deg(mousePointDoc.x()-m_view->RCenter.x(), mousePointDoc.y()-m_view->RCenter.y()); //xy2Deg(m->x()/sc - m_view->RCenter.x(), m->y()/sc - m_view->RCenter.y()); if (m->modifiers() & Qt::ControlModifier) { newW=constrainAngle(newW, m_doc->toolSettings.constrain); m_view->oldW=constrainAngle(m_view->oldW, m_doc->toolSettings.constrain); //RotateGroup uses MoveBy so its pretty hard to constrain the result if (m_doc->m_Selection->isMultipleSelection()) m_doc->rotateGroup(newW-m_view->oldW, m_view->RCenter); else m_doc->RotateItem(newW, currItem->ItemNr); } else { if (m_doc->m_Selection->isMultipleSelection()) m_doc->rotateGroup(newW - m_view->oldW, m_view->RCenter); else m_doc->RotateItem(currItem->rotation() - (m_view->oldW - newW), currItem->ItemNr); } m_view->oldW = newW; m_canvas->setRenderModeUseBuffer(false); if (!m_doc->m_Selection->isMultipleSelection()) { m_doc->setRedrawBounding(currItem); currItem->OwnPage = m_doc->OnPage(currItem); if (currItem->asLine()) m_view->updateContents(); } } m_doc->RotMode = m_oldRotMode; m_view->RCenter = m_oldRotCenter; if (!PrefsManager::instance()->appPrefs.stickyTools) m_view->requestMode(modeNormal); else { int appMode = m_doc->appMode; m_view->requestMode(appMode); } if (GetItem(&currItem)) { if (m_doc->m_Selection->count() > 1) { m_doc->m_Selection->setGroupRect(); double x, y, w, h; m_doc->m_Selection->getGroupRect(&x, &y, &w, &h); m_view->updateContents(QRect(static_cast<int>(x-5), static_cast<int>(y-5), static_cast<int>(w+10), static_cast<int>(h+10))); } // Handled normally automatically by Selection in sendSignals() /*else currItem->emitAllToGUI();*/ } m_canvas->setRenderModeUseBuffer(false); m_doc->leaveDrag = false; m_view->MidButt = false; if (m_view->groupTransactionStarted()) { for (int i = 0; i < m_doc->m_Selection->count(); ++i) m_doc->m_Selection->itemAt(i)->checkChanges(true); m_view->endGroupTransaction(); } for (int i = 0; i < m_doc->m_Selection->count(); ++i) m_doc->m_Selection->itemAt(i)->checkChanges(true); //Make sure the Zoom spinbox and page selector dont have focus if we click on the canvas m_view->zoomSpinBox->clearFocus(); m_view->pageSelector->clearFocus(); }
void CanvasMode_Rotate::mousePressEvent(QMouseEvent *m) { const FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos()); m_canvasPressCoord = mousePointDoc; double Rxp = 0, Ryp = 0; PageItem *currItem; m_canvas->PaintSizeRect(QRect()); QRect tx; QMatrix pm; m_canvas->m_viewMode.m_MouseButtonPressed = true; m_canvas->m_viewMode.operItemMoving = false; m_view->HaveSelRect = false; m_doc->leaveDrag = false; m->accept(); m_view->registerMousePress(m->globalPos()); QRect mpo(m->x()-m_doc->guidesSettings.grabRad, m->y()-m_doc->guidesSettings.grabRad, m_doc->guidesSettings.grabRad*2, m_doc->guidesSettings.grabRad*2); Rxp = m_doc->ApplyGridF(m_canvasPressCoord).x(); m_canvasPressCoord.setX( qRound(Rxp) ); Ryp = m_doc->ApplyGridF(m_canvasPressCoord).y(); m_canvasPressCoord.setY( qRound(Ryp) ); if (m->button() == Qt::MidButton) { m_view->MidButt = true; if (m->modifiers() & Qt::ControlModifier) m_view->DrawNew(); return; } if (m->button() != Qt::LeftButton) return; if (GetItem(&currItem)) { m_inItemRotation = true; m_oldRotMode = m_rotMode = m_doc->RotMode; m_oldRotCenter = m_rotCenter = m_view->RCenter; if (m_doc->m_Selection->isMultipleSelection()) { double gx, gy, gh, gw; double gxR, gyR, ghR, gwR; m_view->getGroupRectScreen(&gx, &gy, &gw, &gh); m_doc->m_Selection->getGroupRect(&gxR, &gyR, &gwR, &ghR); if (QRect(static_cast<int>(gx), static_cast<int>(gy), static_cast<int>(gw), static_cast<int>(gh)).intersects(mpo)) { m_rotMode = 2; m_rotCenter = FPoint(gxR+gwR/2.0, gyR+ghR/2.0); if (QRect(static_cast<int>(gx+gw)-6, static_cast<int>(gy+gh)-6, 6, 6).intersects(mpo)) { m_rotCenter = FPoint(gxR, gyR); m_rotMode = 0; } m_doc->RotMode = m_rotMode; m_view->RCenter = m_rotCenter; } m_startAngle = xy2Deg(mousePointDoc.x() - m_view->RCenter.x(), mousePointDoc.y() - m_view->RCenter.y()); m_view->oldW = m_startAngle; } else { QMatrix mat; m_canvas->Transform(currItem, mat); m_rotMode = 2; m_rotCenter = FPoint(currItem->width()/2, currItem->height()/2, 0, 0, currItem->rotation(), 1, 1, false); // if (!currItem->asLine()) // { if (QRegion(mat.map(QPolygon(QRect(0, 0, static_cast<int>(currItem->width()), static_cast<int>(currItem->height()))))).contains(mpo)) { if (mat.mapRect(QRect(0, 0, 6, 6)).intersects(mpo)) { m_rotCenter = FPoint(currItem->width(), currItem->height(), 0, 0, currItem->rotation(), 1, 1, false); m_rotMode = 4; } else if (mat.mapRect(QRect(static_cast<int>(currItem->width())-6, 0, 6, 6)).intersects(mpo)) { m_rotCenter = FPoint(0, currItem->height(), 0, 0, currItem->rotation(), 1, 1, false); m_rotMode = 3; } else if (mat.mapRect(QRect(static_cast<int>(currItem->width())-6, static_cast<int>(currItem->height())-6, 6, 6)).intersects(mpo)) { m_rotCenter = FPoint(0, 0); m_rotMode = 0; } else if (mat.mapRect(QRect(0, static_cast<int>(currItem->height())-6, 6, 6)).intersects(mpo)) { m_rotCenter = FPoint(currItem->width(), 0, 0, 0, currItem->rotation(), 1, 1, false); m_rotMode = 1; } } m_doc->RotMode = m_rotMode; m_view->RCenter = m_rotCenter; // } m_view->RCenter = m_rotCenter = FPoint(currItem->xPos()+ m_view->RCenter.x(), currItem->yPos()+ m_view->RCenter.y()); //????? m_view->oldW = m_startAngle = xy2Deg(mousePointDoc.x() - m_view->RCenter.x(), mousePointDoc.y() - m_view->RCenter.y()); } } }