summaryrefslogtreecommitdiffstats
path: root/scribus/canvasmode_nodeedit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scribus/canvasmode_nodeedit.cpp')
-rw-r--r--scribus/canvasmode_nodeedit.cpp1291
1 files changed, 1291 insertions, 0 deletions
diff --git a/scribus/canvasmode_nodeedit.cpp b/scribus/canvasmode_nodeedit.cpp
new file mode 100644
index 0000000..8a9168f
--- /dev/null
+++ b/scribus/canvasmode_nodeedit.cpp
@@ -0,0 +1,1291 @@
+/*
+ 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 <QMenu>
+#include <QMouseEvent>
+
+#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<cli.size()-3; poi += 4)
+ {
+ if (cli.point(poi).x() > 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<cli.size()-1; a += 2)
+ {
+ if (cli.point(a).x() > 900000)
+ continue;
+ if (m_doc->nodeEdit.EdPoints)
+ {
+ if (m_doc->nodeEdit.ClRe == static_cast<int>(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<int>(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<int>(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<int>(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<int>::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<QPair<FPointArray, FPointArray> > *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<int>(npf.x()-3), static_cast<int>(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; poi<Clip.size()-3; poi += 4)
+ {
+ FPoint a1 = Clip.point(poi);
+ FPoint a2 = Clip.point(poi+1);
+ FPoint a3 = Clip.point(poi+3);
+ FPoint a4 = Clip.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());
+ QPolygon cli2 = Bez.toFillPolygon().toPolygon();
+ for (int clp = 0; clp < cli2.size()-1; ++clp)
+ {
+ if (m_view->PointOnLine(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<int>(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<int>(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<int>(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; poi<Clip.size()-3; poi += 4)
+ {
+ FPoint a1 = Clip.point(poi);
+ FPoint a2 = Clip.point(poi+1);
+ FPoint a3 = Clip.point(poi+3);
+ FPoint a4 = Clip.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());
+ QPolygon cli2 = Bez.toFillPolygon().toPolygon();
+ for (int clp = 0; clp < cli2.size()-1; ++clp)
+ {
+ if (m_view->PointOnLine(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());
+ Dyp = qRound(m->y()/m_canvas->scale());
+ 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<Clip.size()-3; poi += 4)
+ {
+ // create bezier curve in canvas coords
+ QPointF a1 = itemPos.map(Clip.pointQF(poi));
+ QPointF a2 = itemPos.map(Clip.pointQF(poi+1));
+ QPointF a3 = itemPos.map(Clip.pointQF(poi+3));
+ QPointF a4 = itemPos.map(Clip.pointQF(poi+2));
+ QPainterPath Bez;
+ Bez.moveTo(a1);
+ Bez.cubicTo(a2, a3, a4);
+ double len = Bez.length();
+ if (len > 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());
+}
+
+
+