/* For general Scribus (>=1.3.2) copyright and licensing information please refer to the COPYING file provided with the program. Following this notice may exist a copyright and/or license notice that predates the release of Scribus 1.3.2 for which a new license (GPL+exception) is in place. */ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "canvasmode_nodeedit.h" #include #include #include "canvas.h" #include "canvasgesture_rectselect.h" #include "fpoint.h" #include "pageitem.h" #include "pageselector.h" #include "scraction.h" #include "scrapbookpalette.h" #include "scribus.h" #include "scribusdoc.h" #include "scribusview.h" #include "scribusXml.h" #include "selection.h" #include "undomanager.h" #include "util_icon.h" #include "util_math.h" CanvasMode_NodeEdit::CanvasMode_NodeEdit(ScribusView* view) : CanvasMode(view), m_rectangleSelect(NULL) { // SeRx = -1; // selected pos // SeRy = -1; Mxp = -1; // last mouse position Myp = -1; Dxp = -1; // last mouse press position for rectangle select Dyp = -1; GxM = -1; // guide position GyM = -1; MoveGX = MoveGY = false; m_ScMW = m_view->m_ScMW; } void CanvasMode_NodeEdit::drawControls(QPainter* p) { // qDebug() << "NodeEdit::drawControls"; // void Canvas::MarkClip(QPainter *p, PageItem *currItem, FPointArray cli, bool) double x, y; if (m_doc->m_Selection->count() == 0) return; PageItem* currItem = m_doc->m_Selection->itemAt(0); FPointArray cli; p->save(); p->scale(m_canvas->scale(), m_canvas->scale()); p->translate(-m_doc->minCanvasCoordinate.x(), -m_doc->minCanvasCoordinate.y()); p->translate(currItem->xPos(), currItem->yPos()); p->rotate(currItem->rotation()); p->setPen(QPen(Qt::blue, 1 / m_canvas->m_viewMode.scale, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin)); p->setBrush(Qt::NoBrush); if ((m_doc->nodeEdit.isContourLine) && (currItem->ContourLine.size() != 0)) cli = currItem->ContourLine; else cli = currItem->PoLine; // draw curve const double scale = m_canvas->m_viewMode.scale; const double onePerScale = 1 / scale; if (cli.size() > 3) { for (uint poi=0; poi 900000) continue; p->setPen(QPen(Qt::blue, onePerScale, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin)); FPoint a1 = cli.point(poi); FPoint a2 = cli.point(poi+1); FPoint a3 = cli.point(poi+3); FPoint a4 = cli.point(poi+2); QPainterPath Bez; Bez.moveTo(a1.x(), a1.y()); Bez.cubicTo(a2.x(), a2.y(), a3.x(), a3.y(), a4.x(), a4.y()); p->drawPath(Bez); p->setPen(QPen(Qt::blue, onePerScale, Qt::DotLine, Qt::FlatCap, Qt::MiterJoin)); p->drawLine(QPointF(a1.x(), a1.y()), QPointF(a2.x(), a2.y())); p->drawLine(QPointF(a3.x(), a3.y()), QPointF(a4.x(), a4.y())); } } // draw points for (uint a=0; a 900000) continue; if (m_doc->nodeEdit.EdPoints) { if (m_doc->nodeEdit.ClRe == static_cast(a+1)) p->setPen(QPen(Qt::red, 8 / scale, Qt::SolidLine, Qt::RoundCap, Qt::MiterJoin)); else p->setPen(QPen(Qt::magenta, 8 / scale, Qt::SolidLine, Qt::RoundCap, Qt::MiterJoin)); cli.point(a+1, &x, &y); p->drawPoint(QPointF(x, y)); if (m_doc->nodeEdit.ClRe == static_cast(a)) p->setPen(QPen(Qt::red, 8 / scale, Qt::SolidLine, Qt::RoundCap, Qt::MiterJoin)); else p->setPen(QPen(Qt::blue, 8 / scale, Qt::SolidLine, Qt::RoundCap, Qt::MiterJoin)); cli.point(a, &x, &y); p->drawPoint(QPointF(x, y)); } else { if (m_doc->nodeEdit.ClRe == static_cast(a)) p->setPen(QPen(Qt::red, 8 / scale, Qt::SolidLine, Qt::RoundCap, Qt::MiterJoin)); else p->setPen(QPen(Qt::blue, 8 / scale, Qt::SolidLine, Qt::RoundCap, Qt::MiterJoin)); cli.point(a, &x, &y); p->drawPoint(QPointF(x, y)); if (m_doc->nodeEdit.ClRe == static_cast(a+1)) p->setPen(QPen(Qt::red, 8 / scale, Qt::SolidLine, Qt::RoundCap, Qt::MiterJoin)); else p->setPen(QPen(Qt::magenta, 8 / scale, Qt::SolidLine, Qt::RoundCap, Qt::MiterJoin)); cli.point(a+1, &x, &y); p->drawPoint(QPointF(x, y)); } } if (m_doc->nodeEdit.ClRe != -1) { p->setPen(QPen(Qt::red, 8 / scale, Qt::SolidLine, Qt::RoundCap, Qt::MiterJoin)); cli.point(m_doc->nodeEdit.ClRe, &x, &y); p->drawPoint(QPointF(x, y)); QList::Iterator itm; for (itm = m_doc->nodeEdit.SelNode.begin(); itm != m_doc->nodeEdit.SelNode.end(); ++itm) { cli.point((*itm), &x, &y); p->drawPoint(QPointF(x, y)); } emit m_view->HavePoint(true, m_doc->nodeEdit.MoveSym); cli.point(m_doc->nodeEdit.ClRe, &x, &y); emit m_view->ClipPo(x, y); } else emit m_view->HavePoint(false, m_doc->nodeEdit.MoveSym); p->restore(); } void CanvasMode_NodeEdit::activate(bool fromGesture) { if (fromGesture && m_rectangleSelect) { m_canvas->m_viewMode.m_MouseButtonPressed = false; // handle rectangle select // double sc = m_canvas->scale(); PageItem* currItem = m_doc->m_Selection->itemAt(0); m_doc->nodeEdit.SelNode.clear(); QRectF Sele = m_rectangleSelect->result(); //QRect(Dxp, Dyp, SeRx-Dxp, SeRy-Dyp).normalized(); FPointArray Clip; bool firstPoint = false; // m_canvas->setScale(1.0); if (m_doc->nodeEdit.isContourLine) Clip = currItem->ContourLine; else Clip = currItem->PoLine; for (uint a = 0; a < Clip.size(); ++a) { if (Clip.point(a).x() > 900000) continue; FPoint np = Clip.point(a); FPoint npf2 = np.transformPoint(currItem->xPos(), currItem->yPos(), currItem->rotation(), 1.0, 1.0, false); if ((Sele.contains(npf2.x(), npf2.y())) && ((a == 0) || (((a-2) % 4) == 0))) { if (a == 0) firstPoint = true; if ((firstPoint) && (a == Clip.size() - 2) && (!currItem->asPolyLine())) continue; m_doc->nodeEdit.ClRe = a; m_doc->nodeEdit.SelNode.append(a); m_doc->nodeEdit.update(Clip.pointQF(a)); } } // m_canvas->setScale(sc); // m_view->HaveSelRect = false; // m_view->redrawMarker->hide(); currItem->update(); // m_view->updateContents(); m_doc->nodeEdit.finishTransaction(currItem); delete m_rectangleSelect; m_rectangleSelect = NULL; } else { Mxp = -1; // last mouse position Myp = -1; Dxp = -1; // last mouse press position for rectangle select Dyp = -1; GxM = -1; // guide position GyM = -1; MoveGX = MoveGY = false; } } void CanvasMode_NodeEdit::deactivate(bool forGesture) { if (!forGesture && m_rectangleSelect) { m_rectangleSelect->clear(); delete m_rectangleSelect; m_rectangleSelect = NULL; } } inline bool CanvasMode_NodeEdit::GetItem(PageItem** pi) { *pi = m_doc->m_Selection->itemAt(0); return (*pi) != NULL; } void CanvasMode_NodeEdit::enterEvent(QEvent *) { if (!m_canvas->m_viewMode.m_MouseButtonPressed) { qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor)); } } void CanvasMode_NodeEdit::leaveEvent(QEvent *e) { if (!m_canvas->m_viewMode.m_MouseButtonPressed) qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor)); } void CanvasMode_NodeEdit::mouseDoubleClickEvent(QMouseEvent *m) { m->accept(); m_canvas->m_viewMode.m_MouseButtonPressed = false; m_canvas->resetRenderMode(); // m_view->stopDragTimer(); m_view->requestMode(submodeEndNodeEdit); } void CanvasMode_NodeEdit::mouseMoveEvent(QMouseEvent *m) { PageItem *currItem; QPoint np, np2, mop; FPoint npf, npf2; double sc = m_canvas->scale(); m->accept(); npf = m_canvas->globalToCanvas(m->globalPos()); #ifdef MODEDEBUG // qDebug() << "nodedit move event:" << m->x() << m->y() << "canvas:" << npf.x() << npf.y() << "@" << m_canvas->scale(); #endif /* if (m_doc->guidesSettings.guidesShown) { if (MoveGY) { m_view->FromHRuler(m); return; } if (MoveGX) { m_view->FromVRuler(m); return; } } */ // if (m_canvas->m_viewMode.m_MouseButtonPressed && (m->buttons() & Qt::RightButton) && (m->modifiers() & Qt::ControlModifier)) // { // m_ScMW->setAppMode(modePanning); // } if (GetItem(&currItem)) { if (m_doc->DragP) return; //Operations run here: //Item resize, esp after creating a new one if (m_view->moveTimerElapsed() && m_canvas->m_viewMode.m_MouseButtonPressed && (m->buttons() & Qt::LeftButton) && (!currItem->locked())) { #ifdef MODEDEBUG // qDebug() << "node edit drag 1"; #endif // m_view->stopDragTimer(); handleNodeEditDrag(m, currItem); } else if (!m_canvas->m_viewMode.m_MouseButtonPressed) { if (!currItem->locked()) { QMatrix p; // = currItem->getTransform(); QRect mpo; // = QRect(m->globalX()-m_doc->guidesSettings.grabRad, m->globalY()-m_doc->guidesSettings.grabRad, m_doc->guidesSettings.grabRad*2, m_doc->guidesSettings.grabRad*2); // mpo.moveBy(qRound(m_doc->minCanvasCoordinate.x() * m_canvas->scale()), qRound(m_doc->minCanvasCoordinate.y() * m_canvas->scale())); handleNodeEditMove(m, mpo, currItem, p); } } // else // qDebug() << "node edit drag 9:" << (m->buttons() & Qt::LeftButton); } else // shouldnt be in nodeedit mode now, should it?? { npf = m_canvas->globalToCanvas(m->globalPos()); if ((m_canvas->m_viewMode.m_MouseButtonPressed) && (m->buttons() & Qt::LeftButton) && (GyM == -1) && (GxM == -1)) { // SeRx = qRound(npf.x()); // SeRy = qRound(npf.y()); // m_view->redrawMarker->setGeometry(QRect(Mxp, Myp, m->x() - Mxp, m->y() - Myp).normalized()); // if (!m_view->redrawMarker->isVisible()) // m_view->redrawMarker->show(); // m_view->HaveSelRect = true; if (!m_rectangleSelect) { m_rectangleSelect = new RectSelect(this); } m_rectangleSelect->prepare(m->globalPos()); m_view->startGesture(m_rectangleSelect); return; } if ((m_doc->guidesSettings.guidesShown) && (!m_doc->GuideLock) && (m_doc->OnPage(npf.x(), npf.y()) != -1)) { Guides::iterator it; Guides tmpGuides = m_doc->currentPage()->guides.horizontals(GuideManagerCore::Standard); for (it = tmpGuides.begin(); it != tmpGuides.end(); ++it) { if ( (*it) + m_doc->currentPage()->yOffset() < npf.y() + m_doc->guidesSettings.grabRad * sc && (*it) + m_doc->currentPage()->yOffset() > npf.y() - m_doc->guidesSettings.grabRad * sc ) { if ((m_canvas->m_viewMode.m_MouseButtonPressed) && (GyM != -1)) MoveGY = true; if (npf.x() < m_doc->currentPage()->xOffset() || npf.x() >= m_doc->currentPage()->xOffset() + m_doc->currentPage()->width() - 1) qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor)); else qApp->changeOverrideCursor(QCursor(Qt::SplitVCursor)); return; } } // qApp->setOverrideCursor(QCursor(Qt::ArrowCursor), true); tmpGuides = m_doc->currentPage()->guides.verticals(GuideManagerCore::Standard); for (it = tmpGuides.begin(); it!= tmpGuides.end(); ++it) { if ( (*it) + m_doc->currentPage()->xOffset() < npf.x() + m_doc->guidesSettings.grabRad * sc && (*it) + m_doc->currentPage()->xOffset() > npf.x() - m_doc->guidesSettings.grabRad * sc) { if ((m_canvas->m_viewMode.m_MouseButtonPressed) && (GxM != -1)) MoveGX = true; if (npf.y() < m_doc->currentPage()->yOffset() || npf.y() >= m_doc->currentPage()->yOffset() + m_doc->currentPage()->height() - 1) qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor)); else qApp->changeOverrideCursor(QCursor(Qt::SplitHCursor)); return; } } qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor)); } } } void CanvasMode_NodeEdit::mousePressEvent(QMouseEvent *m) { // double Rxp = 0; // double Ryp = 0; // double Rxpd = 0; // double Rypd = 0; QPainter p; // m_canvas->PaintSizeRect(QRect()); // FPoint npf, npf2; m_canvas->m_viewMode.m_MouseButtonPressed = true; m_canvas->m_viewMode.operItemMoving = false; // m_view->HaveSelRect = false; m_doc->DragP = false; m_doc->leaveDrag = false; MoveGX = MoveGY = false; // oldClip = 0; m->accept(); m_view->registerMousePress(m->globalPos()); // npf = m_canvas->globalToCanvas(m->globalPos()); // Mxp = qRound(npf.x()); // WTF? FIXME:av // Myp = qRound(npf.y()); QRect mpo; //(m->globalX()-m_doc->guidesSettings.grabRad, m->globalY()-m_doc->guidesSettings.grabRad, m_doc->guidesSettings.grabRad*2, m_doc->guidesSettings.grabRad*2); // mpo.moveBy(qRound(m_doc->minCanvasCoordinate.x() * m_canvas->scale()), qRound(m_doc->minCanvasCoordinate.y() * m_canvas->scale())); /* if (m_doc->appMode != modeEdit) { Rxp = m_doc->ApplyGrid(QPoint(Mxp, Myp)).x(); Rxpd = Mxp - Rxp; Mxp = qRound(Rxp); Ryp = m_doc->ApplyGrid(QPoint(Mxp, Myp)).y(); Rypd = Myp - Ryp; Myp = qRound(Ryp); }*/ // SeRx = Mxp; // SeRy = Myp; /* if (m->button() == Qt::MidButton) { m_view->MidButt = true; m_view->DrawNew(); return; }*/ // npf = m_canvas->globalToCanvas(m->globalPos()); // Mxp = qRound(npf.x()); // WTF? // Myp = qRound(npf.y()); // SeRx = Mxp; // SeRy = Myp; // this has to be: Mxp = m->x(); Myp = m->y(); if (m_doc->m_Selection->count() != 0) { handleNodeEditPress(m, mpo); } if ((m_doc->m_Selection->count() != 0) && (m->button() == Qt::RightButton)) { m_canvas->m_viewMode.m_MouseButtonPressed = true; Dxp = Mxp; Dyp = Myp; } } void CanvasMode_NodeEdit::mouseReleaseEvent(QMouseEvent *m) { // const double mouseX = m->globalX(); // const double mouseY = m->globalY(); const FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos()); // QMenu* pmen3 = NULL; PageItem *currItem; m_canvas->m_viewMode.m_MouseButtonPressed = false; m_canvas->resetRenderMode(); m->accept(); // m_view->stopDragTimer(); /* if (m_doc->guidesSettings.guidesShown) { bool foundGuide = false; FPoint np = m_canvas->globalToCanvas(m->globalPos()); double nx = np.x(); double ny = np.y(); double grabRadScale = m_doc->guidesSettings.grabRad / m_canvas->scale(); if (0 <= m_doc->currentPage()->guides.isMouseOnHorizontal(ny + grabRadScale, ny - grabRadScale, GuideManagerCore::Standard) || 0 <= m_doc->currentPage()->guides.isMouseOnVertical(nx + grabRadScale, nx - grabRadScale, GuideManagerCore::Standard)) foundGuide = true; if ((foundGuide) && (m->button() == Qt::RightButton) && (!GetItem(&currItem))) { qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor)); MoveGY = false; MoveGX = false; return; } if (MoveGY) { m_view->SetYGuide(m, GyM); MoveGY = false; m_view->redrawMarker->hide(); qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor)); m_view->updateContents(); GyM = -1; return; } if (MoveGX) { m_view->SetXGuide(m, GxM); MoveGX = false; m_view->redrawMarker->hide(); qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor)); m_view->updateContents(); GxM = -1; return; } }*/ /* see activated() if (!m_doc->nodeEdit.hasNodeSelected() && (m_view->HaveSelRect)) { double sc = m_canvas->scale(); currItem = m_doc->m_Selection->itemAt(0); m_doc->nodeEdit.SelNode.clear(); QRect Sele = QRect(Dxp, Dyp, SeRx-Dxp, SeRy-Dyp).normalized(); FPointArray Clip; m_canvas->setScale(1.0); if (m_doc->nodeEdit.isContourLine) Clip = currItem->ContourLine; else Clip = currItem->PoLine; for (uint a = 0; a < Clip.size(); ++a) { if (Clip.point(a).x() > 900000) continue; FPoint np = Clip.point(a); FPoint npf2 = np.transformPoint(currItem->xPos(), currItem->yPos(), currItem->rotation(), 1.0, 1.0, false); QPoint npf = QPoint(qRound(npf2.x()), qRound(npf2.y())); if ((Sele.contains(npf)) && ((a == 0) || (((a-2) % 4) == 0))) { m_doc->nodeEdit.ClRe = a; m_doc->nodeEdit.SelNode.append(a); m_doc->nodeEdit.update(QPointF(Clip.point(a).x(), Clip.point(a).y())); } } m_canvas->setScale(sc); m_view->HaveSelRect = false; m_view->redrawMarker->hide(); currItem->update(); m_doc->nodeEdit.finishTransaction(currItem); return; } */ /* if (m_view->moveTimerElapsed() && (m_doc->appMode == modeEditClip) && (SegP1 == -1) && (SegP2 == -1)) { currItem = m_doc->m_Selection->itemAt(0); if (operItemMoving) { currItem->OldB2 = currItem->width(); currItem->OldH2 = currItem->height(); double nx = m->x()/m_canvas->scale() + m_doc->minCanvasCoordinate.x(); double ny = m->y()/m_canvas->scale() + m_doc->minCanvasCoordinate.y(); if (!m_doc->ApplyGuides(&nx, &ny)) { FPoint npg(ApplyGridF(FPoint(nx, ny))); nx = npg.x(); ny = npg.y(); } FPoint np(nx, ny, currItem->xPos(), currItem->yPos(), currItem->rotation(), 1, 1, true); m_doc->nodeEdit.moveClipPoint(currItem, np); } m_doc->AdjustItemSize(currItem); emit DocChanged(); updateContents(); operItemMoving = false; return; } if (m_view->moveTimerElapsed() && (m_doc->appMode == modeEditClip) && (SegP1 != -1) && (SegP2 != -1)) */ if (m_view->moveTimerElapsed()) { // m_view->stopDragTimer(); if (m_doc->nodeEdit.SegP1 != -1 && m_doc->nodeEdit.SegP2 != -1) { m_doc->nodeEdit.deselect(); m_doc->nodeEdit.SegP1 = -1; m_doc->nodeEdit.SegP2 = -1; } currItem = m_doc->m_Selection->itemAt(0); m_canvas->m_viewMode.operItemMoving = false; double xposOrig = currItem->xPos(); double yposOrig = currItem->yPos(); ItemState > *state = NULL; state = m_doc->nodeEdit.finishTransaction1(currItem); xposOrig = currItem->xPos(); yposOrig = currItem->yPos(); if (m_doc->nodeEdit.hasNodeSelected() && (m_doc->nodeEdit.SelNode.count() == 1)) { //FIXME:av FPoint newP = m_canvas->globalToCanvas(m->globalPos()); // double newX = newP.x(); // double newY = newP.y(); // FPoint np(newX, newY, 0, 0, currItem->rotation(), 1, 1, true); currItem->OldB2 = currItem->width(); currItem->OldH2 = currItem->height(); FPointArray Clip; if (m_doc->nodeEdit.isContourLine) Clip = currItem->ContourLine; else Clip = currItem->PoLine; // FPoint npf = FPoint(Clip.point(m_doc->nodeEdit.ClRe).x() + np.x() / m_canvas->scale(), Clip.point(m_doc->nodeEdit.ClRe).y() + np.y() / m_canvas->scale()); // double nx = npf.x(); // double ny = npf.y(); // nx += currItem->xPos(); // ny += currItem->yPos(); FPoint npf; double nx = newP.x(); double ny = newP.y(); if (!m_doc->ApplyGuides(&nx, &ny)) npf = m_doc->ApplyGridF(FPoint(nx, ny)); else npf = FPoint(nx, ny); // npf = FPoint(npf.x() - currItem->xPos(), npf.y() - currItem->yPos()); npf = FPoint(npf.x(), npf.y(), currItem->xPos(), currItem->yPos(), currItem->rotation(), 1, 1, true); m_doc->nodeEdit.moveClipPoint(currItem, npf); } m_doc->AdjustItemSize(currItem); if (!m_doc->nodeEdit.isContourLine) currItem->ContourLine.translate(xposOrig - currItem->xPos(), yposOrig - currItem->yPos()); // currItem->update(); m_doc->regionsChanged()->update(QRectF()); // emit DocChanged(); // m_view->updateContents(); if (state) { m_doc->nodeEdit.finishTransaction2(currItem, state); } return; } m_canvas->setRenderModeUseBuffer(false); m_doc->DragP = false; m_doc->leaveDrag = false; m_canvas->m_viewMode.operItemMoving = false; m_canvas->m_viewMode.operItemResizing = false; m_view->MidButt = false; // m_doc->SubMode = -1; 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) //??? av m_doc->m_Selection->itemAt(i)->checkChanges(true); //Commit drag created items to undo manager. if (m_doc->m_Selection->itemAt(0)!=NULL) { m_doc->itemAddCommit(m_doc->m_Selection->itemAt(0)->ItemNr); } //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(); if (m_doc->m_Selection->itemAt(0) != 0) // is there the old clip stored for the undo action { currItem = m_doc->m_Selection->itemAt(0); m_doc->nodeEdit.finishTransaction(currItem); } else { //delete oldClip; //oldClip = 0; } } void CanvasMode_NodeEdit::handleNodeEditPress(QMouseEvent* m, QRect) { FPoint npf2; PageItem* currItem = m_doc->m_Selection->itemAt(0); FPointArray Clip = m_doc->nodeEdit.beginTransaction(currItem); bool edited = false; bool pfound = false; // QMatrix pm; // pm.translate(-m_doc->minCanvasCoordinate.x()*m_canvas->scale(), -m_doc->minCanvasCoordinate.y()*m_canvas->scale()); // m_canvas->Transform(currItem, pm); // npf2 = FPoint(m->pos() * pm.inverted()); npf2 = m_canvas->globalToCanvas(m->globalPos()).transformPoint(currItem->xPos(), currItem->yPos(), currItem->rotation(), 1.0, 1.0, true); QMatrix pm2 = currItem->getTransform(); for (int a=0; a < signed(Clip.size()); ++a) { if (((m_doc->nodeEdit.EdPoints) && (a % 2 != 0)) || ((!m_doc->nodeEdit.EdPoints) && (a % 2 == 0))) continue; QPointF npf = pm2.map(Clip.pointQF(a)); // QRect tx = QRect(static_cast(npf.x()-3), static_cast(npf.y()-3), 6, 6); // if (tx.intersects(mpo)) if (m_canvas->hitsCanvasPoint(m->globalPos(), npf)) { #ifdef MODEDEBUG qDebug() << "nodeedit: selecting point" << a << "at" << npf.x() << npf.y(); #endif m_doc->nodeEdit.ClRe = a; if ((m_doc->nodeEdit.EdPoints) && (m_doc->nodeEdit.SelNode.contains(a) == 0)) { if (m->modifiers() == Qt::ShiftModifier) m_doc->nodeEdit.SelNode.append(a); else { m_doc->nodeEdit.SelNode.clear(); m_doc->nodeEdit.SelNode.append(a); } } m_doc->nodeEdit.update(Clip.pointQF(a)); pfound = true; edited = true; break; } } if ((!pfound) || (!m_doc->nodeEdit.EdPoints)) m_doc->nodeEdit.SelNode.clear(); if ((m_doc->nodeEdit.submode == NodeEditContext::MOVE_POINT) && (m_doc->nodeEdit.ClRe2 != -1) && !m_doc->nodeEdit.hasNodeSelected()) { m_doc->nodeEdit.SegP1 = m_doc->nodeEdit.ClRe2; m_doc->nodeEdit.SegP2 = m_doc->nodeEdit.ClRe2+2; m_doc->nodeEdit.ClRe = m_doc->nodeEdit.ClRe2; } FPointArray cli; uint EndInd = Clip.size(); uint StartInd = 0; for (uint n = m_doc->nodeEdit.ClRe; n < Clip.size(); ++n) { if (Clip.point(n).x() > 900000) { EndInd = n; break; } } if (m_doc->nodeEdit.ClRe > 0) { for (uint n2 = m_doc->nodeEdit.ClRe; n2 > 0; n2--) { if (n2 == 0) break; if (Clip.point(n2).x() > 900000) { StartInd = n2 + 1; break; } } } if (m_doc->nodeEdit.submode == NodeEditContext::SPLIT_PATH) { if (!m_doc->nodeEdit.EdPoints) return; if (!m_doc->nodeEdit.hasNodeSelected()) // We don't have a Point, try to add one onto the current curve segment { bool foundP = false; uint seg = 0; double absDist = 9999999999.9; FPoint point = FPoint(0, 0); FPoint normal = FPoint(0, 0); FPoint tangent = FPoint(0, 0); FPoint nearPoint = FPoint(0, 0); double nearT = 0.0; QRect mpo2(0, 0, m_doc->guidesSettings.grabRad*3, m_doc->guidesSettings.grabRad*3); mpo2.moveCenter(QPoint(qRound(npf2.x()), qRound(npf2.y()))); for (uint poi=0; poiPointOnLine(cli2.point(clp), cli2.point(clp+1), mpo2)) { seg = poi; double sp = 0.0; double spadd = 1.0 / (Clip.lenPathSeg(seg) * m_canvas->scale()); while (sp < 1.0) { Clip.pointTangentNormalAt(seg, sp, &point, &tangent, &normal ); double d1 = fabs(sqrt(pow(point.x() - npf2.x(), 2) + pow(point.y() - npf2.y() ,2))); if (d1 < absDist) { foundP = true; nearPoint = point; nearT = sp; absDist = d1; } sp += spadd; } } } } cli.putPoints(0, m_doc->nodeEdit.ClRe2+2, Clip); if (foundP) { npf2 = nearPoint; FPoint base = cli.point(cli.size()-2); FPoint c1 = cli.point(cli.size()-1); FPoint base2 = Clip.point(m_doc->nodeEdit.ClRe2+2); FPoint c2 = Clip.point(m_doc->nodeEdit.ClRe2+3); if ((base == c1) && (base2 == c2)) { cli.resize(cli.size()+4); cli.putPoints(cli.size()-4, 4, npf2.x(), npf2.y(), npf2.x(), npf2.y(), npf2.x(), npf2.y(), npf2.x(), npf2.y()); cli.putPoints(cli.size(), Clip.size()-(m_doc->nodeEdit.ClRe2 + 2), Clip, m_doc->nodeEdit.ClRe2+2); } else { FPoint cn1 = (1.0 - nearT) * base + nearT * c1; FPoint cn2 = (1.0 - nearT) * cn1 + nearT * ((1.0 - nearT) * c1 + nearT * c2); FPoint cn3 = (1.0 - nearT) * ((1.0 - nearT) * c1 + nearT * c2) + nearT * ((1.0 - nearT) * c2 + nearT * base2); FPoint cn4 = (1.0 - nearT) * c2 + nearT * base2; cli.setPoint(cli.size()-1, cn1); cli.resize(cli.size()+4); uint basind = cli.size()+1; cli.putPoints(cli.size()-4, 4, npf2.x(), npf2.y(), cn2.x(), cn2.y(), npf2.x(), npf2.y(), cn3.x(), cn3.y()); cli.putPoints(cli.size(), Clip.size()-(m_doc->nodeEdit.ClRe2 + 2), Clip, m_doc->nodeEdit.ClRe2+2); cli.setPoint(basind, cn4); } Clip = cli.copy(); cli.resize(0); m_doc->nodeEdit.ClRe = m_doc->nodeEdit.ClRe2+2; m_doc->nodeEdit.ClRe2 = -1; EndInd = Clip.size(); StartInd = 0; for (uint n = m_doc->nodeEdit.ClRe; n < Clip.size(); ++n) { if (Clip.point(n).x() > 900000) { EndInd = n; break; } } if (m_doc->nodeEdit.ClRe > 0) { for (uint n2 = m_doc->nodeEdit.ClRe; n2 > 0; n2--) { if (n2 == 0) break; if (Clip.point(n2).x() > 900000) { StartInd = n2 + 1; break; } } } } else m_doc->nodeEdit.deselect(); } if (m_doc->nodeEdit.hasNodeSelected()) { if (currItem->asPolygon()) { if ((m_doc->nodeEdit.ClRe != 0) && (m_doc->nodeEdit.ClRe != static_cast(EndInd-2))) { if (currItem->Segments.count() == 0) { cli.putPoints(0, EndInd-(m_doc->nodeEdit.ClRe+2), Clip, m_doc->nodeEdit.ClRe+2); cli.putPoints(cli.size(), m_doc->nodeEdit.ClRe+2, Clip); } else { cli.putPoints(0, EndInd-StartInd, Clip, StartInd); int z = m_doc->itemAdd(PageItem::Polygon, PageItem::Unspecified, currItem->xPos(), currItem->yPos(), currItem->width(), currItem->height(), currItem->lineWidth(), currItem->fillColor(), currItem->lineColor(), true); PageItem* bb = m_doc->Items->at(z); if (m_doc->nodeEdit.isContourLine) bb->ContourLine.resize(0); else bb->PoLine.resize(0); if (StartInd != 0) { if (m_doc->nodeEdit.isContourLine) { bb->ContourLine.putPoints(0, StartInd - 4, Clip); bb->ContourLine.putPoints(bb->ContourLine.size(), Clip.size()-EndInd, Clip, EndInd); } else { bb->PoLine.putPoints(0, StartInd - 4, Clip); bb->PoLine.putPoints(bb->PoLine.size(), Clip.size()-EndInd, Clip, EndInd); } } else { if (m_doc->nodeEdit.isContourLine) bb->ContourLine.putPoints(0, Clip.size()-EndInd-4, Clip, EndInd+4); else bb->PoLine.putPoints(0, Clip.size()-EndInd-4, Clip, EndInd+4); } bb->setRotation(currItem->rotation()); m_doc->AdjustItemSize(bb); bb->ClipEdited = true; PageItem *bx = m_doc->Items->takeAt(bb->ItemNr); m_doc->Items->insert(bb->ItemNr-1, bx); } currItem->PoLine = cli.copy(); } m_doc->nodeEdit.deselect(); currItem->ClipEdited = true; edited = true; m_doc->nodeEdit.submode = NodeEditContext::MOVE_POINT; PageItem* newItem=m_doc->convertItemTo(currItem, PageItem::PolyLine); currItem=newItem; m_doc->m_Selection->clear(); m_doc->m_Selection->addItem(currItem); emit m_view->PolyOpen(); } else { if ((currItem->asPolyLine()) || (currItem->asPathText())) { if ((m_doc->nodeEdit.ClRe > 1) && (m_doc->nodeEdit.ClRe < static_cast(Clip.size()-2))) { int z = m_doc->itemAdd(PageItem::PolyLine, PageItem::Unspecified, currItem->xPos(), currItem->yPos(), currItem->width(), currItem->height(), currItem->lineWidth(), currItem->fillColor(), currItem->lineColor(), true); PageItem* bb = m_doc->Items->at(z); if (m_doc->nodeEdit.isContourLine) bb->ContourLine.putPoints(0, Clip.size()-(m_doc->nodeEdit.ClRe+2), Clip, m_doc->nodeEdit.ClRe+2); else bb->PoLine.putPoints(0, Clip.size()-(m_doc->nodeEdit.ClRe+2), Clip, m_doc->nodeEdit.ClRe+2); bb->setRotation(currItem->rotation()); m_doc->AdjustItemSize(bb); bb->ClipEdited = true; bb->setFrameType(currItem->frameType()); cli.resize(0); cli.putPoints(0, m_doc->nodeEdit.ClRe+2, Clip); currItem->PoLine = cli.copy(); m_doc->m_Selection->clear(); m_doc->m_Selection->addItem(currItem); } m_doc->nodeEdit.deselect(); currItem->ClipEdited = true; edited = true; m_doc->nodeEdit.submode = NodeEditContext::MOVE_POINT; currItem->setPolyClip(qRound(qMax(currItem->lineWidth() / 2.0, 1.0))); emit m_view->PolyOpen(); } } } } if ((m_doc->nodeEdit.submode == NodeEditContext::DEL_POINT) && m_doc->nodeEdit.hasNodeSelected()) { if (!m_doc->nodeEdit.EdPoints) return; if ((currItem->asPolygon()) || (currItem->asTextFrame()) || (currItem->asImageFrame())) { if ((currItem->Segments.count() == 0) && (Clip.size() <= 12)) // min. 3 points return; } else { if (Clip.size() <= 4) return; } if ((currItem->Segments.count() != 0) && ((EndInd - StartInd) <= 12)) { if (StartInd != 0) cli.putPoints(0, StartInd-4, Clip); cli.putPoints(cli.size(), Clip.size() - EndInd, Clip, EndInd); } else { if (m_doc->nodeEdit.ClRe == static_cast(StartInd)) { if ((currItem->asPolygon()) || (currItem->asTextFrame()) || (currItem->asImageFrame())) { FPoint kp(Clip.point(EndInd-3)); cli.putPoints(0, StartInd, Clip); cli.putPoints(cli.size(), EndInd - StartInd - 4, Clip, StartInd); cli.setPoint(StartInd, cli.point(cli.size()-2)); cli.setPoint(StartInd + 1, kp); cli.putPoints(cli.size(), Clip.size() - EndInd, Clip, EndInd); } else { cli.putPoints(0, StartInd, Clip); cli.putPoints(cli.size(), EndInd - StartInd - 4, Clip, StartInd+4); cli.putPoints(cli.size(), Clip.size() - EndInd, Clip, EndInd); } } else { if (m_doc->nodeEdit.ClRe != 0) cli.putPoints(0, m_doc->nodeEdit.ClRe, Clip); cli.putPoints(cli.size(), Clip.size()-(m_doc->nodeEdit.ClRe + 4), Clip, m_doc->nodeEdit.ClRe+4); } } if (m_doc->nodeEdit.isContourLine) currItem->ContourLine = cli.copy(); else currItem->PoLine = cli.copy(); m_doc->nodeEdit.deselect(); currItem->ClipEdited = true; edited = true; } if ((m_doc->nodeEdit.submode == NodeEditContext::ADD_POINT) && (m_doc->nodeEdit.ClRe2 != -1)) { bool foundP = false; uint seg = 0; double absDist = 9999999999.9; FPoint point = FPoint(0, 0); FPoint normal = FPoint(0, 0); FPoint tangent = FPoint(0, 0); FPoint nearPoint = FPoint(0, 0); double nearT = 0.0; QRect mpo2(0, 0, m_doc->guidesSettings.grabRad*3, m_doc->guidesSettings.grabRad*3); mpo2.moveCenter(QPoint(qRound(npf2.x()), qRound(npf2.y()))); for (uint poi=0; poiPointOnLine(cli2.point(clp), cli2.point(clp+1), mpo2)) { seg = poi; double sp = 0.0; double spadd = 1.0 / (Clip.lenPathSeg(seg) * m_canvas->scale()); while (sp < 1.0) { Clip.pointTangentNormalAt(seg, sp, &point, &tangent, &normal ); double d1 = fabs(sqrt(pow(point.x() - npf2.x(), 2) + pow(point.y() - npf2.y() ,2))); if (d1 < absDist) { foundP = true; nearPoint = point; nearT = sp; absDist = d1; } sp += spadd; } } } } cli.putPoints(0, m_doc->nodeEdit.ClRe2+2, Clip); if (foundP) { npf2 = nearPoint; FPoint base = cli.point(cli.size()-2); FPoint c1 = cli.point(cli.size()-1); FPoint base2 = Clip.point(m_doc->nodeEdit.ClRe2+2); FPoint c2 = Clip.point(m_doc->nodeEdit.ClRe2+3); if ((base == c1) && (base2 == c2)) { cli.resize(cli.size()+4); cli.putPoints(cli.size()-4, 4, npf2.x(), npf2.y(), npf2.x(), npf2.y(), npf2.x(), npf2.y(), npf2.x(), npf2.y()); cli.putPoints(cli.size(), Clip.size()-(m_doc->nodeEdit.ClRe2 + 2), Clip, m_doc->nodeEdit.ClRe2+2); } else { FPoint cn1 = (1.0 - nearT) * base + nearT * c1; FPoint cn2 = (1.0 - nearT) * cn1 + nearT * ((1.0 - nearT) * c1 + nearT * c2); FPoint cn3 = (1.0 - nearT) * ((1.0 - nearT) * c1 + nearT * c2) + nearT * ((1.0 - nearT) * c2 + nearT * base2); FPoint cn4 = (1.0 - nearT) * c2 + nearT * base2; cli.setPoint(cli.size()-1, cn1); cli.resize(cli.size()+4); uint basind = cli.size()+1; cli.putPoints(cli.size()-4, 4, npf2.x(), npf2.y(), cn2.x(), cn2.y(), npf2.x(), npf2.y(), cn3.x(), cn3.y()); cli.putPoints(cli.size(), Clip.size()-(m_doc->nodeEdit.ClRe2 + 2), Clip, m_doc->nodeEdit.ClRe2+2); cli.setPoint(basind, cn4); } } else { cli.resize(cli.size()+4); cli.putPoints(cli.size()-4, 4, npf2.x(), npf2.y(), npf2.x(), npf2.y(), npf2.x(), npf2.y(), npf2.x(), npf2.y()); cli.putPoints(cli.size(), Clip.size()-(m_doc->nodeEdit.ClRe2 + 2), Clip, m_doc->nodeEdit.ClRe2+2); } if (m_doc->nodeEdit.isContourLine) currItem->ContourLine = cli.copy(); else currItem->PoLine = cli.copy(); m_doc->nodeEdit.ClRe2 = -1; currItem->ClipEdited = true; edited = true; } if (edited) { currItem->FrameType = 3; m_doc->AdjustItemSize(currItem); currItem->update(); } if ((m_doc->nodeEdit.SelNode.count() != 0) || ((m_doc->nodeEdit.SegP1 != -1) && (m_doc->nodeEdit.SegP2 != -1)) || (m_doc->nodeEdit.hasNodeSelected() && (!m_doc->nodeEdit.EdPoints))) { Mxp = m->x(); Myp = m->y(); m_canvas->setRenderModeFillBuffer(); } else { /* m_view->redrawMarker->setGeometry(m->x(), m->y(), 1, 1); m_view->redrawMarker->show(); */ Mxp = m->x(); Myp = m->y(); Dxp = qRound(m->x()/m_canvas->scale()); // + m_doc->minCanvasCoordinate.x()); Dyp = qRound(m->y()/m_canvas->scale()); // + m_doc->minCanvasCoordinate.y()); if (!m_rectangleSelect) m_rectangleSelect = new RectSelect(this); m_rectangleSelect->prepare(m->globalPos()); m_view->startGesture(m_rectangleSelect); } } bool CanvasMode_NodeEdit::handleNodeEditMove(QMouseEvent* m, QRect, PageItem* currItem, QMatrix) { QMatrix itemPos = currItem->getTransform(); FPointArray Clip; m_doc->nodeEdit.ClRe2 = -1; m_doc->nodeEdit.SegP1 = -1; m_doc->nodeEdit.SegP2 = -1; if (m_doc->nodeEdit.isContourLine) Clip = currItem->ContourLine; else Clip = currItem->PoLine; #ifdef MODEDEBUG // qDebug() << "handle nodeedit move:" << m_doc->nodeEdit.submode << m_doc->nodeEdit.EdPoints; #endif if ((m_doc->nodeEdit.submode == NodeEditContext::DEL_POINT) || (m_doc->nodeEdit.submode == NodeEditContext::MOVE_POINT) || (m_doc->nodeEdit.submode == NodeEditContext::SPLIT_PATH)) { for (int a=0; a < signed(Clip.size()); ++a) { if (((m_doc->nodeEdit.EdPoints) && (a % 2 != 0)) || ((!m_doc->nodeEdit.EdPoints) && (a % 2 == 0))) continue; //QPoint np = p.map(Clip.pointQ(a)); //QRect tx = QRect(np.x()-3, np.y()-3, 6, 6); //if (tx.intersects(mpo)) QPointF point = Clip.pointQF(a); if (m_canvas->hitsCanvasPoint(m->globalPos(), itemPos.map(point))) { if (m_doc->nodeEdit.submode == NodeEditContext::MOVE_POINT) qApp->changeOverrideCursor(QCursor(Qt::SizeAllCursor)); if (m_doc->nodeEdit.submode == NodeEditContext::DEL_POINT) qApp->changeOverrideCursor(QCursor(loadIcon("DelPoint.png"), 1, 1)); if (m_doc->nodeEdit.submode == NodeEditContext::SPLIT_PATH) qApp->changeOverrideCursor(QCursor(loadIcon("Split.png"), 1, 1)); return true; } } } if ((m_doc->nodeEdit.submode == NodeEditContext::ADD_POINT) || (m_doc->nodeEdit.submode == NodeEditContext::MOVE_POINT) || (m_doc->nodeEdit.submode == NodeEditContext::SPLIT_PATH && m_doc->nodeEdit.EdPoints)) { FPoint mousePoint = m_canvas->globalToCanvas(m->globalPos()); for (uint poi=0; poi 0.0) { double delta = 2.0 / len; for (double d = 0.0; d <= 1.0; d += delta) { QPointF pl = Bez.pointAtPercent(d); if (m_canvas->hitsCanvasPoint(m->globalPos(), FPoint(pl.x(), pl.y()))) { if (m_doc->nodeEdit.submode == NodeEditContext::MOVE_POINT) qApp->changeOverrideCursor(QCursor(loadIcon("HandC.xpm"))); else if (m_doc->nodeEdit.submode == NodeEditContext::ADD_POINT) qApp->changeOverrideCursor(QCursor(loadIcon("AddPoint.png"), 1, 1)); else if (m_doc->nodeEdit.submode == NodeEditContext::SPLIT_PATH) qApp->changeOverrideCursor(QCursor(loadIcon("Split.png"), 1, 1)); else qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor)); m_doc->nodeEdit.ClRe2 = poi; return true; } } } // as polygon // QPolygonF cli = Bez.toSubpathPolygons().first(); // for (int clp = 0; clp < cli.size()-1; ++clp) // { // project mousepoint on line // FPoint pointOnLine = projectPointOnLine(mousePoint, cli.at(clp), cli.at(clp+1)); //if (m_view->PointOnLine(cli.point(clp), cli.point(clp+1), p.inverted().mapRect(mpo))) // if (m_canvas->hitsCanvasPoint(m->globalPos(), pointOnLine)) // { // if (m_doc->nodeEdit.submode == NodeEditContext::MOVE_POINT) // qApp->changeOverrideCursor(QCursor(loadIcon("HandC.xpm"))); // if (m_doc->nodeEdit.submode == NodeEditContext::ADD_POINT) // qApp->changeOverrideCursor(QCursor(loadIcon("AddPoint.png"), 1, 1)); // if (m_doc->nodeEdit.submode == NodeEditContext::SPLIT_PATH) // qApp->changeOverrideCursor(QCursor(loadIcon("Split.png"), 1, 1)); // m_doc->nodeEdit.ClRe2 = poi; // return true; // } // } } } qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor)); return false; } void CanvasMode_NodeEdit::handleNodeEditDrag(QMouseEvent* m, PageItem* currItem) { FPoint npf; if ((m_canvas->m_viewMode.m_MouseButtonPressed) && !m_doc->nodeEdit.hasNodeSelected() && (m_doc->nodeEdit.SegP1 == -1) && (m_doc->nodeEdit.SegP2 == -1)) { if (!m_rectangleSelect) { m_rectangleSelect = new RectSelect(this); } m_rectangleSelect->prepare(m->globalPos()); m_view->startGesture(m_rectangleSelect); return; } int newX = m->x(); int newY = m->y(); FPoint np(newX-Mxp, newY-Myp, 0, 0, currItem->rotation(), 1, 1, true); np = np * (1.0 / m_canvas->scale()); m_canvas->m_viewMode.operItemMoving = true; currItem = m_doc->m_Selection->itemAt(0); if ((m_doc->nodeEdit.SegP1 != -1) && (m_doc->nodeEdit.SegP2 != -1)) { if (m_doc->nodeEdit.isContourLine) npf = currItem->ContourLine.point(m_doc->nodeEdit.SegP2) + np; else npf = currItem->PoLine.point(m_doc->nodeEdit.SegP2) + np; m_doc->nodeEdit.ClRe = m_doc->nodeEdit.SegP2; m_doc->nodeEdit.moveClipPoint(currItem, npf); if (m_doc->nodeEdit.isContourLine) npf = currItem->ContourLine.point(m_doc->nodeEdit.SegP1) + np; else npf = currItem->PoLine.point(m_doc->nodeEdit.SegP1) + np; m_doc->nodeEdit.ClRe = m_doc->nodeEdit.SegP1; m_doc->nodeEdit.moveClipPoint(currItem, npf); Mxp = newX; Myp = newY; } else { if ((m_doc->nodeEdit.SelNode.count() != 0) && (m_doc->nodeEdit.EdPoints)) { int storedClRe = m_doc->nodeEdit.ClRe; if (m_doc->nodeEdit.SelNode.count() == 1) { npf = m_canvas->globalToCanvas(m->globalPos()); double nx = npf.x(); double ny = npf.y(); if (!m_doc->ApplyGuides(&nx, &ny)) npf = m_doc->ApplyGridF(FPoint(nx, ny)); else npf = FPoint(nx, ny); npf = FPoint(npf.x(), npf.y(), currItem->xPos(), currItem->yPos(), currItem->rotation(), 1, 1, true); m_doc->nodeEdit.moveClipPoint(currItem, npf); m_canvas->displayXYHUD(m->globalPos(), npf.x(), npf.y()); } else { for (int itm = 0; itm < m_doc->nodeEdit.SelNode.count(); ++itm) { m_doc->nodeEdit.ClRe = m_doc->nodeEdit.SelNode.at(itm); if (m_doc->nodeEdit.isContourLine) npf = currItem->ContourLine.point(m_doc->nodeEdit.ClRe) + np; else npf = currItem->PoLine.point(m_doc->nodeEdit.ClRe) + np; m_doc->nodeEdit.moveClipPoint(currItem, npf); } } m_doc->nodeEdit.ClRe = storedClRe; } else { npf = m_canvas->globalToCanvas(m->globalPos()); double nx = npf.x(); double ny = npf.y(); if (!m_doc->ApplyGuides(&nx, &ny)) npf = m_doc->ApplyGridF(FPoint(nx, ny)); else npf = FPoint(nx, ny); npf = FPoint(npf.x(), npf.y(), currItem->xPos(), currItem->yPos(), currItem->rotation(), 1, 1, true); m_doc->nodeEdit.moveClipPoint(currItem, npf); m_canvas->displayXYHUD(m->globalPos(), npf.x(), npf.y()); } Mxp = newX; Myp = newY; } m_canvas->m_viewMode.operItemMoving = false; m_doc->regionsChanged()->update(QRectF()); }