summaryrefslogtreecommitdiffstats
path: root/scribus/canvasmode_normal.cpp
diff options
context:
space:
mode:
authorcraig <craig@11d20701-8431-0410-a711-e3c959e3b870>2012-01-01 11:40:09 +0000
committercraig <craig@11d20701-8431-0410-a711-e3c959e3b870>2012-01-01 11:40:09 +0000
commit7ed83b6c6666eb8b6b104c211ae7e52907350372 (patch)
tree4430b556abac0ad660a0aacf1887d77f85d8be02 /scribus/canvasmode_normal.cpp
downloadscribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.tar.gz
scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.tar.xz
scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.zip
Branch 1.3.5 tree to 1.4.x tree, goodbye 1.3.x
git-svn-id: svn://scribus.net/branches/Version14x/Scribus@17163 11d20701-8431-0410-a711-e3c959e3b870
Diffstat (limited to 'scribus/canvasmode_normal.cpp')
-rw-r--r--scribus/canvasmode_normal.cpp1427
1 files changed, 1427 insertions, 0 deletions
diff --git a/scribus/canvasmode_normal.cpp b/scribus/canvasmode_normal.cpp
new file mode 100644
index 0000000..865525e
--- /dev/null
+++ b/scribus/canvasmode_normal.cpp
@@ -0,0 +1,1427 @@
+/*
+ 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_normal.h"
+
+#include <QApplication>
+#include <QButtonGroup>
+#include <QCheckBox>
+#include <QCursor>
+#include <QEvent>
+#include <QMessageBox>
+#include <QMouseEvent>
+#include <QPainterPath>
+#include <QPoint>
+#include <QRect>
+#include <QTimer>
+#include <QWidgetAction>
+#include <QDebug>
+
+#include "aligndistribute.h"
+#include "canvas.h"
+#include "canvasgesture_linemove.h"
+#include "canvasgesture_resize.h"
+#include "canvasgesture_rulermove.h"
+#include "contextmenu.h"
+#include "customfdialog.h"
+#include "fpoint.h"
+#include "fpointarray.h"
+#include "hyphenator.h"
+#include "insertTable.h"
+#include "pageitem_textframe.h"
+#include "pageselector.h"
+#include "prefscontext.h"
+#include "prefsfile.h"
+#include "prefsmanager.h"
+#include "propertiespalette.h"
+#include "scmimedata.h"
+#include "scribus.h"
+#include "scribusdoc.h"
+#include "scribusview.h"
+#include "scribusXml.h"
+#include "selection.h"
+#include "stencilreader.h"
+#include "undomanager.h"
+#include "units.h"
+#include "util.h"
+#include "util_icon.h"
+#include "util_math.h"
+#include "loadsaveplugin.h"
+#include "fileloader.h"
+#include "plugins/formatidlist.h"
+
+
+
+CanvasMode_Normal::CanvasMode_Normal(ScribusView* view) : CanvasMode(view), m_ScMW(view->m_ScMW)
+{
+ frameResizeHandle = -1;
+ shiftSelItems = false;
+ resizeGesture = NULL;
+ lineMoveGesture = NULL;
+ guideMoveGesture = NULL;
+ m_mousePressPoint.setXY(0, 0);
+ m_mouseCurrentPoint.setXY(0, 0);
+ m_mouseSavedPoint.setXY(0, 0);
+ m_objectDeltaPos.setXY(0,0 );
+}
+
+inline bool CanvasMode_Normal::GetItem(PageItem** pi)
+{
+ *pi = m_doc->m_Selection->itemAt(0);
+ return (*pi) != NULL;
+}
+
+void CanvasMode_Normal::drawControls(QPainter* p)
+{
+// qDebug() << "CanvasMode_Normal::drawControls";
+ if (m_canvas->m_viewMode.operItemMoving)
+ {
+ drawOutline(p, 1.0, 1.0, m_objectDeltaPos.x(), m_objectDeltaPos.y());
+ }
+ else
+ {
+ drawSelection(p, true);
+ }
+}
+
+void CanvasMode_Normal::enterEvent(QEvent *)
+{
+ if (!m_canvas->m_viewMode.m_MouseButtonPressed)
+ {
+ setModeCursor();
+ }
+}
+
+void CanvasMode_Normal::leaveEvent(QEvent *e)
+{
+ if (!m_canvas->m_viewMode.m_MouseButtonPressed)
+ {
+ qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
+ }
+}
+
+
+void CanvasMode_Normal::activate(bool fromGesture)
+{
+// qDebug() << "CanvasMode_Normal::activate" << fromGesture;
+ m_canvas->m_viewMode.m_MouseButtonPressed = false;
+ m_canvas->resetRenderMode();
+ 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_mousePressPoint.setXY(0, 0);
+ m_mouseCurrentPoint.setXY(0, 0);
+ m_mouseSavedPoint.setXY(0, 0);
+ m_objectDeltaPos.setXY(0,0 );
+ frameResizeHandle = -1;
+ shiftSelItems = false;
+ setModeCursor();
+ if (fromGesture)
+ {
+ m_view->update();
+ }
+}
+
+void CanvasMode_Normal::deactivate(bool forGesture)
+{
+// qDebug() << "CanvasMode_Normal::deactivate" << forGesture;
+ m_view->redrawMarker->hide();
+}
+
+void CanvasMode_Normal::mouseDoubleClickEvent(QMouseEvent *m)
+{
+ m->accept();
+ m_canvas->m_viewMode.m_MouseButtonPressed = false;
+ m_canvas->resetRenderMode();
+// m_view->stopDragTimer();
+ PageItem *currItem = 0;
+ if (m_doc->m_Selection->isMultipleSelection())
+ {
+ if (GetItem(&currItem))
+ {
+ /* CB: old code, removing this as shift-alt select on an unselected table selects a cell now.
+ //#6789 is closed by sorting this.
+ if (currItem->isTableItem)
+ {
+ m_view->Deselect(false);
+ m_doc->m_Selection->addItem(currItem);
+ currItem->isSingleSel = true;
+ //CB FIXME dont call this if the added item is item 0
+ if (!m_doc->m_Selection->primarySelectionIs(currItem))
+ currItem->emitAllToGUI();
+ m_view->updateContents(currItem->getRedrawBounding(m_canvas->scale()));
+ }*/
+ }
+ return;
+ }
+ if (GetItem(&currItem))
+ {
+ if (currItem->asLatexFrame())
+ {
+ if ((currItem->locked()) || (!currItem->ScaleType))
+ {
+ return;
+ }
+ if (currItem->imageShown())
+ m_view->requestMode(modeEdit);
+ }
+ else if ((currItem->itemType() == PageItem::Polygon) || (currItem->itemType() == PageItem::PolyLine) || (currItem->itemType() == PageItem::ImageFrame) || (currItem->itemType() == PageItem::PathText))
+ {
+ if ((currItem->locked()) || (!currItem->ScaleType))
+ {
+ //mousePressEvent(m);
+ return;
+ }
+ //If we double click on an image frame and theres no image assigned, open the
+ //load picture dialog, else put it into edit mode if the frame is set to show the image
+ if (currItem->itemType() == PageItem::ImageFrame)
+ {
+ if (currItem->Pfile.isEmpty())
+ m_view->requestMode(submodeLoadPic);
+ else if (!currItem->PictureIsAvailable)
+ m_view->requestMode(submodeStatusPic);
+ else if (currItem->imageShown())
+ m_view->requestMode(modeEdit);
+ }
+ else if (currItem->itemType() == PageItem::TextFrame)
+ {
+ m_view->requestMode(modeEdit);
+ }
+ else
+ m_view->requestMode(modeEditClip);
+ }
+ else if (currItem->itemType() == PageItem::TextFrame)
+ {
+ //CB old code
+ //emit currItem->isAnnotation() ? AnnotProps() : Amode(modeEdit);
+ //mousePressEvent(m);
+ //CB if annotation, open the annotation dialog
+ if (currItem->isAnnotation())
+ {
+ m_view->requestMode(submodeAnnotProps);
+ //mousePressEvent(m);
+ }
+ //else if not in mode edit, set mode edit
+ else if (m_doc->appMode != modeEdit)
+ {
+ m_view->requestMode(modeEdit);
+ m_view->slotSetCurs(m->globalPos().x(), m->globalPos().y());
+ //CB ignore the double click and go with a single one
+ //if we werent in mode edit before.
+ //unsure if this is correct, but its ok given we had no
+ //double click select until now.
+// mousePressEvent(m);
+ }
+ }
+ }
+}
+
+
+void CanvasMode_Normal::mouseMoveEvent(QMouseEvent *m)
+{
+// qDebug()<<"CanvasMode_Normal::mouseMoveEvent";
+ const FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
+
+ m_lastPosWasOverGuide = false;
+ double newX, newY;
+ PageItem *currItem;
+ bool erf = false;
+ m->accept();
+// qDebug() << "legacy mode move:" << m->x() << m->y() << m_canvas->globalToCanvas(m->globalPos()).x() << m_canvas->globalToCanvas(m->globalPos()).y();
+
+ if (commonMouseMove(m))
+ return;
+ m_mouseCurrentPoint = mousePointDoc;
+ bool movingOrResizing = (m_canvas->m_viewMode.operItemMoving || m_canvas->m_viewMode.operItemResizing);
+ bool mouseIsOnPage = (m_doc->OnPage(mousePointDoc.x(), mousePointDoc.y()) != -1);
+ if ((m_doc->guidesSettings.guidesShown) && (!m_doc->GuideLock) && (!movingOrResizing) && (mouseIsOnPage) )
+ {
+ // #9002: Resize points undraggable when object is aligned to a guide
+ // Allow item resize when guides are aligned to item while preserving
+ // ability to drag guide when guis is in foreground and inside selection
+ bool enableGuideGesture(false);
+ Canvas::FrameHandle frameResizeHandle(Canvas::OUTSIDE);
+ if (m_doc->m_Selection->count() > 0)
+ {
+ double gx(0.0), gy(0.0), gw(0.0), gh(0.0);
+ m_doc->m_Selection->setGroupRect();
+ m_doc->m_Selection->getVisualGroupRect(&gx, &gy, &gw, &gh);
+ frameResizeHandle = m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), QRectF(gx, gy, gw, gh));
+ }
+ enableGuideGesture |= (frameResizeHandle == Canvas::OUTSIDE);
+ enableGuideGesture |= ((!m_doc->guidesSettings.before) && (frameResizeHandle == Canvas::INSIDE));
+ if (enableGuideGesture)
+ {
+ if (!guideMoveGesture)
+ {
+ guideMoveGesture = new RulerGesture(m_view, RulerGesture::HORIZONTAL);
+ connect(guideMoveGesture,SIGNAL(guideInfo(int, qreal)), m_ScMW->alignDistributePalette,SLOT(setGuide(int, qreal)));
+ }
+ if (guideMoveGesture->mouseHitsGuide(mousePointDoc))
+ {
+ m_lastPosWasOverGuide = true;
+ switch (guideMoveGesture->getMode())
+ {
+ case RulerGesture::HORIZONTAL:
+ qApp->changeOverrideCursor(QCursor(Qt::SplitVCursor));
+ break;
+ case RulerGesture::VERTICAL:
+ qApp->changeOverrideCursor(QCursor(Qt::SplitHCursor));
+ break;
+ default:
+ qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
+ }
+ return;
+ }
+ // Here removed a bunch of comments which made reading code difficult,
+ // there is svn for tracking changes after all. pm
+ qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
+ }
+ }
+ else if (!mouseIsOnPage)
+ {
+ QCursor* cursor = qApp->overrideCursor();
+ if (cursor && ((cursor->shape() == Qt::SplitHCursor) || (cursor->shape() == Qt::SplitVCursor)))
+ {
+ qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
+ }
+ }
+ if ((GetItem(&currItem)) && (!shiftSelItems))
+ {
+ newX = qRound(mousePointDoc.x()); //m_view->translateToDoc(m->x(), m->y()).x());
+ newY = qRound(mousePointDoc.y()); //m_view->translateToDoc(m->x(), m->y()).y());
+ // #0007865
+ if (/*(((m_view->dragTimerElapsed()) && (m->buttons() & Qt::LeftButton)) ||*/
+ (m_view->moveTimerElapsed())
+ && (m->buttons() & Qt::RightButton)
+ && (m_canvas->m_viewMode.m_MouseButtonPressed)
+ && (!m_doc->DragP)
+ && (!(currItem->isSingleSel)))
+ {
+ // start drag
+// m_view->stopDragTimer();
+ if ((fabs(m_mousePressPoint.x() - newX) > 10) || (fabs(m_mousePressPoint.y() - newY) > 10))
+ {
+ m_canvas->setRenderMode(Canvas::RENDER_NORMAL);
+// m_view->resetDragTimer();
+ m_doc->DragP = true;
+ m_doc->leaveDrag = false;
+ m_doc->DraggedElem = currItem;
+ m_doc->DragElements.clear();
+ for (int dre=0; dre<m_doc->m_Selection->count(); ++dre)
+ m_doc->DragElements.append(m_doc->m_Selection->itemAt(dre)->ItemNr);
+ ScriXmlDoc *ss = new ScriXmlDoc();
+ ScElemMimeData* md = new ScElemMimeData();
+ md->setScribusElem(ss->WriteElem(m_doc, m_view, m_doc->m_Selection));
+ delete ss;
+ ss = NULL;
+ QDrag* dr = new QDrag(m_view);
+ dr->setMimeData(md);
+ const QPixmap& pm = loadIcon("DragPix.xpm");
+ dr->setDragCursor(pm, Qt::CopyAction);
+ dr->setDragCursor(pm, Qt::MoveAction);
+ dr->setDragCursor(pm, Qt::LinkAction);
+ dr->exec();
+ m_doc->DragP = false;
+ m_doc->leaveDrag = false;
+ m_canvas->m_viewMode.m_MouseButtonPressed = false;
+ m_doc->DraggedElem = 0;
+ m_doc->DragElements.clear();
+ qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
+ m_view->updateContents();
+ }
+ return;
+ }
+ 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) &&
+ ((m_doc->appMode == modeNormal)) && (!currItem->locked()))
+ {
+// m_view->stopDragTimer();
+ if (!m_canvas->m_viewMode.operItemResizing)
+ {
+ //Dragging an item (plus more?)
+ QRectF newPlace;
+ newX = mousePointDoc.x(); //static_cast<int>(m->x()/sc);
+ newY = mousePointDoc.y(); //static_cast<int>(m->y()/sc);
+ m_canvas->m_viewMode.operItemMoving = true;
+ qApp->changeOverrideCursor(Qt::ClosedHandCursor);
+ erf = false;
+ int dX = qRound(newX - m_mousePressPoint.x()), dY = qRound(newY - m_mousePressPoint.y());
+ if (!m_doc->m_Selection->isMultipleSelection())
+ {
+ erf=true;
+ currItem = m_doc->m_Selection->itemAt(0);
+ //Control Alt drag image in frame without being in edit mode
+ if ((currItem->asImageFrame()) && (m->modifiers() & Qt::ControlModifier) && (m->modifiers() & Qt::AltModifier))
+ {
+ currItem->moveImageInFrame(dX/currItem->imageXScale(),dY/currItem->imageYScale());
+ m_view->updateContents(currItem->getRedrawBounding(m_canvas->scale()));
+ }
+ else
+ {
+ //Dragging orthogonally - Ctrl Drag
+ if ((m->modifiers() & Qt::ControlModifier) && !(m->modifiers() & Qt::ShiftModifier) && !(m->modifiers() & Qt::AltModifier))
+ {
+ if (abs(dX) > abs(dY))
+ dY=0;
+ else
+ if (abs(dY) > abs(dX))
+ dX=0;
+ erf=false;
+ dX+=qRound(dragConstrainInitPtX-currItem->xPos());
+ dY+=qRound(dragConstrainInitPtY-currItem->yPos());
+ }
+ if (!(currItem->isTableItem && currItem->isSingleSel))
+ {
+ double gx, gy, gh, gw;
+ m_objectDeltaPos.setXY(dX, dY);
+ m_doc->m_Selection->setGroupRect();
+ m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
+ if (m_doc->SnapGuides)
+ {
+ double nx = gx + m_objectDeltaPos.x();
+ double ny = gy + m_objectDeltaPos.y();
+ double nxo = nx, nyo = ny;
+ m_doc->ApplyGuides(&nx, &ny);
+ m_objectDeltaPos += FPoint(nx - nxo, ny - nyo);
+ nx = nxo = gx + gw + m_objectDeltaPos.x();
+ ny = nyo = gy + gh + m_objectDeltaPos.y();
+ m_doc->ApplyGuides(&nx, &ny);
+ m_objectDeltaPos += FPoint(nx-nxo, ny-nyo);
+ }
+ if (m_doc->useRaster)
+ {
+ m_doc->m_Selection->setGroupRect();
+ double gx, gy, gh, gw, gxo, gyo;
+ m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
+ gx += m_objectDeltaPos.x();
+ gy += m_objectDeltaPos.y();
+ gxo = gx;
+ gyo = gy;
+ FPoint npx = m_doc->ApplyGridF(FPoint(gx, gy));
+ FPoint npw = m_doc->ApplyGridF(FPoint(gx+gw, gy+gh));
+ if ((fabs(gx-npx.x())) > (fabs((gx+gw)-npw.x())))
+ gx = npw.x() - gw;
+ else
+ gx = npx.x();
+ if ((fabs(gy-npx.y())) > (fabs((gy+gh)-npw.y())))
+ gy = npw.y() - gh;
+ else
+ gy = npx.y();
+ if ((fabs(gx - gxo) < (m_doc->guidesSettings.guideRad) / m_canvas->scale()) && (fabs(gy - gyo) < (m_doc->guidesSettings.guideRad) / m_canvas->scale()))
+ m_objectDeltaPos += FPoint(gx-gxo, gy-gyo);
+ }
+ }
+ }
+ }
+ else
+ {
+ double gx, gy, gh, gw;
+ m_doc->m_Selection->setGroupRect();
+ m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
+ int dX=qRound(newX - m_mousePressPoint.x()), dY=qRound(newY - m_mousePressPoint.y());
+ erf = true;
+ if (m->modifiers() & Qt::ControlModifier)
+ {
+ if (abs(dX)>abs(dY))
+ dY=0;
+ else
+ if (abs(dY)>abs(dX))
+ dX=0;
+ erf=false;
+ dX+=dragConstrainInitPtX-qRound(gx);
+ dY+=dragConstrainInitPtY-qRound(gy);
+ }
+ m_objectDeltaPos.setXY(dX, dY);
+ if (m_doc->SnapGuides)
+ {
+ m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
+ double nx = gx + m_objectDeltaPos.x();
+ double ny = gy + m_objectDeltaPos.y();
+ double nxo = nx, nyo = ny;
+ m_doc->ApplyGuides(&nx, &ny);
+ m_objectDeltaPos += FPoint(nx-nxo, ny-nyo);
+ nx = nxo = gx + gw + m_objectDeltaPos.x();
+ ny = nyo = gy + gh + m_objectDeltaPos.y();
+ m_doc->ApplyGuides(&nx, &ny);
+ m_objectDeltaPos += FPoint(nx-nxo, ny-nyo);
+ }
+ if (m_doc->useRaster)
+ {
+ double gx, gy, gh, gw, gxo, gyo;
+ m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
+ gx += m_objectDeltaPos.x();
+ gy += m_objectDeltaPos.y();
+ gxo = gx;
+ gyo = gy;
+ FPoint npx = m_doc->ApplyGridF(FPoint(gx, gy));
+ FPoint npw = m_doc->ApplyGridF(FPoint(gx+gw, gy+gh));
+ if ((fabs(gx-npx.x())) > (fabs((gx+gw)-npw.x())))
+ gx = npw.x() - gw;
+ else
+ gx = npx.x();
+ if ((fabs(gy-npx.y())) > (fabs((gy+gh)-npw.y())))
+ gy = npw.y() - gh;
+ else
+ gy = npx.y();
+ if ((fabs(gx - gxo) < (m_doc->guidesSettings.guideRad) / m_canvas->scale()) && (fabs(gy - gyo) < (m_doc->guidesSettings.guideRad) / m_canvas->scale()))
+ m_objectDeltaPos += FPoint(gx-gxo, gy-gyo);
+ }
+ }
+ if (erf)
+ {
+ m_mouseCurrentPoint.setXY(newX, newY);
+ }
+
+ {
+ double gx, gy, gh, gw;
+ m_doc->m_Selection->getVisualGroupRect(&gx, &gy, &gw, &gh);
+ m_doc->adjustCanvas(FPoint(gx,gy), FPoint(gx+gw, gy+gh));
+ QPoint selectionCenter = m_canvas->canvasToLocal(QPointF(gx+gw/2, gy+gh/2));
+ QPoint localMousePos = m_canvas->canvasToLocal(mousePointDoc);
+ int localwidth = static_cast<int>(gw * m_canvas->scale());
+ int localheight = static_cast<int>(gh * m_canvas->scale());
+ if (localwidth > 200)
+ {
+ localwidth = 0;
+ selectionCenter.setX(localMousePos.x());
+ }
+ if (localheight > 200)
+ {
+ localheight = 0;
+ selectionCenter.setY(localMousePos.y());
+ }
+ m_view->ensureVisible(selectionCenter.x(), selectionCenter.y(), localwidth/2 + 20, localheight/2 + 20);
+ m_canvas->repaint();
+ m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
+ m_canvas->displayCorrectedXYHUD(m->globalPos(), gx + m_objectDeltaPos.x(), gy + m_objectDeltaPos.y());
+ }
+ }
+ }
+ if ((!m_canvas->m_viewMode.m_MouseButtonPressed) && (m_doc->appMode != modeDrawBezierLine))
+ {
+ if (m_doc->m_Selection->isMultipleSelection())
+ {
+ double gx, gy, gh, gw;
+ m_doc->m_Selection->getVisualGroupRect(&gx, &gy, &gw, &gh);
+ int how = m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), QRectF(gx, gy, gw, gh));
+ if (how >= 0)
+ {
+ if (how > 0)
+ {
+ setResizeCursor(how);
+ }
+ else
+ {
+ qApp->changeOverrideCursor(QCursor(Qt::OpenHandCursor));
+ }
+ }
+ else
+ {
+ setModeCursor();
+ }
+ return;
+ }
+ for (int a = 0; a < m_doc->m_Selection->count(); ++a)
+ {
+ currItem = m_doc->m_Selection->itemAt(a);
+ if (currItem->locked())
+ break;
+ QMatrix p;
+ m_canvas->Transform(currItem, p);
+ QRect mpo = QRect(m->x()-m_doc->guidesSettings.grabRad, m->y()-m_doc->guidesSettings.grabRad, m_doc->guidesSettings.grabRad*2, m_doc->guidesSettings.grabRad*2);
+
+ if ((QRegion(p.map(QPolygon(QRect(-3, -3, static_cast<int>(currItem->width()+6), static_cast<int>(currItem->height()+6))))).contains(mpo)))
+ {
+ QRect tx = p.mapRect(QRect(0, 0, static_cast<int>(currItem->width()), static_cast<int>(currItem->height())));
+ if ((tx.intersects(mpo)) && (!currItem->locked()))
+ {
+ qApp->changeOverrideCursor(QCursor(Qt::OpenHandCursor));
+ if (!currItem->sizeLocked())
+ m_view->HandleCurs(currItem, mpo);
+ }
+ }
+ else
+ {
+// setModeCursor();
+ }
+ }
+ if (GetItem(&currItem) && m_doc->appMode == modeNormal)
+ {
+ int how = m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), currItem);
+ if (how > 0)
+ {
+ if(currItem->asLine())
+ qApp->changeOverrideCursor(QCursor(Qt::SizeAllCursor));
+ else if(!currItem->locked() && !currItem->sizeLocked())
+ setResizeCursor(how, currItem->rotation());
+ }
+ else if (how == 0)
+ qApp->changeOverrideCursor(QCursor(Qt::OpenHandCursor));
+ else
+ {
+ qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
+ }
+ }
+ }
+ }
+ else
+ {
+ if ((m_canvas->m_viewMode.m_MouseButtonPressed) && (m->buttons() & Qt::LeftButton))
+ {
+ newX = qRound(mousePointDoc.x()); //m_view->translateToDoc(m->x(), m->y()).x());
+ newY = qRound(mousePointDoc.y()); //m_view->translateToDoc(m->x(), m->y()).y());
+ m_mouseSavedPoint.setXY(newX, newY);
+ QPoint startP = m_canvas->canvasToGlobal(m_mousePressPoint);
+ m_view->redrawMarker->setGeometry(QRect(startP, m->globalPos()).normalized());
+ if (!m_view->redrawMarker->isVisible())
+ m_view->redrawMarker->show();
+ m_view->HaveSelRect = true;
+ return;
+ }
+ }
+}
+
+void CanvasMode_Normal::mousePressEvent(QMouseEvent *m)
+{
+// qDebug("CanvasMode_Normal::mousePressEvent");
+ const FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
+ PageItem *currItem;
+
+ m_objectDeltaPos = FPoint(0, 0);
+ m_mousePressPoint = m_mouseCurrentPoint = mousePointDoc;
+ m_mouseSavedPoint = mousePointDoc;
+ 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;
+
+ m->accept();
+ m_view->registerMousePress(m->globalPos());
+ QRect mpo(m->x()-m_doc->guidesSettings.grabRad, m->y()-m_doc->guidesSettings.grabRad, m_doc->guidesSettings.grabRad*2, m_doc->guidesSettings.grabRad*2);
+ if (m->button() == Qt::MidButton)
+ {
+ m_view->MidButt = true;
+ if (m->modifiers() & Qt::ControlModifier)
+ m_view->DrawNew();
+ return;
+ }
+
+ if ((GetItem(&currItem)) && (!m_lastPosWasOverGuide))
+ {
+ if ((currItem->asLine()) && (!m_doc->m_Selection->isMultipleSelection()))
+ {
+ if (!lineMoveGesture)
+ lineMoveGesture = new LineMove(this);
+
+ lineMoveGesture->mousePressEvent(m);
+ if (lineMoveGesture->haveLineItem())
+ {
+ m_view->startGesture(lineMoveGesture);
+ return;
+ }
+ }
+ else
+ {
+ bool isMS=m_doc->m_Selection->isMultipleSelection();
+ if (isMS || (!isMS && (!currItem->locked() && !currItem->sizeLocked())))
+ {
+ if (!resizeGesture)
+ resizeGesture = new ResizeGesture(this);
+
+ resizeGesture->mousePressEvent(m);
+ if (resizeGesture->frameHandle() > 0)
+ {
+ m_view->startGesture(resizeGesture);
+ return;
+ }
+ }
+//#7928 else
+//#7928 return;
+ }
+
+ qApp->changeOverrideCursor(Qt::ClosedHandCursor);
+#if 1
+ if (m_doc->m_Selection->isMultipleSelection())
+ {
+ m_canvas->PaintSizeRect(QRect());
+ double gx, gy, gh, gw;
+ bool shiftSel = true;
+ m_doc->m_Selection->getVisualGroupRect(&gx, &gy, &gw, &gh);
+ dragConstrainInitPtX = qRound(gx);
+ dragConstrainInitPtY = qRound(gy);
+ frameResizeHandle = m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), QRectF(gx, gy, gw, gh));
+ if (frameResizeHandle == Canvas::OUTSIDE ||
+ (frameResizeHandle == Canvas::INSIDE && m->modifiers() != Qt::NoModifier))
+ {
+ frameResizeHandle = 0;
+ m_doc->m_Selection->delaySignalsOn();
+ m_view->updatesOn(false);
+ shiftSel = SeleItem(m);
+ m_view->updatesOn(true);
+ m_doc->m_Selection->delaySignalsOff();
+ }
+ if (((m_doc->m_Selection->count() == 0) || (!shiftSel)) && (m->modifiers() == Qt::ShiftModifier))
+ {
+ shiftSelItems = true;
+ m_mouseCurrentPoint = m_mousePressPoint = m_mouseSavedPoint = mousePointDoc;
+ }
+ else
+ shiftSelItems = false;
+ m_canvas->setRenderModeFillBuffer();
+ }
+ else // not multiple selection
+ {
+ dragConstrainInitPtX = qRound(currItem->xPos());
+ dragConstrainInitPtY = qRound(currItem->yPos());
+
+ // dont call SeleItem() without need here:
+ frameResizeHandle = m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), currItem);
+ //#6797
+ if (frameResizeHandle <= 0 || m->modifiers() != Qt::NoModifier)
+ {
+ m_doc->m_Selection->delaySignalsOn();
+ m_view->updatesOn(false);
+ SeleItem(m); //Where we send the mouse press event to select an item
+ if (GetItem(&currItem))
+ frameResizeHandle = m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), currItem);
+ else
+ frameResizeHandle = 0;
+ m_view->updatesOn(true);
+ m_doc->m_Selection->delaySignalsOff();
+ }
+ if ((currItem && !currItem->locked() && frameResizeHandle > 0) == false)
+ {
+ m_mouseCurrentPoint = m_mousePressPoint = m_mouseSavedPoint = mousePointDoc;
+ }
+ }
+ m_canvas->setRenderModeFillBuffer();
+#endif
+ }
+ else // !GetItem()
+ {
+ SeleItem(m);
+ if (m_doc->m_Selection->count() == 0)
+ {
+ m_mouseCurrentPoint = m_mousePressPoint = m_mouseSavedPoint = mousePointDoc;
+ m_view->redrawMarker->setGeometry(m->globalPos().x(), m->globalPos().y(), 1, 1);
+ m_view->redrawMarker->show();
+ }
+ else
+ {
+ m_canvas->setRenderModeFillBuffer();
+ }
+ }
+/* if (m->button() == MidButton)
+ {
+ MidButt = true;
+ if (m_doc->m_Selection->count() != 0)
+ m_view->Deselect(true);
+ DrawNew();
+ } */
+ if ((m_doc->m_Selection->count() != 0) && (m->button() == Qt::RightButton))
+ {
+ m_canvas->m_viewMode.m_MouseButtonPressed = true;
+ m_mousePressPoint = m_mouseCurrentPoint;
+ }
+// Commented out to fix bug #7865
+// if ((m_doc->m_Selection->count() != 0) && (m->button() == Qt::LeftButton) && (frameResizeHandle == 0))
+// {
+// m_view->startDragTimer();
+// }
+ m_canvas->PaintSizeRect(QRect());
+}
+
+
+
+void CanvasMode_Normal::mouseReleaseEvent(QMouseEvent *m)
+{
+// qDebug("CanvasMode_Normal::mouseReleaseEvent");
+#ifdef GESTURE_FRAME_PREVIEW
+ clearPixmapCache();
+#endif // GESTURE_FRAME_PREVIEW
+ const FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
+ PageItem *currItem;
+ m_canvas->m_viewMode.m_MouseButtonPressed = false;
+ m_canvas->resetRenderMode();
+ m->accept();
+ m_view->redrawMarker->hide();
+// m_view->stopDragTimer();
+ //m_canvas->update(); //ugly in a mouseReleaseEvent!!!!!!!
+ if ((!GetItem(&currItem)) && (m->button() == Qt::RightButton) && (!m_doc->DragP))
+ {
+ createContextMenu(NULL, mousePointDoc.x(), mousePointDoc.y());
+ return;
+ }
+ if ((GetItem(&currItem)) && (m->button() == Qt::RightButton) && (!m_doc->DragP))
+ {
+ createContextMenu(currItem, mousePointDoc.x(), mousePointDoc.y());
+ return;
+ }
+ if (m_view->moveTimerElapsed() && (GetItem(&currItem)))
+ {
+// m_view->stopDragTimer();
+ m_canvas->setRenderModeUseBuffer(false);
+ if (!m_doc->m_Selection->isMultipleSelection())
+ {
+ m_doc->setRedrawBounding(currItem);
+ currItem->OwnPage = m_doc->OnPage(currItem);
+ m_canvas->m_viewMode.operItemResizing = false;
+ if (currItem->asLine())
+ m_view->updateContents();
+ }
+ if (m_canvas->m_viewMode.operItemMoving)
+ {
+ // we want to invalidate all frames under the moved frame
+ // hm, I will try to be more explicit :) - pm
+ int itemIndex = m_doc->Items->count();
+ PageItem* underItem( m_canvas->itemUnderItem(currItem, itemIndex) );
+ while(underItem)
+ {
+ if(underItem->asTextFrame())
+ underItem->asTextFrame()->invalidateLayout();
+ else
+ underItem->invalidateLayout();
+
+ underItem = m_canvas->itemUnderItem(currItem, itemIndex);
+ }
+
+ m_view->updatesOn(false);
+ if (!m_view->groupTransactionStarted())
+ {
+ m_view->startGroupTransaction(Um::Move, "", Um::IMove);
+ }
+ if (m_doc->m_Selection->isMultipleSelection())
+ {
+ m_doc->moveGroup(m_objectDeltaPos.x(), m_objectDeltaPos.y());
+ m_doc->m_Selection->setGroupRect();
+ double gx, gy, gh, gw;
+ m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
+ double nx = gx;
+ double ny = gy;
+ if (!m_doc->ApplyGuides(&nx, &ny))
+ {
+ FPoint npx = m_doc->ApplyGridF(FPoint(gx, gy));
+ FPoint npw = m_doc->ApplyGridF(FPoint(gx+gw, gy+gh));
+ if ((fabs(gx-npx.x())) > (fabs((gx+gw)-npw.x())))
+ nx = npw.x() - gw;
+ else
+ nx = npx.x();
+ if ((fabs(gy-npx.y())) > (fabs((gy+gh)-npw.y())))
+ ny = npw.y() - gh;
+ else
+ ny = npx.y();
+ }
+ m_doc->moveGroup(nx-gx, ny-gy, false);
+ m_doc->m_Selection->setGroupRect();
+ m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
+ nx = gx+gw;
+ ny = gy+gh;
+ if (m_doc->ApplyGuides(&nx, &ny))
+ m_doc->moveGroup(nx-(gx+gw), ny-(gy+gh), false);
+ m_doc->m_Selection->setGroupRect();
+ }
+ else
+ {
+ currItem = m_doc->m_Selection->itemAt(0);
+ m_doc->MoveItem(m_objectDeltaPos.x(), m_objectDeltaPos.y(), currItem);
+ if (m_doc->useRaster)
+ {
+ double nx = currItem->xPos();
+ double ny = currItem->yPos();
+ if (!m_doc->ApplyGuides(&nx, &ny))
+ {
+ m_doc->m_Selection->setGroupRect();
+ double gx, gy, gh, gw, gxo, gyo;
+ m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
+ gxo = gx;
+ gyo = gy;
+ FPoint npx = m_doc->ApplyGridF(FPoint(gx, gy));
+ FPoint npw = m_doc->ApplyGridF(FPoint(gx+gw, gy+gh));
+ if ((fabs(gx-npx.x())) > (fabs((gx+gw)-npw.x())))
+ gx = npw.x() - gw;
+ else
+ gx = npx.x();
+ if ((fabs(gy-npx.y())) > (fabs((gy+gh)-npw.y())))
+ gy = npw.y() - gh;
+ else
+ gy = npx.y();
+ if ((fabs(gx - gxo) < (m_doc->guidesSettings.guideRad) / m_canvas->scale()) && (fabs(gy - gyo) < (m_doc->guidesSettings.guideRad) / m_canvas->scale()))
+ {
+ nx += (gx - gxo);
+ ny += (gy - gyo);
+ }
+ }
+ m_doc->MoveItem(nx-currItem->xPos(), ny-currItem->yPos(), currItem);
+ }
+ }
+ m_canvas->m_viewMode.operItemMoving = false;
+ if (m_doc->m_Selection->isMultipleSelection())
+ {
+ double gx, gy, gh, gw;
+ m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
+ FPoint maxSize(gx+gw+m_doc->scratch.Right, gy+gh+m_doc->scratch.Bottom);
+ FPoint minSize(gx-m_doc->scratch.Left, gy-m_doc->scratch.Top);
+ m_doc->adjustCanvas(minSize, maxSize);
+ }
+ m_doc->setRedrawBounding(currItem);
+ currItem->OwnPage = m_doc->OnPage(currItem);
+ if (currItem->OwnPage != -1)
+ {
+ m_doc->setCurrentPage(m_doc->Pages->at(currItem->OwnPage));
+ m_view->setMenTxt(currItem->OwnPage);
+ }
+ //CB done with emitAllToGUI
+ //emit HaveSel(currItem->itemType());
+ //EmitValues(currItem);
+ //CB need this for? a moved item will send its new data with the new xpos/ypos emits
+ //CB TODO And what if we have dragged to a new page. Items X&Y are not updated anyway now
+ //currItem->emitAllToGUI();
+ m_view->updatesOn(true);
+ m_view->updateContents();
+ m_doc->changed();
+ }
+ }
+ //CB Drag selection performed here
+ if (((m_doc->m_Selection->count() == 0) && (m_view->HaveSelRect) && (!m_view->MidButt)) || ((shiftSelItems) && (m_view->HaveSelRect) && (!m_view->MidButt)))
+ {
+ double dx = m_mouseSavedPoint.x() - m_mousePressPoint.x();
+ double dy = m_mouseSavedPoint.y() - m_mousePressPoint.y();
+ QRectF canvasSele = QRectF(m_mousePressPoint.x(), m_mousePressPoint.y(), dx, dy).normalized();
+ QRectF localSele = m_canvas->canvasToLocal(canvasSele).normalized();
+ if (!m_doc->masterPageMode())
+ {
+ uint docPagesCount=m_doc->Pages->count();
+ uint docCurrPageNo=m_doc->currentPageNumber();
+ for (uint i = 0; i < docPagesCount; ++i)
+ {
+ Page* page = m_doc->Pages->at(i);
+ QRectF pageRect(page->xOffset(), page->yOffset(), page->width(), page->height());
+ if (pageRect.intersects(canvasSele))
+ {
+ if (docCurrPageNo != i)
+ {
+ m_doc->setCurrentPage(m_doc->Pages->at(i));
+ m_view->setMenTxt(i);
+ }
+ break;
+ }
+ }
+ m_view->setRulerPos(m_view->contentsX(), m_view->contentsY());
+ }
+ int docItemCount=m_doc->Items->count();
+ if (docItemCount != 0)
+ {
+ m_doc->m_Selection->delaySignalsOn();
+ for (int a = 0; a < docItemCount; ++a)
+ {
+ PageItem* docItem = m_doc->Items->at(a);
+ if ((m_doc->masterPageMode()) && (docItem->OnMasterPage != m_doc->currentPage()->pageName()))
+ continue;
+ QRect apr2 = m_canvas->canvasToLocal( docItem->getCurrentBoundingRect(docItem->lineWidth()) );
+ if ((localSele.contains(apr2)) && (docItem->LayerNr == m_doc->activeLayer()) && (!m_doc->layerLocked(docItem->LayerNr)))
+ {
+ bool redrawSelection=false;
+ m_view->SelectItemNr(a, redrawSelection);
+ }
+ }
+ m_doc->m_Selection->delaySignalsOff();
+ if (m_doc->m_Selection->count() > 1)
+ {
+ m_doc->m_Selection->setGroupRect();
+ double x, y, w, h;
+ m_doc->m_Selection->getGroupRect(&x, &y, &w, &h);
+ m_view->getGroupRectScreen(&x, &y, &w, &h);
+ }
+ }
+ m_view->HaveSelRect = false;
+ shiftSelItems = false;
+// m_view->redrawMarker->hide();
+ m_view->updateContents();
+ }
+ if (m_doc->appMode != modeEdit)
+ {
+ if (!PrefsManager::instance()->appPrefs.stickyTools)
+ m_view->requestMode(modeNormal);
+ else
+ {
+ int appMode = m_doc->appMode;
+ m_view->requestMode(appMode);
+ }
+ }
+ if (GetItem(&currItem))
+ {
+ qApp->changeOverrideCursor(QCursor(Qt::OpenHandCursor));
+ if (m_doc->m_Selection->count() > 1)
+ {
+ m_doc->m_Selection->setGroupRect();
+ double x, y, w, h;
+ m_doc->m_Selection->getGroupRect(&x, &y, &w, &h);
+ m_canvas->m_viewMode.operItemMoving = false;
+ m_canvas->m_viewMode.operItemResizing = false;
+ m_view->updateContents(QRect(static_cast<int>(x-5), static_cast<int>(y-5), static_cast<int>(w+10), static_cast<int>(h+10)));
+ m_ScMW->propertiesPalette->setXY(x,y);
+ m_ScMW->propertiesPalette->setBH(w,h);
+ }
+ /*else
+ currItem->emitAllToGUI();*/
+ }
+ else
+ m_view->Deselect(true);
+ 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;
+ shiftSelItems = false;
+ if (m_view->groupTransactionStarted())
+ {
+ for (int i = 0; i < m_doc->m_Selection->count(); ++i)
+ m_doc->m_Selection->itemAt(i)->checkChanges(true);
+ m_view->endGroupTransaction();
+ }
+ for (int i = 0; i < m_doc->m_Selection->count(); ++i)
+ m_doc->m_Selection->itemAt(i)->checkChanges(true);
+ //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);
+ }
+}
+
+//CB-->Doc/Fix
+bool CanvasMode_Normal::SeleItem(QMouseEvent *m)
+{
+// qDebug()<<"CanvasMode_Normal::SeleItem";
+ m_canvas->m_viewMode.operItemSelecting = true;
+ const unsigned SELECT_IN_GROUP = Qt::AltModifier;
+ const unsigned SELECT_MULTIPLE = Qt::ShiftModifier;
+ const unsigned SELECT_BENEATH = Qt::ControlModifier;
+ QMatrix p;
+ PageItem *currItem;
+ m_canvas->m_viewMode.m_MouseButtonPressed = true;
+ FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
+ m_mouseCurrentPoint = mousePointDoc;
+ double grabRadius = m_doc->guidesSettings.grabRad / m_canvas->scale();
+ int MxpS = static_cast<int>(mousePointDoc.x());
+ int MypS = static_cast<int>(mousePointDoc.y());
+ QRectF mpo(m_mouseCurrentPoint.x()-grabRadius, m_mouseCurrentPoint.y()-grabRadius, grabRadius*2, grabRadius*2);
+ m_doc->nodeEdit.deselect();
+
+ if(!m_doc->guidesSettings.before) // guides are on foreground and want to be processed first
+ {
+ if ((m_doc->guidesSettings.guidesShown) && (m_doc->OnPage(MxpS, MypS) != -1))
+ {
+ // #9002: Resize points undraggable when object is aligned to a guide
+ // Allow item resize when guides are aligned to item while preserving
+ // ability to drag guide when guis is in foreground and inside selection
+ bool enableGuideGesture(true);
+ if (m_doc->m_Selection->count() > 0)
+ {
+ double gx(0.0), gy(0.0), gw(0.0), gh(0.0);
+ m_doc->m_Selection->setGroupRect();
+ m_doc->m_Selection->getVisualGroupRect(&gx, &gy, &gw, &gh);
+ Canvas::FrameHandle frameResizeHandle = m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), QRectF(gx, gy, gw, gh));
+ enableGuideGesture = (frameResizeHandle == Canvas::INSIDE);
+ }
+ if (enableGuideGesture)
+ {
+ if (!guideMoveGesture)
+ {
+ guideMoveGesture = new RulerGesture(m_view, RulerGesture::HORIZONTAL);
+ connect(guideMoveGesture,SIGNAL(guideInfo(int, qreal)), m_ScMW->alignDistributePalette,SLOT(setGuide(int, qreal)));
+ }
+ if ( (!m_doc->GuideLock) && (guideMoveGesture->mouseHitsGuide(mousePointDoc)) )
+ {
+ m_view->startGesture(guideMoveGesture);
+ guideMoveGesture->mouseMoveEvent(m);
+ m_doc->m_Selection->connectItemToGUI();
+ // qDebug()<<"Out Of SeleItem"<<__LINE__;
+ return true;
+ }
+ else
+ {
+ // If we call startGesture now, a new guide is created each time.
+ // ### could be a weakness to avoid calling it tho.
+ // m_view->startGesture(guideMoveGesture);
+ guideMoveGesture->mouseSelectGuide(m);
+ }
+ }
+ }
+ }
+ bool pageChanged(false);
+ if (!m_doc->masterPageMode())
+ {
+ int pgNum = -1;
+ int docPageCount = static_cast<int>(m_doc->Pages->count() - 1);
+ MarginStruct pageBleeds;
+ bool drawBleed = false;
+ if (m_doc->bleeds.hasNonZeroValue() && m_doc->guidesSettings.showBleed)
+ drawBleed = true;
+ for (int a = docPageCount; a > -1; a--)
+ {
+ if (drawBleed)
+ m_doc->getBleeds(a, pageBleeds);
+ int x = static_cast<int>(m_doc->Pages->at(a)->xOffset() - pageBleeds.Left);
+ int y = static_cast<int>(m_doc->Pages->at(a)->yOffset() - pageBleeds.Top);
+ int w = static_cast<int>(m_doc->Pages->at(a)->width() + pageBleeds.Left + pageBleeds.Right);
+ int h = static_cast<int>(m_doc->Pages->at(a)->height() + pageBleeds.Bottom + pageBleeds.Top);
+ if (QRect(x, y, w, h).contains(MxpS, MypS))
+ {
+ pgNum = static_cast<int>(a);
+ if (drawBleed) // check again if its really on the correct page
+ {
+ for (int a2 = docPageCount; a2 > -1; a2--)
+ {
+ int xn = static_cast<int>(m_doc->Pages->at(a2)->xOffset());
+ int yn = static_cast<int>(m_doc->Pages->at(a2)->yOffset());
+ int wn = static_cast<int>(m_doc->Pages->at(a2)->width());
+ int hn = static_cast<int>(m_doc->Pages->at(a2)->height());
+ if (QRect(xn, yn, wn, hn).contains(MxpS, MypS))
+ {
+ pgNum = static_cast<int>(a2);
+ break;
+ }
+ }
+ }
+ break;
+ }
+ }
+ if (pgNum >= 0)
+ {
+ if (m_doc->currentPageNumber() != pgNum)
+ {
+ m_doc->setCurrentPage(m_doc->Pages->at(unsigned(pgNum)));
+ m_view->setMenTxt(unsigned(pgNum));
+ pageChanged = true;
+ }
+ }
+ m_view->setRulerPos(m_view->contentsX(), m_view->contentsY());
+ }
+
+ currItem = NULL;
+ if ((m->modifiers() & SELECT_BENEATH) != 0)
+ {
+ for (int i=0; i < m_doc->m_Selection->count(); ++i)
+ {
+ if (m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), m_doc->m_Selection->itemAt(i)) >= 0)
+ {
+ currItem = m_doc->m_Selection->itemAt(i);
+// qDebug() << "select item: found BENEATH" << currItem << "groups" << currItem->Groups.count();
+ if (currItem->Groups.count() > 0)
+ {
+ m_doc->m_Selection->delaySignalsOn();
+ for (int ga=0; ga<m_doc->Items->count(); ++ga)
+ {
+ PageItem* item = m_doc->Items->at(ga);
+ if (item->Groups.count() != 0)
+ {
+ if (item->Groups.top() == currItem->Groups.top())
+ {
+ if (m_doc->m_Selection->findItem(item) >= 0)
+ {
+ m_doc->m_Selection->removeItem(item);
+ }
+ }
+ }
+ }
+ m_doc->m_Selection->delaySignalsOff();
+ }
+ else
+ {
+ m_doc->m_Selection->removeItem(currItem);
+ }
+ break;
+ }
+// else
+// qDebug() << "select item: not BENEATH" << QPointF(mousePointDoc.x(),mousePointDoc.y())
+// << m_doc->m_Selection->itemAt(i)->getTransform()
+// << m_doc->m_Selection->itemAt(i)->getBoundingRect();
+ }
+ }
+ else if ( (m->modifiers() & SELECT_MULTIPLE) == Qt::NoModifier)
+ {
+ m_view->Deselect(false);
+ }
+
+// qDebug() << "select item: beneath" << (m->modifiers() & SELECT_BENEATH) << currItem
+// << "multi" << (m->modifiers() & SELECT_MULTIPLE)
+// << "current sel" << m_doc->m_Selection->count();
+ currItem = m_canvas->itemUnderCursor(m->globalPos(), currItem, (m->modifiers() & SELECT_IN_GROUP));
+// qDebug() << "item under cursor: " << currItem;
+ if (currItem)
+ {
+ m_doc->m_Selection->delaySignalsOn();
+ if (m_doc->m_Selection->containsItem(currItem))
+ {
+ m_doc->m_Selection->removeItem(currItem);
+ }
+ else
+ {
+ //CB: If we have a selection but the user clicks with control on another item that is not below the current
+ //then clear and select the new item
+ if ((m->modifiers() == SELECT_BENEATH) && m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), currItem) >= 0)
+ m_doc->m_Selection->clear();
+ //CB: #7186: This was prependItem, does not seem to need to be anymore with current select code
+ m_doc->m_Selection->addItem(currItem);
+ if ( (m->modifiers() & SELECT_IN_GROUP) && (!currItem->isGroupControl))
+ {
+ currItem->isSingleSel = true;
+ }
+ else if (currItem->Groups.count() > 0)
+ {
+ for (int ga=0; ga<m_doc->Items->count(); ++ga)
+ {
+ PageItem* item = m_doc->Items->at(ga);
+ if (item->Groups.count() != 0)
+ {
+ if (item->Groups.top() == currItem->Groups.top())
+ {
+ if (item->ItemNr != currItem->ItemNr)
+ {
+ if (m_doc->m_Selection->findItem(item) == -1)
+ {
+ m_doc->m_Selection->addItem(item, true);
+ }
+ }
+ item->isSingleSel = false;
+ }
+ }
+ }
+ }
+ }
+ if(pageChanged)
+ {
+ m_canvas->m_viewMode.forceRedraw = true;
+ m_canvas->update();
+ }
+ else
+// currItem->update();
+ m_canvas->update();
+
+ m_doc->m_Selection->delaySignalsOff();
+ if (m_doc->m_Selection->count() > 1)
+ {
+ m_doc->beginUpdate();
+ for (int aa = 0; aa < m_doc->m_Selection->count(); ++aa)
+ {
+ PageItem *bb = m_doc->m_Selection->itemAt(aa);
+ bb->update();
+ }
+ m_doc->endUpdate();
+ m_doc->m_Selection->setGroupRect();
+ double x, y, w, h;
+ m_doc->m_Selection->getGroupRect(&x, &y, &w, &h);
+ // emit ItemPos(x, y);
+ // emit ItemGeom(w, h);
+ m_view->getGroupRectScreen(&x, &y, &w, &h);
+ // m_view->updateContents(QRect(static_cast<int>(x-5), static_cast<int>(y-5), static_cast<int>(w+10), static_cast<int>(h+10)));
+ // emit HaveSel(currItem->itemType());
+ }
+// if (m_doc->m_Selection->count() == 1)
+// {
+// frameResizeHandle = m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), currItem); // HandleSizer(currItem, mpo.toRect(), m);
+// if ((frameResizeHandle == Canvas::INSIDE) && (!currItem->locked()))
+// {
+// qDebug()<<__LINE__<< "QCursor(Qt::OpenHandCursor)";
+// qApp->changeOverrideCursor(QCursor(Qt::OpenHandCursor));
+// }
+// }
+// else
+// {
+// qDebug()<<__LINE__<< "QCursor(Qt::OpenHandCursor)";
+// qApp->changeOverrideCursor(QCursor(Qt::OpenHandCursor));
+// }
+// qDebug()<<"Out Of SeleItem"<<__LINE__;
+ return true;
+ }
+ if ((m_doc->guidesSettings.guidesShown) /*&& (!m_doc->GuideLock)*/ && (m_doc->OnPage(MxpS, MypS) != -1))
+ {
+ if (!guideMoveGesture)
+ {
+ guideMoveGesture = new RulerGesture(m_view, RulerGesture::HORIZONTAL);
+ connect(guideMoveGesture,SIGNAL(guideInfo(int, qreal)), m_ScMW->alignDistributePalette,SLOT(setGuide(int, qreal)));
+ }
+ if ( (!m_doc->GuideLock) && (guideMoveGesture->mouseHitsGuide(mousePointDoc)) )
+ {
+ m_view->startGesture(guideMoveGesture);
+ guideMoveGesture->mouseMoveEvent(m);
+ //m_doc->m_Selection->setIsGUISelection(true);
+ m_doc->m_Selection->connectItemToGUI();
+// qDebug()<<"Out Of SeleItem"<<__LINE__;
+ return true;
+ }
+ else
+ {
+ // If we call startGesture now, a new guide is created each time.
+ // ### could be a weakness to avoid calling it tho.
+// m_view->startGesture(guideMoveGesture);
+ guideMoveGesture->mouseSelectGuide(m);
+ }
+ }
+ //m_doc->m_Selection->setIsGUISelection(true);
+ m_doc->m_Selection->connectItemToGUI();
+ if ( !(m->modifiers() & SELECT_MULTIPLE))
+ {
+ if(m_doc->m_Selection->isEmpty())
+ {
+ m_canvas->m_viewMode.forceRedraw = true;
+ m_canvas->update();
+ }
+ else
+ m_view->Deselect(true);
+ }
+// qDebug()<<"Out Of SeleItem"<<__LINE__;
+ return false;
+}
+
+void CanvasMode_Normal::importToPage()
+{
+ QString fileName;
+ QString allFormats = tr("All Supported Formats")+" (";
+ QString formats = "";
+ int fmtCode = FORMATID_ODGIMPORT;
+ const FileFormat *fmt = LoadSavePlugin::getFormatById(fmtCode);
+ while (fmt != 0)
+ {
+ if (fmt->load)
+ {
+ formats += fmt->filter + ";;";
+ int an = fmt->filter.indexOf("(");
+ int en = fmt->filter.indexOf(")");
+ while (an != -1)
+ {
+ allFormats += fmt->filter.mid(an+1, en-an-1)+" ";
+ an = fmt->filter.indexOf("(", en);
+ en = fmt->filter.indexOf(")", an);
+ }
+ }
+ fmtCode++;
+ fmt = LoadSavePlugin::getFormatById(fmtCode);
+ }
+ allFormats += "*.sce *.SCE ";
+ allFormats += "*.shape *.SHAPE ";
+ allFormats += "*.sml *.SML);;";
+ formats += "Scribus Objects (*.sce *.SCE);;";
+ formats += "Dia Shapes (*.shape *.SHAPE);;";
+ formats += "Kivio Stencils (*.sml *.SML)";
+ allFormats += formats;
+ PrefsContext* dirs = PrefsManager::instance()->prefsFile->getContext("dirs");
+ QString wdir = dirs->get("pastefile", ".");
+ FPoint pastePoint = m_mouseCurrentPoint;
+ CustomFDialog dia(m_view, wdir, tr("Open"), allFormats, fdHidePreviewCheckBox | fdExistingFiles);
+ if (dia.exec() == QDialog::Accepted)
+ fileName = dia.selectedFile();
+ else
+ return;
+ if (!fileName.isEmpty())
+ {
+ PrefsManager::instance()->prefsFile->getContext("dirs")->set("pastefile", fileName.left(fileName.lastIndexOf("/")));
+ m_doc->setLoading(true);
+ QFileInfo fi(fileName);
+ if (fi.suffix().toLower() == "sml")
+ {
+ QString f = "";
+ loadText(fileName, &f);
+ StencilReader *pre = new StencilReader();
+ fileName = pre->createObjects(f);
+ delete pre;
+ }
+ else if (fi.suffix().toLower() == "shape")
+ {
+ QString f = "";
+ loadText(fileName, &f);
+ StencilReader *pre = new StencilReader();
+ fileName = pre->createShape(f);
+ delete pre;
+ }
+ bool savedAlignGrid = m_doc->useRaster;
+ bool savedAlignGuides = m_doc->SnapGuides;
+ m_doc->useRaster = false;
+ m_doc->SnapGuides = false;
+ if (fi.suffix().toLower() == "sce")
+ m_ScMW->slotElemRead(fileName, pastePoint.x(), pastePoint.y(), true, false, m_doc, m_doc->view());
+ else if ((fi.suffix().toLower() == "shape") || (fi.suffix().toLower() == "sml"))
+ m_ScMW->slotElemRead(fileName, pastePoint.x(), pastePoint.y(), false, true, m_doc, m_doc->view());
+ else
+ {
+ FileLoader *fileLoader = new FileLoader(fileName);
+ int testResult = fileLoader->TestFile();
+ delete fileLoader;
+ if ((testResult != -1) && (testResult >= FORMATID_ODGIMPORT))
+ {
+ const FileFormat * fmt = LoadSavePlugin::getFormatById(testResult);
+ if( fmt )
+ fmt->loadFile(fileName, LoadSavePlugin::lfUseCurrentPage|LoadSavePlugin::lfInteractive|LoadSavePlugin::lfScripted);
+ }
+ if (m_doc->m_Selection->count() > 0)
+ {
+ double x2, y2, w, h;
+ m_doc->m_Selection->getGroupRect(&x2, &y2, &w, &h);
+ m_doc->moveGroup(pastePoint.x() - x2, pastePoint.y() - y2);
+ m_ScMW->propertiesPalette->updateColorList();
+ m_ScMW->propertiesPalette->paraStyleCombo->updateFormatList();
+ m_ScMW->propertiesPalette->charStyleCombo->updateFormatList();
+ m_ScMW->propertiesPalette->SetLineFormats(m_doc);
+ }
+ }
+ for (int a = 0; a < m_doc->m_Selection->count(); ++a)
+ {
+ PageItem *currItem = m_doc->m_Selection->itemAt(a);
+ currItem->LayerNr = m_doc->activeLayer();
+ }
+ m_doc->useRaster = savedAlignGrid;
+ m_doc->SnapGuides = savedAlignGuides;
+ m_doc->setLoading(false);
+ m_doc->view()->DrawNew();
+ if (m_doc->m_Selection->count() > 0)
+ {
+ m_doc->m_Selection->connectItemToGUI();
+ m_ScMW->HaveNewSel(m_doc->m_Selection->itemAt(0)->itemType());
+ }
+ }
+}
+
+void CanvasMode_Normal::createContextMenu(PageItem* currItem, double mx, double my)
+{
+ ContextMenu* cmen=NULL;
+ qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
+ m_view->setObjectUndoMode();
+ m_mouseCurrentPoint.setXY(mx, my);
+ if(currItem!=NULL)
+ cmen = new ContextMenu(*(m_doc->m_Selection), m_ScMW, m_doc);
+ else
+ cmen = new ContextMenu(m_ScMW, m_doc, mx, my);
+ if (cmen)
+ cmen->exec(QCursor::pos());
+ m_view->setGlobalUndoMode();
+ delete cmen;
+}