void CanvasMode_EditArc::mouseMoveEvent(QMouseEvent *m) { const FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos()); m->accept(); double newX = mousePointDoc.x(); double newY = mousePointDoc.y(); if (m_canvas->m_viewMode.m_MouseButtonPressed && m_view->moveTimerElapsed()) { PageItem *currItem = m_doc->m_Selection->itemAt(0); QTransform itemMatrix = currItem->getTransform(); QPointF sPoint = currItem->PoLine.pointQF(0); QPointF smPoint = itemMatrix.map(sPoint); QLineF stLinA = QLineF(smPoint, QPointF(m_Mxp, m_Myp)); QLineF stLinM = QLineF(smPoint, QPointF(newX, newY)); double deltaAngle = stLinM.angle() - stLinA.angle(); QPainterPath pp; if (m_arcPoint == useControlStart) m_startAngle += deltaAngle; else if (m_arcPoint == useControlSweep) m_endAngle += deltaAngle; else if (m_arcPoint == useControlHeight) m_heightPoint = QPointF(m_heightPoint.x(), m_heightPoint.y() + (newY - m_Myp)); else if (m_arcPoint == useControlWidth) m_widthPoint = QPointF(m_widthPoint.x() + (newX - m_Mxp), m_widthPoint.y()); double nSweep = m_endAngle - m_startAngle; if (nSweep < 0) nSweep += 360; double nWidth = sPoint.x() - m_widthPoint.x(); double nHeight = sPoint.y() - m_heightPoint.y(); if ((nWidth > 0) && (nHeight > 0)) { pp.moveTo(sPoint); pp.arcTo(QRectF(sPoint.x() - nWidth, sPoint.y() - nHeight, nWidth * 2, nHeight * 2), m_startAngle, nSweep); pp.closeSubpath(); FPointArray ar; ar.fromQPainterPath(pp); if (m_arcPoint == useControlStart) { m_startPoint = ar.pointQF(2); QLineF stLinA = QLineF(smPoint, itemMatrix.map(m_startPoint)); m_canvas->displayRotHUD(m->globalPos(), 360.0 - stLinA.angle()); } else if (m_arcPoint == useControlSweep) { m_endPoint = ar.pointQF(ar.size() - 4); QLineF stLinA = QLineF(smPoint, itemMatrix.map(m_endPoint)); m_canvas->displayRotHUD(m->globalPos(), 360.0 - stLinA.angle()); } QLineF res = QLineF(m_centerPoint, m_startPoint); QLineF swe = QLineF(m_centerPoint, m_endPoint); vectorDialog->setValues(res.angle(), swe.angle(), nHeight * 2, nWidth * 2); blockUpdateFromItem(true); currItem->update(); blockUpdateFromItem(false); m_doc->regionsChanged()->update(itemMatrix.mapRect(QRectF(0, 0, currItem->width(), currItem->height())).adjusted(-nWidth, -nHeight, nWidth, nHeight)); } } m_Mxp = newX; m_Myp = newY; }
bool LensEffectsPlugin::run(ScribusDoc* doc, QString) { ScribusDoc* currDoc = doc; if (currDoc == 0) currDoc = ScCore->primaryMainWindow()->doc; if (currDoc->m_Selection->count() > 0) { LensDialog *dia = new LensDialog(currDoc->scMW(), currDoc); if (dia->exec()) { for (int a = 0; a < dia->origPathItem.count(); a++) { PageItem *currItem = currDoc->m_Selection->itemAt(a); if (currItem->itemType() == PageItem::Line) continue; QPainterPath path = dia->origPathItem[a]->path(); FPointArray points; points.fromQPainterPath(path); currItem->PoLine = points; currItem->Frame = false; currItem->ClipEdited = true; currItem->FrameType = 3; currDoc->AdjustItemSize(currItem); currItem->OldB2 = currItem->width(); currItem->OldH2 = currItem->height(); currItem->updateClip(); currItem->ContourLine = currItem->PoLine.copy(); } currDoc->changed(); } delete dia; } return true; }
bool LensEffectsPlugin::run(ScribusDoc* doc, QString) { ScribusDoc* currDoc = doc; if (currDoc == 0) currDoc = ScCore->primaryMainWindow()->doc; if (currDoc->m_Selection->count() > 0) { LensDialog *dia = new LensDialog(currDoc->scMW(), currDoc); if (dia->exec()) { for (int a = 0; a < dia->origPathItem.count(); a++) { PageItem *currItem = dia->origPageItem[a]; if (currItem->itemType() == PageItem::Line) continue; QPainterPath path = dia->origPathItem[a]->path(); FPointArray points; points.fromQPainterPath(path); currItem->PoLine = points; currItem->ClipEdited = true; currItem->FrameType = 3; double oW = currItem->width(); double oH = currItem->height(); currDoc->adjustItemSize(currItem, true); currItem->OldB2 = currItem->width(); currItem->OldH2 = currItem->height(); if (currItem->isGroup()) { currItem->groupWidth = currItem->groupWidth * (currItem->OldB2 / oW); currItem->groupHeight = currItem->groupHeight * (currItem->OldH2 / oH); } currItem->updateClip(); if (currItem->isGroup()) { currDoc->resizeGroupToContents(currItem); currItem->SetRectFrame(); } currItem->ContourLine = currItem->PoLine.copy(); } if (currDoc->m_Selection->count() > 0) { PageItem *m_patternItem = currDoc->m_Selection->itemAt(0); if (m_patternItem->isGroup()) { currDoc->resizeGroupToContents(m_patternItem); m_patternItem->SetRectFrame(); } } currDoc->changed(); currDoc->view()->DrawNew(); } delete dia; } return true; }
void CanvasMode_EditArc::mouseMoveEvent(QMouseEvent *m) { const FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos()); m->accept(); double newX = mousePointDoc.x(); double newY = mousePointDoc.y(); if (m_canvas->m_viewMode.m_MouseButtonPressed && m_view->moveTimerElapsed()) { PageItem *currItem = m_doc->m_Selection->itemAt(0); QTransform itemMatrix; itemMatrix.translate(currItem->xPos(), currItem->yPos()); itemMatrix.rotate(currItem->rotation()); QPointF sPoint = currItem->PoLine.pointQF(0); QPointF smPoint = itemMatrix.map(sPoint); QLineF stLinA = QLineF(smPoint, QPointF(Mxp, Myp)); QLineF stLinM = QLineF(smPoint, QPointF(newX, newY)); double deltaAngle = stLinM.angle() - stLinA.angle(); QPainterPath pp; if (m_arcPoint == useControlStart) startAngle += deltaAngle; else if (m_arcPoint == useControlSweep) endAngle += deltaAngle; else if (m_arcPoint == useControlHeight) heightPoint = QPointF(heightPoint.x(), heightPoint.y() + (newY - Myp)); else if (m_arcPoint == useControlWidth) widthPoint = QPointF(widthPoint.x() + (newX - Mxp), widthPoint.y()); double nSweep = endAngle - startAngle; if (nSweep < 0) nSweep += 360; double nWidth = sPoint.x() - widthPoint.x(); double nHeight = sPoint.y() - heightPoint.y(); pp.moveTo(sPoint); pp.arcTo(QRectF(sPoint.x() - nWidth, sPoint.y() - nHeight, nWidth * 2, nHeight * 2), startAngle, nSweep); pp.closeSubpath(); FPointArray ar; ar.fromQPainterPath(pp); if (m_arcPoint == useControlStart) { startPoint = ar.pointQF(2); QLineF stLinA = QLineF(smPoint, itemMatrix.map(startPoint)); m_canvas->displayRotHUD(m->globalPos(), 360.0 - stLinA.angle()); } else if (m_arcPoint == useControlSweep) { endPoint = ar.pointQF(ar.size() - 4); QLineF stLinA = QLineF(smPoint, itemMatrix.map(endPoint)); m_canvas->displayRotHUD(m->globalPos(), 360.0 - stLinA.angle()); } QLineF res = QLineF(centerPoint, startPoint); QLineF swe = QLineF(centerPoint, endPoint); VectorDialog->setValues(res.angle(), swe.angle(), nHeight * 2, nWidth * 2); blockUpdateFromItem(true); currItem->update(); blockUpdateFromItem(false); QRectF upRect; upRect = QRectF(QPointF(0, 0), QPointF(currItem->width(), currItem->height())).normalized(); upRect.translate(currItem->xPos(), currItem->yPos()); m_doc->regionsChanged()->update(upRect.adjusted(-10.0 - currItem->width() / 2.0, -10.0 - currItem->height() / 2.0, 10.0 + currItem->width() / 2.0, 10.0 + currItem->height() / 2.0)); } Mxp = newX; Myp = newY; }
bool PathFinderPlugin::run(ScribusDoc* doc, QString) { QString vers = QString(qVersion()).left(5); if (vers < "4.3.3") { QMessageBox::information(doc->scMW(), tr("Qt Version too old"), tr("This plugin requires at least version 4.3.3 of the Qt library")); return true; } ScribusDoc* currDoc = doc; if (currDoc == 0) currDoc = ScCore->primaryMainWindow()->doc; if (currDoc->m_Selection->count() > 1) { PageItem *Item1 = currDoc->m_Selection->itemAt(0); PageItem *Item2 = currDoc->m_Selection->itemAt(1); PathFinderDialog *dia = new PathFinderDialog(currDoc->scMW(), currDoc, Item1, Item2); if (dia->exec()) { if (dia->keepItem1) { PageItem *newItem; if (dia->swapped) { newItem = new PageItem_Polygon(*Item2); newItem->setSelected(false); currDoc->Items->insert(Item2->ItemNr, newItem); } else { newItem = new PageItem_Polygon(*Item1); newItem->setSelected(false); currDoc->Items->insert(Item1->ItemNr, newItem); } } if (dia->keepItem2) { PageItem *newItem; if (dia->swapped) { newItem = new PageItem_Polygon(*Item1); newItem->setSelected(false); currDoc->Items->insert(Item1->ItemNr, newItem); } else { newItem = new PageItem_Polygon(*Item2); newItem->setSelected(false); currDoc->Items->insert(Item2->ItemNr, newItem); } } if (dia->keepItem1 || dia->keepItem2) currDoc->renumberItemsInListOrder(); if (dia->opMode != 4) { PageItem *currItem; QPainterPath path; FPointArray points; if (dia->targetColor == 0) { currItem = Item1; if (dia->swapped) { currItem = Item2; currItem->setXYPos(Item1->xPos(), Item1->yPos()); currItem->setRotation(0.0); } } else { if (dia->swapped) currItem = Item1; else { currItem = Item2; currItem->setXYPos(Item1->xPos(), Item1->yPos()); currItem->setRotation(0.0); } } path = dia->result; points.fromQPainterPath(path); currItem->PoLine = points; currItem->Frame = false; currItem->ClipEdited = true; currItem->FrameType = 3; currDoc->AdjustItemSize(currItem); currItem->OldB2 = currItem->width(); currItem->OldH2 = currItem->height(); currItem->updateClip(); currItem->ContourLine = currItem->PoLine.copy(); currDoc->m_Selection->removeItem(currItem); currDoc->itemSelection_DeleteItem(); } else { QPainterPath path; FPointArray points; PageItem *newItem; double i1x = Item1->xPos(); double i1y = Item1->yPos(); path = dia->result; if (!path.isEmpty()) { points.fromQPainterPath(path); Item1->PoLine = points; Item1->Frame = false; Item1->ClipEdited = true; Item1->FrameType = 3; currDoc->AdjustItemSize(Item1); Item1->OldB2 = Item1->width(); Item1->OldH2 = Item1->height(); Item1->updateClip(); Item1->ContourLine = Item1->PoLine.copy(); } path = QPainterPath(); path = dia->result1; if (!path.isEmpty()) { points.fromQPainterPath(path); Item2->setXYPos(i1x, i1y); Item2->setRotation(0.0); Item2->PoLine = points; Item2->Frame = false; Item2->ClipEdited = true; Item2->FrameType = 3; currDoc->AdjustItemSize(Item2); Item2->OldB2 = Item2->width(); Item2->OldH2 = Item2->height(); Item2->updateClip(); Item2->ContourLine = Item2->PoLine.copy(); } path = QPainterPath(); path = dia->result2; if (!path.isEmpty()) { if (dia->targetColor == 0) { newItem = new PageItem_Polygon(*Item1); newItem->setXYPos(i1x, i1y); } else { newItem = new PageItem_Polygon(*Item2); newItem->setXYPos(i1x, i1y); newItem->setRotation(0.0); } currDoc->Items->append(newItem); newItem->ItemNr = currDoc->Items->count()-1; newItem->setSelected(false); points.fromQPainterPath(path); newItem->PoLine = points; newItem->Frame = false; newItem->ClipEdited = true; newItem->FrameType = 3; currDoc->AdjustItemSize(newItem); newItem->OldB2 = newItem->width(); newItem->OldH2 = newItem->height(); newItem->updateClip(); newItem->ContourLine = newItem->PoLine.copy(); if (dia->targetColor == 2) { QString fill = dia->getOtherFillColor(); if (fill == CommonStrings::tr_NoneColor) fill = CommonStrings::None; newItem->setFillColor(fill); QString stroke = dia->getOtherLineColor(); if (stroke == CommonStrings::tr_NoneColor) stroke = CommonStrings::None; newItem->setLineColor(stroke); } } currDoc->m_Selection->clear(); currDoc->view()->Deselect(true); } currDoc->changed(); currDoc->view()->DrawNew(); } delete dia; } return true; }
bool PathFinderPlugin::run(ScribusDoc* doc, QString) { ScribusDoc* currDoc = doc; if (currDoc == 0) currDoc = ScCore->primaryMainWindow()->doc; if (currDoc->m_Selection->count() <= 1) return true; //<<#9046 UndoTransaction* activeTransaction = NULL; UndoManager* undoManager = UndoManager::instance(); if (UndoManager::undoEnabled()) activeTransaction = new UndoTransaction(undoManager->beginTransaction(Um::SelectionGroup, Um::IDocument, Um::PathOperation, "", Um::IPolygon)); //>>#9046 PageItem *Item1 = currDoc->m_Selection->itemAt(0); PageItem *Item2 = currDoc->m_Selection->itemAt(1); PathFinderDialog *dia = new PathFinderDialog(currDoc->scMW(), currDoc, Item1, Item2); if (dia->exec()) { int opMode=dia->opMode; if (dia->keepItem1) { PageItem *newItem; if (dia->swapped) { newItem = new PageItem_Polygon(*Item2); newItem->setSelected(false); currDoc->Items->insert(currDoc->Items->indexOf(Item2), newItem); } else { newItem = new PageItem_Polygon(*Item1); newItem->setSelected(false); currDoc->Items->insert(currDoc->Items->indexOf(Item1), newItem); } if (UndoManager::undoEnabled()) { ScItemState<PageItem*> *is = new ScItemState<PageItem*>("Create PageItem"); is->set("CREATE_ITEM", "create_item"); is->setItem(newItem); UndoObject *target = currDoc->Pages->at(Item1->OwnPage); undoManager->action(target, is); } } if (dia->keepItem2) { PageItem *newItem; if (dia->swapped) { newItem = new PageItem_Polygon(*Item1); newItem->setSelected(false); currDoc->Items->insert(currDoc->Items->indexOf(Item1), newItem); } else { newItem = new PageItem_Polygon(*Item2); newItem->setSelected(false); currDoc->Items->insert(currDoc->Items->indexOf(Item2), newItem); } if (UndoManager::undoEnabled()) { ScItemState<PageItem*> *is = new ScItemState<PageItem*>("Create PageItem"); is->set("CREATE_ITEM", "create_item"); is->setItem(newItem); UndoObject *target = currDoc->Pages->at(Item1->OwnPage); undoManager->action(target, is); } } if (opMode != 4) { PageItem *currItem; QPainterPath path; FPointArray points; if (dia->targetColor == 0) { currItem = Item1; if (dia->swapped) { currItem = Item2; currItem->setXYPos(Item1->xPos(), Item1->yPos()); currItem->setRotation(0.0); } } else { if (dia->swapped) currItem = Item1; else { currItem = Item2; currItem->setXYPos(Item1->xPos(), Item1->yPos()); currItem->setRotation(0.0); } } path = dia->result; points.fromQPainterPath(path); //<<#9046 FPointArray oldPOLine=currItem->PoLine; FPointArray oldContourLine=currItem->ContourLine; ScItemState<QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> > >* state = NULL; if (UndoManager::undoEnabled()) { state = new ScItemState<QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> > >(Um::PathOperation); state->set("PATH_OPERATION", "path_operation"); state->set("PATH_OP_OLD_FRAME", currItem->Frame); state->set("PATH_OP_OLD_CLIPEDITED", currItem->ClipEdited); state->set("PATH_OP_OLD_FRAMETYPE", currItem->FrameType); state->set("PATH_OP_OLD_OLDB2", currItem->OldB2); state->set("PATH_OP_OLD_OLDH2", currItem->OldH2); state->set("PATH_OP_NEW_FRAME", false); state->set("PATH_OP_NEW_CLIPEDITED", true); state->set("PATH_OP_NEW_FRAMETYPE", 3); } //>>#9046 currItem->PoLine = points; currItem->Frame = false; currItem->ClipEdited = true; currItem->FrameType = 3; currDoc->AdjustItemSize(currItem); currItem->OldB2 = currItem->width(); currItem->OldH2 = currItem->height(); currItem->updateClip(); currItem->ContourLine = currItem->PoLine.copy(); //<<#9046 if (UndoManager::undoEnabled()) { state->set("PATH_OP_NEW_OLDB2", currItem->OldB2); state->set("PATH_OP_NEW_OLDH2", currItem->OldH2); state->setItem(QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> >(QPair<FPointArray, FPointArray>(oldPOLine, oldContourLine), QPair<FPointArray, FPointArray>(points, currItem->ContourLine))); undoManager->action(currItem, state); } //>>#9046 currDoc->m_Selection->removeItem(currItem); currDoc->itemSelection_DeleteItem(); } else { QPainterPath path; FPointArray points; PageItem *newItem; double i1x = Item1->xPos(); double i1y = Item1->yPos(); path = dia->result; if (!path.isEmpty()) { points.fromQPainterPath(path); //<<#9046 FPointArray oldPOLine=Item1->PoLine; FPointArray oldContourLine=Item1->ContourLine; ScItemState<QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> > >* state = NULL; if (UndoManager::undoEnabled()) { state = new ScItemState<QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> > >(Um::PathOperation); state->set("PATH_OPERATION", "path_operation"); state->set("PATH_OP_OLD_FRAME", Item1->Frame); state->set("PATH_OP_OLD_CLIPEDITED", Item1->ClipEdited); state->set("PATH_OP_OLD_FRAMETYPE", Item1->FrameType); state->set("PATH_OP_OLD_OLDB2", Item1->OldB2); state->set("PATH_OP_OLD_OLDH2", Item1->OldH2); state->set("PATH_OP_NEW_FRAME", false); state->set("PATH_OP_NEW_CLIPEDITED", true); state->set("PATH_OP_NEW_FRAMETYPE", 3); } //>>#9046 Item1->PoLine = points; Item1->Frame = false; Item1->ClipEdited = true; Item1->FrameType = 3; currDoc->AdjustItemSize(Item1); Item1->OldB2 = Item1->width(); Item1->OldH2 = Item1->height(); Item1->updateClip(); Item1->ContourLine = Item1->PoLine.copy(); //<<#9046 if (UndoManager::undoEnabled()) { state->set("PATH_OP_NEW_OLDB2", Item1->OldB2); state->set("PATH_OP_NEW_OLDH2", Item1->OldH2); state->setItem(QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> >(QPair<FPointArray, FPointArray>(oldPOLine, oldContourLine), QPair<FPointArray, FPointArray>(Item1->PoLine, Item1->ContourLine))); undoManager->action(Item1, state); } //>>#9046 } path = QPainterPath(); path = dia->result1; if (!path.isEmpty()) { points.fromQPainterPath(path); //<<#9046 FPointArray oldPOLine=Item2->PoLine; FPointArray oldContourLine=Item2->ContourLine; ScItemState<QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> > >* state = NULL; if (UndoManager::undoEnabled()) { state = new ScItemState<QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> > >(Um::PathOperation); state->set("PATH_OPERATION", "path_operation"); state->set("PATH_OP_OLD_FRAME", Item2->Frame); state->set("PATH_OP_OLD_CLIPEDITED", Item2->ClipEdited); state->set("PATH_OP_OLD_FRAMETYPE", Item2->FrameType); state->set("PATH_OP_OLD_OLDB2", Item2->OldB2); state->set("PATH_OP_OLD_OLDH2", Item2->OldH2); state->set("PATH_OP_NEW_FRAME", false); state->set("PATH_OP_NEW_CLIPEDITED", true); state->set("PATH_OP_NEW_FRAMETYPE", 3); } //>>#9046 Item2->setXYPos(i1x, i1y); Item2->setRotation(0.0); Item2->PoLine = points; Item2->Frame = false; Item2->ClipEdited = true; Item2->FrameType = 3; currDoc->AdjustItemSize(Item2); Item2->OldB2 = Item2->width(); Item2->OldH2 = Item2->height(); Item2->updateClip(); Item2->ContourLine = Item2->PoLine.copy(); //<<#9046 if (UndoManager::undoEnabled()) { state->set("PATH_OP_NEW_OLDB2", Item2->OldB2); state->set("PATH_OP_NEW_OLDH2", Item2->OldH2); state->setItem(QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> >(QPair<FPointArray, FPointArray>(oldPOLine, oldContourLine), QPair<FPointArray, FPointArray>(Item2->PoLine, Item2->ContourLine))); undoManager->action(Item2, state); } //>>#9046 } path = QPainterPath(); path = dia->result2; if (!path.isEmpty()) { if (dia->targetColor == 0) { newItem = new PageItem_Polygon(*Item1); newItem->setXYPos(i1x, i1y); } else { newItem = new PageItem_Polygon(*Item2); newItem->setXYPos(i1x, i1y); newItem->setRotation(0.0); } currDoc->Items->append(newItem); newItem->setSelected(false); points.fromQPainterPath(path); newItem->PoLine = points; newItem->Frame = false; newItem->ClipEdited = true; newItem->FrameType = 3; currDoc->AdjustItemSize(newItem); newItem->OldB2 = newItem->width(); newItem->OldH2 = newItem->height(); newItem->updateClip(); newItem->ContourLine = newItem->PoLine.copy(); if (dia->targetColor == 2) { QString fill = dia->getOtherFillColor(); if (fill == CommonStrings::tr_NoneColor) fill = CommonStrings::None; newItem->setFillColor(fill); QString stroke = dia->getOtherLineColor(); if (stroke == CommonStrings::tr_NoneColor) stroke = CommonStrings::None; newItem->setLineColor(stroke); } } currDoc->m_Selection->clear(); currDoc->view()->Deselect(true); } currDoc->changed(); currDoc->view()->DrawNew(); } delete dia; //<<#9046 if (activeTransaction) { activeTransaction->commit(); delete activeTransaction; activeTransaction = NULL; } //>>#9046 return true; }
void CanvasMode_EditPolygon::mouseMoveEvent(QMouseEvent *m) { const FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos()); m->accept(); double newX = mousePointDoc.x(); double newY = mousePointDoc.y(); if (m_canvas->m_viewMode.m_MouseButtonPressed && m_view->moveTimerElapsed()) { PageItem *currItem = m_doc->m_Selection->itemAt(0); QTransform itemMatrix = currItem->getTransform(); QPointF cPoint = itemMatrix.map(centerPoint); QLineF stLinA = QLineF(cPoint, QPointF(newX, newY)); uint cx = polyUseFactor ? polyCorners * 2 : polyCorners; double seg = 360.0 / cx; double trueLength = sqrt(pow(sin(seg / 180.0 * M_PI) * (currItem->width() / 2.0), 2) + pow(cos(seg / 180.0 * M_PI) * (currItem->height() / 2.0) + (currItem->height()/2.0) - currItem->height(), 2)); if (m_polygonPoint == useControlInner) { polyInnerRot = stLinA.angle() - 90 - polyRotation - seg; double factor = stLinA.length() / sqrt(pow(sin(stLinA.angle() * M_PI / 180.0) * currItem->height() / 2.0, 2) + pow(cos(stLinA.angle() * M_PI / 180.0) * currItem->width() / 2.0, 2)); int maxF = qRound(getUserValFromFactor(factor)); if (maxF <= 100) polyFactor = factor; } if (m_polygonPoint == useControlOuter) { polyRotation = stLinA.angle() - 90; if (polyRotation < -180) polyRotation += 360; if (polyRotation > 180) polyRotation -= 360; } if (m_polygonPoint == useControlInnerCurve) { QPointF ePoint = itemMatrix.map(endPoint); QLineF stLinC = QLineF(ePoint, QPointF(newX, newY)); polyCurvature = stLinC.length() / trueLength; } if (m_polygonPoint == useControlOuterCurve) { QPointF sPoint = itemMatrix.map(startPoint); QPointF sPoint2 = itemMatrix.map(currItem->PoLine.pointQF(6)); QLineF stLinCo = QLineF(sPoint, QPointF(newX, newY)); QLineF stLinCo2 = QLineF(sPoint, sPoint2); polyOuterCurvature = stLinCo.length() / stLinCo2.length(); } QPainterPath path = RegularPolygonPath(currItem->width(), currItem->height(), polyCorners, polyUseFactor, polyFactor, polyRotation, polyCurvature, polyInnerRot, polyOuterCurvature); FPointArray ar; ar.fromQPainterPath(path); endPoint = ar.pointQF(2); startPoint = ar.pointQF(0); QLineF innerLine = QLineF(endPoint, centerPoint); innerLine.setAngle(innerLine.angle() + 90); innerLine.setLength(trueLength * polyCurvature); innerCPoint = innerLine.p2(); QLineF outerLine = QLineF(startPoint, ar.pointQF(6)); outerLine.setLength(outerLine.length() * polyOuterCurvature); outerCPoint = outerLine.p2(); VectorDialog->setValues(polyCorners, polyFactor, polyUseFactor, polyRotation, polyCurvature, polyInnerRot, polyOuterCurvature); blockUpdateFromItem(true); currItem->update(); blockUpdateFromItem(false); path = itemMatrix.map(path); m_doc->regionsChanged()->update(path.boundingRect().adjusted(-5, -5, 10, 10)); } Mxp = newX; Myp = newY; }
bool PathStrokerPlugin::run(ScribusDoc* doc, QString) { ScribusDoc* currDoc = doc; if (currDoc == 0) currDoc = ScCore->primaryMainWindow()->doc; if (currDoc->m_Selection->count() > 0) { QVector<double> m_array; PageItem *currItem = currDoc->m_Selection->itemAt(0); FPointArray path = currItem->PoLine; QPainterPath pp; if (currItem->itemType() == PageItem::PolyLine) pp = path.toQPainterPath(false); else pp = path.toQPainterPath(true); if (currItem->NamedLStyle.isEmpty()) { QPainterPathStroker stroke; stroke.setCapStyle(currItem->lineEnd()); stroke.setJoinStyle(currItem->lineJoin()); if (currItem->lineStyle() == Qt::SolidLine) stroke.setDashPattern(currItem->lineStyle()); else { getDashArray(currItem->lineStyle(), 1, m_array); stroke.setDashPattern(m_array); } stroke.setWidth(currItem->lineWidth()); QPainterPath result = stroke.createStroke(pp).simplified(); if (currItem->startArrowIndex() != 0) { FPoint Start = currItem->PoLine.point(0); for (uint xx = 1; xx < currItem->PoLine.size(); xx += 2) { FPoint Vector = currItem->PoLine.point(xx); if ((Start.x() != Vector.x()) || (Start.y() != Vector.y())) { double r = atan2(Start.y()-Vector.y(),Start.x()-Vector.x())*(180.0/M_PI); QMatrix arrowTrans; FPointArray arrow = currDoc->arrowStyles.at(currItem->startArrowIndex()-1).points.copy(); arrowTrans.translate(Start.x(), Start.y()); arrowTrans.rotate(r); arrowTrans.scale(currItem->lineWidth(), currItem->lineWidth()); arrow.map(arrowTrans); result.addPath(arrow.toQPainterPath(true)); break; } } } if (currItem->endArrowIndex() != 0) { FPoint End = currItem->PoLine.point(currItem->PoLine.size()-2); for (uint xx = currItem->PoLine.size()-1; xx > 0; xx -= 2) { FPoint Vector = currItem->PoLine.point(xx); if ((End.x() != Vector.x()) || (End.y() != Vector.y())) { double r = atan2(End.y()-Vector.y(),End.x()-Vector.x())*(180.0/M_PI); QMatrix arrowTrans; FPointArray arrow = currDoc->arrowStyles.at(currItem->endArrowIndex()-1).points.copy(); arrowTrans.translate(End.x(), End.y()); arrowTrans.rotate(r); arrowTrans.scale(currItem->lineWidth(), currItem->lineWidth()); arrow.map(arrowTrans); result.addPath(arrow.toQPainterPath(true)); break; } } } currDoc->m_Selection->clear(); PageItem* newItem = currDoc->convertItemTo(currItem, PageItem::Polygon); newItem->setLineWidth(0); newItem->setLineStyle(Qt::SolidLine); newItem->setFillColor(newItem->lineColor()); newItem->setFillShade(newItem->lineShade()); newItem->setFillTransparency(newItem->lineTransparency()); newItem->setFillBlendmode(newItem->lineBlendmode()); FPointArray points; points.fromQPainterPath(result); newItem->PoLine = points; newItem->Frame = false; newItem->ClipEdited = true; newItem->FrameType = 3; currDoc->AdjustItemSize(newItem); newItem->OldB2 = newItem->width(); newItem->OldH2 = newItem->height(); newItem->updateClip(); newItem->ContourLine = newItem->PoLine.copy(); newItem->setFillEvenOdd(true); currDoc->m_Selection->addItem(newItem); } else { currDoc->m_Selection->clear(); multiLine ml = currDoc->MLineStyles[currItem->NamedLStyle]; bool first = true; for (int it = ml.size()-1; it > -1; it--) { if ((ml[it].Color != CommonStrings::None) && (ml[it].Width != 0)) { QPainterPathStroker stroke; stroke.setCapStyle(static_cast<Qt::PenCapStyle>(ml[it].LineEnd)); stroke.setJoinStyle(static_cast<Qt::PenJoinStyle>(ml[it].LineJoin)); if (static_cast<Qt::PenStyle>(ml[it].Dash) == Qt::SolidLine) stroke.setDashPattern(static_cast<Qt::PenStyle>(ml[it].Dash)); else { getDashArray(static_cast<Qt::PenStyle>(ml[it].Dash), 1, m_array); stroke.setDashPattern(m_array); } stroke.setWidth(ml[it].Width); QPainterPath result = stroke.createStroke(pp).simplified(); PageItem* newItem; if (first) { newItem = currDoc->convertItemTo(currItem, PageItem::Polygon); } else { newItem = new PageItem_Polygon(*currItem); newItem->convertTo(PageItem::Polygon); currDoc->Items->append(newItem); } first = false; newItem->ItemNr = currDoc->Items->count()-1; newItem->setLineStyle(Qt::SolidLine); newItem->setFillColor(ml[it].Color); newItem->setFillShade(ml[it].Shade); newItem->setFillTransparency(newItem->lineTransparency()); newItem->setFillBlendmode(newItem->lineBlendmode()); newItem->setLineColor(CommonStrings::None); newItem->setCustomLineStyle(""); FPointArray points; points.fromQPainterPath(result); newItem->PoLine = points; newItem->Frame = false; newItem->ClipEdited = true; newItem->FrameType = 3; currDoc->AdjustItemSize(newItem); newItem->OldB2 = newItem->width(); newItem->OldH2 = newItem->height(); newItem->updateClip(); newItem->ContourLine = newItem->PoLine.copy(); newItem->setFillEvenOdd(true); currDoc->m_Selection->addItem(newItem); } } if (currItem->startArrowIndex() != 0) { FPoint Start = currItem->PoLine.point(0); for (uint xx = 1; xx < currItem->PoLine.size(); xx += 2) { FPoint Vector = currItem->PoLine.point(xx); if ((Start.x() != Vector.x()) || (Start.y() != Vector.y())) { double r = atan2(Start.y()-Vector.y(),Start.x()-Vector.x())*(180.0/M_PI); QMatrix arrowTrans; FPointArray arrow = currDoc->arrowStyles.at(currItem->startArrowIndex()-1).points.copy(); arrowTrans.translate(Start.x(), Start.y()); arrowTrans.rotate(r); arrowTrans.scale(currItem->lineWidth(), currItem->lineWidth()); arrow.map(arrowTrans); PageItem* newItem = new PageItem_Polygon(*currItem); currDoc->Items->append(newItem); newItem->ItemNr = currDoc->Items->count()-1; newItem->setLineWidth(0); newItem->setLineStyle(Qt::SolidLine); newItem->setCustomLineStyle(""); newItem->setFillColor(newItem->lineColor()); newItem->setFillShade(newItem->lineShade()); newItem->setFillTransparency(newItem->lineTransparency()); newItem->setFillBlendmode(newItem->lineBlendmode()); newItem->PoLine = arrow; newItem->Frame = false; newItem->ClipEdited = true; newItem->FrameType = 3; currDoc->AdjustItemSize(newItem); newItem->OldB2 = newItem->width(); newItem->OldH2 = newItem->height(); newItem->updateClip(); newItem->ContourLine = newItem->PoLine.copy(); newItem->setFillEvenOdd(true); currDoc->m_Selection->addItem(newItem); break; } } } if (currItem->endArrowIndex() != 0) { FPoint End = currItem->PoLine.point(currItem->PoLine.size()-2); for (uint xx = currItem->PoLine.size()-1; xx > 0; xx -= 2) { FPoint Vector = currItem->PoLine.point(xx); if ((End.x() != Vector.x()) || (End.y() != Vector.y())) { double r = atan2(End.y()-Vector.y(),End.x()-Vector.x())*(180.0/M_PI); QMatrix arrowTrans; FPointArray arrow = currDoc->arrowStyles.at(currItem->endArrowIndex()-1).points.copy(); arrowTrans.translate(End.x(), End.y()); arrowTrans.rotate(r); arrowTrans.scale(currItem->lineWidth(), currItem->lineWidth()); arrow.map(arrowTrans); PageItem* newItem = new PageItem_Polygon(*currItem); currDoc->Items->append(newItem); newItem->ItemNr = currDoc->Items->count()-1; newItem->setLineWidth(0); newItem->setLineStyle(Qt::SolidLine); newItem->setCustomLineStyle(""); newItem->setFillColor(newItem->lineColor()); newItem->setFillShade(newItem->lineShade()); newItem->setFillTransparency(newItem->lineTransparency()); newItem->setFillBlendmode(newItem->lineBlendmode()); newItem->PoLine = arrow; newItem->Frame = false; newItem->ClipEdited = true; newItem->FrameType = 3; currDoc->AdjustItemSize(newItem); newItem->OldB2 = newItem->width(); newItem->OldH2 = newItem->height(); newItem->updateClip(); newItem->ContourLine = newItem->PoLine.copy(); newItem->setFillEvenOdd(true); currDoc->m_Selection->addItem(newItem); break; } } } if (currDoc->m_Selection->count() > 1) currDoc->itemSelection_GroupObjects(false, false); currDoc->m_Selection->itemAt(0)->emitAllToGUI(); } currDoc->changed(); } return true; }
bool PathCutPlugin::run(ScribusDoc* doc, QString) { QString vers = QString(qVersion()).left(5); if (vers < "4.3.3") { QMessageBox::information(doc->scMW(), tr("Qt Version too old"), tr("This plugin requires at least version 4.3.3 of the Qt library")); return true; } ScribusDoc* currDoc = doc; if (currDoc == 0) currDoc = ScCore->primaryMainWindow()->doc; if (currDoc->m_Selection->count() > 1) { PageItem *Item1 = currDoc->m_Selection->itemAt(0); PageItem *Item2 = currDoc->m_Selection->itemAt(1); if (Item1->itemType() != PageItem::PolyLine) { Item1 = currDoc->m_Selection->itemAt(1); Item2 = currDoc->m_Selection->itemAt(0); } FPointArray path = Item1->PoLine; QPainterPathStroker stroke; stroke.setWidth(Item1->lineWidth()); QPainterPath cutter = stroke.createStroke(path.toQPainterPath(false)); QMatrix ms; ms.translate(Item1->xPos() - Item2->xPos(), Item1->yPos() - Item2->yPos()); ms.rotate(Item1->rotation()); cutter = ms.map(cutter); path.map(ms); FPoint start = path.point(0); FPoint end = path.point(path.size()-2); QMatrix mm; mm.rotate(Item2->rotation()); QPainterPath objekt = mm.map(Item2->PoLine.toQPainterPath(true)); if ((objekt.contains(QPointF(start.x(), start.y()))) || (objekt.contains(QPointF(end.x(), end.y())))) { QMessageBox::information(doc->scMW(), tr("Error"), tr("The cutting line must cross the polygon and\nboth end points must lie outside of the polygon")); return true; } QPainterPath result = objekt.subtracted(cutter); FPointArray points; points.fromQPainterPath(result); Item2->PoLine = points; Item2->Frame = false; Item2->ClipEdited = true; Item2->FrameType = 3; currDoc->AdjustItemSize(Item2); Item2->OldB2 = Item2->width(); Item2->OldH2 = Item2->height(); Item2->updateClip(); Item2->ContourLine = Item2->PoLine.copy(); currDoc->m_Selection->clear(); currDoc->m_Selection->addItem(Item1); currDoc->itemSelection_DeleteItem(); currDoc->m_Selection->clear(); currDoc->m_Selection->addItem(Item2); currDoc->itemSelection_SplitItems(); currDoc->changed(); } return true; }