r23353 by jghali - #15934: Nodes editor: Moving nodes with the keyboard cannot be undone
scribus-commit
scribus-commit at lists.scribus.net
Tue Nov 12 11:03:24 UTC 2019
Author: jghali
Date: Tue Nov 12 11:03:24 2019
New Revision: 23353
URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=23353
Log:
#15934: Nodes editor: Moving nodes with the keyboard cannot be undone
Modified:
trunk/Scribus/scribus/canvasmode.cpp
trunk/Scribus/scribus/canvasmode_nodeedit.cpp
trunk/Scribus/scribus/nodeeditcontext.cpp
Modified: trunk/Scribus/scribus/canvasmode.cpp
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=23353&path=/trunk/Scribus/scribus/canvasmode.cpp
==============================================================================
--- trunk/Scribus/scribus/canvasmode.cpp (original)
+++ trunk/Scribus/scribus/canvasmode.cpp Tue Nov 12 11:03:24 2019
@@ -1,1660 +1,1673 @@
-/*
- 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.h"
-
-#include "actionmanager.h"
-#include "appmodes.h"
-#include "canvas.h"
-#include "canvasgesture_pan.h"
-#include "canvasmode_copyproperties.h"
-#include "canvasmode_create.h"
-#include "canvasmode_drawbezier.h"
-#include "canvasmode_drawfreehand.h"
-#include "canvasmode_drawcalligraphic.h"
-#include "canvasmode_edit.h"
-#include "canvasmode_editarc.h"
-#include "canvasmode_editgradient.h"
-#include "canvasmode_editmeshgradient.h"
-#include "canvasmode_editmeshpatch.h"
-#include "canvasmode_editpolygon.h"
-#include "canvasmode_editspiral.h"
-#include "canvasmode_edittable.h"
-#include "canvasmode_editweldpoint.h"
-#include "canvasmode_eyedropper.h"
-#include "canvasmode_framelinks.h"
-#include "canvasmode_imageimport.h"
-#include "canvasmode_magnifier.h"
-#include "canvasmode_measurements.h"
-#include "canvasmode_nodeedit.h"
-#include "canvasmode_normal.h"
-#include "canvasmode_objimport.h"
-#include "canvasmode_panning.h"
-#include "canvasmode_rotate.h"
-#ifdef GESTURE_FRAME_PREVIEW
-#include "pageitempreview.h"
-#endif
-#include "pageitem_group.h"
-#include "pageitem_textframe.h"
-#include "prefsmanager.h"
-#include "selection.h"
-#include "sccolorengine.h"
-#include "scpainter.h"
-#include "scraction.h"
-#include "scribus.h"
-#include "scribusdoc.h"
-#include "scribusview.h"
-#include "ui/checkDocument.h"
-#include "ui/contextmenu.h"
-#include "ui/outlinepalette.h"
-#include "ui/pageselector.h"
-#include "ui/scrapbookpalette.h"
-#include "ui/scrspinbox.h"
-#include "ui/scresizecursor.h"
-#include "undomanager.h"
-#include "units.h"
-#include "iconmanager.h"
-#include "util_math.h"
-
-#include <QMdiArea>
-#include <QMdiSubWindow>
-#include <QPainter>
-#include <QPointF>
-
-CanvasMode::CanvasMode (ScribusView* view) :
- m_view(view),
- m_canvas(view->m_canvas),
- m_doc(view->Doc),
- m_panGesture(nullptr),
- undoManager(UndoManager::instance()),
- xSnap(0.0),
- ySnap(0.0)
-{
- m_pen["outline"] = QPen(Qt::gray, 1.0 , Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
- m_pen["outline"].setCosmetic(true);
- m_pen["selection"] = QPen(PrefsManager::instance().appPrefs.displayPrefs.frameColor, 1.0, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
- m_pen["selection"].setCosmetic(true);
- m_pen["selection-group"] = QPen(Qt::red, 1.0 , Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
- m_pen["selection-group"].setCosmetic(true);
- m_pen["selection-group-inside"] = QPen(PrefsManager::instance().appPrefs.displayPrefs.frameGroupColor, 1.0 , Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
- m_pen["selection-group-inside"].setCosmetic(true);
- m_pen["handle"] = QPen(PrefsManager::instance().appPrefs.displayPrefs.frameColor, 1.0, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
- m_pen["handle"].setCosmetic(true);
-
- m_brush["outline"] = Qt::NoBrush;
- m_brush["selection"] = Qt::NoBrush;
- m_brush["selection-group"] = QColor(255,0,0,10);
- m_brush["selection-group-inside"] = Qt::NoBrush;
- m_brush["handle"] = PrefsManager::instance().appPrefs.displayPrefs.frameColor;
-
- m_keyRepeat = false;
- m_arrowKeyDown = false;
- //m_mousePointDoc = FPoint(0,0);
-}
-
-CanvasMode::~CanvasMode()
-{
- delete m_panGesture;
-}
-
-CanvasMode* CanvasMode::createForAppMode(ScribusView* view, int appMode)
-{
- CanvasMode* result;
-
- switch (appMode)
- {
- case modeNormal:
- case modeStoryEditor:
- result = new CanvasMode_Normal(view);
- break;
- case modeCopyProperties:
- result = new CanvasMode_CopyProperties(view);
- break;
- case modeEdit:
- result = new CanvasMode_Edit(view);
- break;
- case modeEditClip:
- result = new CanvasMode_NodeEdit(view);
- break;
- case modeEditGradientVectors:
- result = new CanvasMode_EditGradient(view);
- break;
- case modeEditMeshGradient:
- result = new CanvasMode_EditMeshGradient(view);
- break;
- case modeEditMeshPatch:
- result = new CanvasMode_EditMeshPatch(view);
- break;
- case modeEditWeldPoint:
- result = new CanvasMode_EditWeldPoint(view);
- break;
- case modeDrawBezierLine:
- result = new BezierMode(view);
- break;
- case modeDrawFreehandLine:
- result = new FreehandMode(view);
- break;
- case modeDrawCalligraphicLine:
- result = new CalligraphicMode(view);
- break;
- case modeDrawLine:
- case modeDrawShapes:
- case modeDrawImage:
- case modeDrawLatex:
- case modeDrawText:
- case modeDrawTable2:
- case modeDrawRegularPolygon:
- case modeDrawArc:
- case modeDrawSpiral:
- case modeInsertPDFButton:
- case modeInsertPDFRadioButton:
- case modeInsertPDFTextfield:
- case modeInsertPDFCheckbox:
- case modeInsertPDFCombobox:
- case modeInsertPDFListbox:
- case modeInsertPDFTextAnnotation:
- case modeInsertPDFLinkAnnotation:
- case modeInsertPDF3DAnnotation:
- result = new CreateMode(view);
- break;
- case modeEyeDropper:
- result = new CanvasMode_EyeDropper(view);
- break;
- case modeImportObject:
- result = new CanvasMode_ObjImport(view);
- break;
- case modeLinkFrames:
- case modeUnlinkFrames:
- result = new CanvasMode_FrameLinks(view);
- break;
- case modeImportImage:
- result = new CanvasMode_ImageImport(view);
- break;
- case modeMagnifier:
- result = new CanvasMode_Magnifier(view);
- break;
- case modeMeasurementTool:
- result = new MeasurementsMode(view);
- break;
- case modePanning:
- result = new CanvasMode_Panning(view);
- break;
- case modeRotation:
- result = new CanvasMode_Rotate(view);
- break;
- case modeEditArc:
- result = new CanvasMode_EditArc(view);
- break;
- case modeEditPolygon:
- result = new CanvasMode_EditPolygon(view);
- break;
- case modeEditSpiral:
- result = new CanvasMode_EditSpiral(view);
- break;
- case modeEditTable:
- result = new CanvasMode_EditTable(view);
- break;
- // more modes as they are defined...
-
- default:
- result = new CanvasMode_Normal(view);
- break;
- }
- return result;
-}
-
-
-void CanvasMode::updateViewMode(CanvasViewMode* viewmode)
-{
- viewmode->drawSelectedItemsWithControls = false;
- viewmode->drawFramelinksWithContents = false;
-}
-
-void CanvasMode::drawSelectionHandles(QPainter *psx, QRectF selectionRect, bool background, bool insideGroup, double sx, double sy)
-{
- m_pen["handle"] = QPen(PrefsManager::instance().appPrefs.displayPrefs.frameColor, 1.0, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
- m_pen["handle"].setCosmetic(true);
- m_pen["selection-group-inside"] = QPen(PrefsManager::instance().appPrefs.displayPrefs.frameGroupColor, 1.0 , Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
- m_pen["selection-group-inside"].setCosmetic(true);
- QPen ba = QPen(Qt::white, 3.0, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
- ba.setCosmetic(true);
- double markWidth = 4.0 / m_canvas->scale();
- if (insideGroup)
- markWidth /= qMax(sx, sy);
- QRectF handleRect = QRectF(0, 0, markWidth, markWidth);
- double x = selectionRect.x();
- double y = selectionRect.y();
- double w = selectionRect.width();
- double h = selectionRect.height();
- psx->setBrush(Qt::white);
- if (background)
- psx->setPen(ba);
- else
- {
- if (insideGroup)
- psx->setPen(m_pen["selection-group-inside"]);
- else
- psx->setPen(m_pen["handle"]);
- }
- handleRect.moveCenter(QPointF(x, y));
- psx->drawRect(handleRect);
- handleRect.moveCenter(QPointF(x+w/2.0, y));
- psx->drawRect(handleRect);
- handleRect.moveCenter(QPointF(x+w, y));
- psx->drawRect(handleRect);
- handleRect.moveCenter(QPointF(x+w, y+h/2.0));
- psx->drawRect(handleRect);
- handleRect.moveCenter(QPointF(x+w, y+h));
- psx->drawRect(handleRect);
- handleRect.moveCenter(QPointF(x+w/2.0, y+h));
- psx->drawRect(handleRect);
- handleRect.moveCenter(QPointF(x, y+h));
- psx->drawRect(handleRect);
- handleRect.moveCenter(QPointF(x, y+h/2.0));
- psx->drawRect(handleRect);
-}
-
-void CanvasMode::drawSelection(QPainter* psx, bool drawHandles)
-{
- m_pen["selection"] = QPen(PrefsManager::instance().appPrefs.displayPrefs.frameColor, 1.0, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
- m_pen["selection"].setCosmetic(true);
- m_pen["selection-group-inside"] = QPen(PrefsManager::instance().appPrefs.displayPrefs.frameGroupColor, 1.0 , Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
- m_pen["selection-group-inside"].setCosmetic(true);
- QPen ba = QPen(Qt::white, 3.0, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
- ba.setCosmetic(true);
- QPen bb = QPen(Qt::black, 1.0, Qt::DotLine, Qt::FlatCap, Qt::MiterJoin);
- bb.setCosmetic(true);
- psx->scale(m_canvas->scale(), m_canvas->scale());
- psx->translate(-m_doc->minCanvasCoordinate.x(), -m_doc->minCanvasCoordinate.y());
- psx->setClipping(true);
- psx->setClipRegion(QRegion(m_canvas->exposedRect()));
- if (m_doc->m_Selection->isMultipleSelection())
- {
- PageItem *curItem(nullptr);
- for(int i = 0; i < m_doc->m_Selection->count(); ++i)
- {
- curItem = m_doc->m_Selection->itemAt(i);
-
- if (drawHandles)
- drawHandles = !curItem->locked();
- }
- // items inside a a multi
- if (m_doc->m_Selection->count() > 1)
- {
- int docSelectionCount = m_doc->m_Selection->count();
- PageItem *currItem;
- for (int i = 0; i < docSelectionCount; ++i)
- {
- currItem = m_doc->m_Selection->itemAt(i);
- if (!m_doc->Items->contains(currItem))
- continue;
- psx->save();
- double lineAdjust(psx->pen().width() / m_canvas->scale());
- double x, y, w, h;
- w = currItem->visualWidth() ;
- h = currItem->visualHeight() ;
- if (currItem->rotation() != 0)
- {
- psx->setRenderHint(QPainter::Antialiasing);
- psx->translate(currItem->xPos(), currItem->yPos());
- psx->rotate(currItem->rotation());
- x = currItem->asLine() ? 0 : (currItem->visualXPos() - currItem->xPos() - lineAdjust);
- y = currItem->asLine() ? (h / -2.0) : (currItem->visualYPos() - currItem->yPos() - lineAdjust);
- }
- else
- {
- psx->translate(currItem->visualXPos(), currItem->visualYPos());
- x = currItem->asLine() ? 0 : -lineAdjust;
- y = currItem->asLine() ? 0 : -lineAdjust;
- }
- psx->setBrush(Qt::NoBrush);
- psx->setPen(ba);
- psx->drawRect(QRectF(x, y, w, h));
- psx->setPen(m_pen["selection-group-inside"]);
- psx->setBrush(m_brush["selection-group-inside"]);
- psx->drawRect(QRectF(x, y, w, h));
- psx->restore();
- }
- }
- psx->save();
- psx->setPen(m_pen["selection-group"]);
- double lineAdjust(psx->pen().width() / m_canvas->scale());
- double x, y, w, h;
- m_doc->m_Selection->setGroupRect();
- m_doc->m_Selection->getVisualGroupRect(&x, &y, &w, &h);
-
- psx->translate(x,y);
- x = -lineAdjust;
- y = -lineAdjust;
-
- psx->setBrush(Qt::NoBrush);
- psx->setPen(ba);
- psx->drawRect(QRectF(x, y, w, h));
- if (drawHandles)
- drawSelectionHandles(psx, QRectF(x, y, w, h), true);
- psx->setPen(m_pen["selection-group"]);
- psx->setBrush(m_brush["selection-group"]);
- psx->drawRect(QRectF(x, y, w, h));
- if (drawHandles)
- drawSelectionHandles(psx, QRectF(x, y, w, h), false);
- psx->restore();
- }
- else if (m_doc->m_Selection->count() != 0)
- {
- int docSelectionCount = m_doc->m_Selection->count();
- PageItem *currItem;
- for (int a = 0; a < docSelectionCount; ++a)
- {
- currItem = m_doc->m_Selection->itemAt(a);
- psx->save();
- psx->setPen(m_pen["selection"]);
- psx->setBrush(m_brush["selection"]);
- double lineAdjust(psx->pen().width() / m_canvas->scale());
- double x, y, w, h;
- if (currItem->isGroupChild())
- {
- QTransform t = currItem->getTransform();
- double sx, sy;
- getScaleFromMatrix(t, sx, sy);
- psx->setTransform(t, true);
- w = currItem->visualWidth();
- h = currItem->visualHeight();
- x = currItem->asLine() ? 0 : (-currItem->visualLineWidth() / 2.0);
- y = -currItem->visualLineWidth() / 2.0;
- psx->setBrush(Qt::NoBrush);
- QRectF drRect = QRectF(x, y, w, h).normalized();
- if (m_doc->drawAsPreview && !m_doc->editOnPreview)
- {
- if (!currItem->annotation().IsOpen())
- {
- psx->setPen(bb);
- psx->setBrush(Qt::NoBrush);
- psx->drawRect(drRect.adjusted(-1, -1, 1, 1));
- }
- }
- else
- {
- psx->setPen(ba);
- psx->drawRect(drRect);
- if (drawHandles)
- drawSelectionHandles(psx, QRectF(x, y, w, h), true, true, sx, sy);
- psx->setPen(m_pen["selection-group-inside"]);
- psx->setBrush(m_brush["selection-group-inside"]);
- psx->drawRect(drRect);
- if (drawHandles)
- drawSelectionHandles(psx, QRectF(x, y, w, h), false, true, sx, sy);
- }
- }
- else
- {
- w = currItem->visualWidth();
- h = currItem->visualHeight();
- if (currItem->rotation() != 0)
- {
- psx->setRenderHint(QPainter::Antialiasing);
- psx->translate(currItem->xPos(), currItem->yPos());
- psx->rotate(currItem->rotation());
- x = currItem->asLine() ? 0 : (currItem->visualXPos() - currItem->xPos() - lineAdjust);
- y = currItem->asLine() ? (h / -2.0) : (currItem->visualYPos() - currItem->yPos() - lineAdjust);
- }
- else
- {
- psx->translate(currItem->visualXPos(), currItem->visualYPos());
- x = currItem->asLine() ? 0 : -lineAdjust;
- y = currItem->asLine() ? 0 : -lineAdjust;
- }
- psx->setBrush(Qt::NoBrush);
- if (m_doc->drawAsPreview && !m_doc->editOnPreview)
- {
- if (!currItem->annotation().IsOpen())
- {
- psx->setPen(bb);
- psx->setBrush(Qt::NoBrush);
- psx->drawRect(QRectF(x, y, w, h).adjusted(-1, -1, 1, 1));
- }
- }
- else
- {
- psx->setPen(ba);
- psx->drawRect(QRectF(x, y, w, h));
- if (drawHandles && !currItem->locked() && !currItem->isLine())
- drawSelectionHandles(psx, QRectF(x, y, w, h), true);
- psx->setPen(m_pen["selection"]);
- psx->setBrush(m_brush["selection"]);
- psx->drawRect(QRectF(x, y, w, h));
- }
- if (drawHandles && !currItem->locked())
- {
- if (currItem->asLine())
- {
- const double markWidth = 4.0 / m_canvas->scale();
- QRectF handleRect = QRectF(0, 0, markWidth, markWidth);
- psx->setRenderHint(QPainter::Antialiasing);
- psx->setBrush(Qt::white);
- psx->setPen(m_pen["handle"]);
- handleRect.moveCenter(QPointF(x, y+h/2.0));
- psx->drawRect(handleRect);
- handleRect.moveCenter(QPointF(x+w, y+h/2.0));
- psx->drawRect(handleRect);
- }
- else
- drawSelectionHandles(psx, QRectF(x, y, w, h), false);
- }
- if (currItem->isWelded())
- {
- psx->setPen(QPen(Qt::yellow, 8.0 / m_canvas->scale(), Qt::SolidLine, Qt::RoundCap, Qt::MiterJoin));
- for (int i = 0 ; i < currItem->weldList.count(); i++)
- {
- PageItem::WeldingInfo wInf = currItem->weldList.at(i);
- psx->drawPoint(QPointF(wInf.weldPoint.x(), wInf.weldPoint.y()));
- }
- }
- }
-
- psx->restore();
- }
-
- }
-}
-
-
-void CanvasMode::drawOutline(QPainter* p, double deltax, double deltay)
-{
- p->save();
- p->scale(m_canvas->scale(), m_canvas->scale());
- p->translate(-m_doc->minCanvasCoordinate.x(), -m_doc->minCanvasCoordinate.y());
-
- if (m_doc->m_Selection->count() == 1)
- {
- PageItem *currItem = m_doc->m_Selection->itemAt(0);
-
-// QRectF br(currItem->getVisualBoundingRect());
-#ifdef GESTURE_FRAME_PREVIEW
- QImage *pixItem(0);
- if (m_pixmapCache.contains(currItem))
- {
- if (m_pixmapCache.value(currItem)->isReady())
- pixItem = m_pixmapCache.value(currItem)->getImage();
- }
- else
- {
- m_pixmapCache[currItem] = new PageItemPreview(currItem);
- }
-
- if (pixItem)
- {
- p->save();
- p->translate(br.x(),br.y());
- p->translate(deltax, deltay);
- p->drawImage(br.toRect(), *pixItem, pixItem->rect());
- p->restore();
- }
-#endif // GESTURE_FRAME_PREVIEW
- {
- QTransform itemTrans = currItem->getTransform(deltax, deltay);
- double visualWidth = currItem->visualWidth();
- double visualHeight = currItem->visualHeight();
- double visualLineWidth = currItem->visualLineWidth();
- double matRot = getRotationDFromMatrix(itemTrans);
-
- if (currItem->isGroup())
- {
- p->save();
- p->setBrush(m_brush["outline"]);
- p->setPen(m_pen["outline"]);
- p->setWorldTransform(itemTrans, true);
- if (matRot != 0)
- p->setRenderHint(QPainter::Antialiasing);
- p->drawRect(QRectF(0.0, 0.0, visualWidth, visualHeight));
- p->setClipping(true);
- p->setClipRect(QRectF(0.0, 0.0, visualWidth, visualHeight));
- PageItem_Group* gItem = currItem->asGroupFrame();
- int itemCountG = gItem->groupItemList.count();
- if (itemCountG < m_canvas->moveWithFullOutlinesThreshold)
- {
- if (gItem->imageFlippedH())
- {
- p->translate(gItem->width(), 0);
- p->scale(-1, 1);
- }
- if (gItem->imageFlippedV())
- {
- p->translate(0, gItem->height());
- p->scale(1, -1);
- }
- p->scale(gItem->width() / gItem->groupWidth, gItem->height() / gItem->groupHeight);
- for (int cg = 0; cg < itemCountG; cg++)
- {
- p->save();
- currItem = gItem->groupItemList.at(cg);
- p->translate(currItem->gXpos, currItem->gYpos);
- if (currItem->rotation() != 0)
- {
- p->setRenderHint(QPainter::Antialiasing);
- p->rotate(currItem->rotation());
- }
- p->drawPath(currItem->PoLine.toQPainterPath(false));
- p->restore();
- }
- }
- else
- {
- currItem->DrawPolyL(p, currItem->Clip);
- }
- p->restore();
- }
- else
- {
- p->save();
- p->setBrush(m_brush["outline"]);
- p->setPen(m_pen["outline"]);
- p->setWorldTransform(itemTrans, true);
- if (matRot != 0)
- p->setRenderHint(QPainter::Antialiasing);
- if (currItem->isLine())
- p->drawRect(QRectF(0.0, -visualLineWidth / 2.0, currItem->visualWidth(), currItem->visualHeight()));
- else
- p->drawRect(QRectF(-visualLineWidth / 2.0, -visualLineWidth / 2.0, currItem->visualWidth(), currItem->visualHeight()));
- p->restore();
-
- p->save();
- p->setBrush(m_brush["outline"]);
- p->setPen(m_pen["outline"]);
- p->setWorldTransform(itemTrans, true);
- if (matRot != 0)
- p->setRenderHint(QPainter::Antialiasing);
- p->drawPath(currItem->PoLine.toQPainterPath(false));
- p->restore();
- }
- }
- }
- else if (m_doc->m_Selection->count() > 1)
- {
- double x, y, w, h;
- m_doc->m_Selection->setGroupRect();
- m_doc->m_Selection->getGroupRect(&x, &y, &w, &h);
- int docSelectionCount = m_doc->m_Selection->count();
- if (docSelectionCount < m_canvas->moveWithBoxesOnlyThreshold)
- {
- PageItem *currItem;
- for (int i = 0; i < docSelectionCount; ++i)
- {
- currItem = m_doc->m_Selection->itemAt(i);
- if (!currItem->Parent && !m_doc->Items->contains(currItem))
- continue;
- if (currItem->Parent && !currItem->Parent->groupItemList.contains(currItem))
- continue;
-
- QTransform itemTrans = currItem->getTransform(deltax, deltay);
- double visualWidth = currItem->visualWidth();
- double visualHeight = currItem->visualHeight();
- double visualLineWidth = currItem->visualLineWidth();
- double matRot = getRotationDFromMatrix(itemTrans);
-
- p->save();
- if (docSelectionCount < m_canvas->moveWithFullOutlinesThreshold)
- {
-// QRectF br(currItem->getVisualBoundingRect());
-#ifdef GESTURE_FRAME_PREVIEW
- QImage *pixItem(0);
- if (m_pixmapCache.contains(currItem))
- {
- if (m_pixmapCache.value(currItem)->isReady())
- pixItem = m_pixmapCache.value(currItem)->getImage();
- }
- else
- {
- m_pixmapCache[currItem] = new PageItemPreview(currItem);
- }
-
-
- if (pixItem)
- {
- p->save();
-// p->translate(br.x() /*- x*/, br.y() /*- y*/);
- p->drawImage(br.toRect(), *pixItem, pixItem->rect());
- p->restore();
- }
-#endif // GESTURE_FRAME_PREVIEW
- {
- p->save();
- p->setBrush(m_brush["outline"]);
- p->setPen(m_pen["outline"]);
- p->setWorldTransform(itemTrans, true);
- if (matRot != 0)
- p->setRenderHint(QPainter::Antialiasing);
- if (currItem->isLine())
- p->drawRect(QRectF(0.0, -visualLineWidth / 2.0, visualWidth, visualHeight));
- else
- p->drawRect(QRectF(-visualLineWidth / 2.0, -visualLineWidth / 2.0, visualWidth, visualHeight));
- p->restore();
-
- p->save();
- p->setBrush(m_brush["outline"]);
- p->setPen(m_pen["outline"]);
- p->setWorldTransform(itemTrans, true);
- if (matRot != 0)
- p->setRenderHint(QPainter::Antialiasing);
- p->drawPath(currItem->PoLine.toQPainterPath(false));
- p->restore();
- }
- }
- else
- {
- p->setBrush(m_brush["outline"]);
- p->setPen(m_pen["outline"]);
- p->setWorldTransform(itemTrans, true);
- if (matRot != 0)
- p->setRenderHint(QPainter::Antialiasing);
- if (currItem->isLine())
- p->drawRect(QRectF(0.0, -visualLineWidth / 2.0, visualWidth, visualHeight));
- else
- p->drawRect(QRectF(-visualLineWidth / 2.0, -visualLineWidth / 2.0, visualWidth, visualHeight));
- }
- p->restore();
- }
- }
- else
- {
- p->setBrush(m_brush["outline"]);
- p->setPen(m_pen["outline"]);
- p->translate(deltax, deltay);
- p->translate(x, y);
- p->drawRect(QRectF(0, 0, w, h));
- }
- }
- p->restore();
-}
-
-QCursor CanvasMode::modeCursor()
-{
- IconManager& im=IconManager::instance();
- QCursor cursor;
- switch (m_doc->appMode)
- {
- case modeDrawShapes:
- case modeDrawArc:
- case modeDrawSpiral:
- cursor = im.loadCursor("drawframe.png");
- break;
- case modeDrawImage:
- cursor = im.loadCursor("drawimageframe.png");
- break;
- case modeDrawLatex:
- cursor = im.loadCursor("drawlatexframe.png");
- break;
- case modeDrawText:
- cursor = im.loadCursor("drawtextframe.png");
- break;
- case modeDrawTable2:
- cursor = im.loadCursor("drawtable.png");
- break;
- case modeDrawRegularPolygon:
- cursor = im.loadCursor("drawpolyline.png");
- break;
- case modeDrawLine:
- case modeDrawBezierLine:
- cursor = QCursor(Qt::CrossCursor);
- break;
- case modeDrawFreehandLine:
- cursor = im.loadCursor("DrawFreeLine.png", 0, 31);
- break;
- case modeDrawCalligraphicLine:
- cursor = im.loadCursor("drawcalligraphy.png", 4, 4);
- break;
- case modeImportObject:
- cursor = im.loadCursor("dragpix.png");
- break;
- case modeMagnifier:
- if (m_view->Magnify)
- cursor = im.loadCursor("lupez.png");
- else
- cursor = im.loadCursor("lupezm.png");
- break;
- case modePanning:
- cursor = im.loadCursor("handc.png");
- break;
- case modeEyeDropper:
- cursor = im.loadCursor("colorpickercursor.png", 0, 31);
- break;
- case modeLinkFrames:
- cursor = im.loadCursor("LinkTextFrame.png", 0, 31);
- break;
- case modeMeasurementTool:
- case modeEditGradientVectors:
- case modeEditMeshGradient:
- case modeEditMeshPatch:
- case modeEditWeldPoint:
- case modeInsertPDFButton:
- case modeInsertPDFRadioButton:
- case modeInsertPDFTextfield:
- case modeInsertPDFCheckbox:
- case modeInsertPDFCombobox:
- case modeInsertPDFListbox:
- case modeInsertPDFTextAnnotation:
- case modeInsertPDFLinkAnnotation:
- case modeInsertPDF3DAnnotation:
- case modeEditArc:
- case modeEditPolygon:
- case modeEditSpiral:
- cursor = QCursor(Qt::CrossCursor);
- break;
- default:
- cursor = QCursor(Qt::ArrowCursor);
- break;
- }
- return cursor;
-}
-
-void CanvasMode::setModeCursor()
-{
- IconManager& im=IconManager::instance();
- //NOTE: Merge with similar code in ScribusMainWindow::setAppMode()
- switch (m_doc->appMode)
- {
- case modeDrawShapes:
- case modeDrawArc:
- case modeDrawSpiral:
- m_view->setCursor(im.loadCursor("drawframe.png"));
- break;
- case modeDrawImage:
- m_view->setCursor(im.loadCursor("drawimageframe.png"));
- break;
- case modeDrawLatex:
- m_view->setCursor(im.loadCursor("drawlatexframe.png"));
- break;
- case modeDrawText:
- m_view->setCursor(im.loadCursor("drawtextframe.png"));
- break;
- case modeDrawTable2:
- m_view->setCursor(im.loadCursor("drawtable.png"));
- break;
- case modeDrawRegularPolygon:
- m_view->setCursor(im.loadCursor("drawpolyline.png"));
- break;
- case modeDrawLine:
- case modeDrawBezierLine:
- m_view->setCursor(QCursor(Qt::CrossCursor));
- break;
- case modeDrawFreehandLine:
- m_view->setCursor(im.loadCursor("DrawFreeLine.png", 0, 31));
- break;
- case modeDrawCalligraphicLine:
- m_view->setCursor(im.loadCursor("drawcalligraphy.png", 4, 4));
- break;
- case modeImportObject:
- m_view->setCursor(im.loadCursor("dragpix.png"));
- break;
- case modeMagnifier:
- if (m_view->Magnify)
- m_view->setCursor(im.loadCursor("lupez.png"));
- else
- m_view->setCursor(im.loadCursor("lupezm.png"));
- break;
- case modePanning:
- m_view->setCursor(im.loadCursor("handc.png"));
- break;
- case modeEyeDropper:
- m_view->setCursor(im.loadCursor("colorpickercursor.png", 0, 31));
- break;
- case modeLinkFrames:
- m_view->setCursor(im.loadCursor("LinkTextFrame.png", 0, 31));
- break;
- case modeMeasurementTool:
- case modeEditGradientVectors:
- case modeEditMeshGradient:
- case modeEditMeshPatch:
- case modeEditWeldPoint:
- case modeInsertPDFButton:
- case modeInsertPDFRadioButton:
- case modeInsertPDFTextfield:
- case modeInsertPDFCheckbox:
- case modeInsertPDFCombobox:
- case modeInsertPDFListbox:
- case modeInsertPDFTextAnnotation:
- case modeInsertPDFLinkAnnotation:
- case modeInsertPDF3DAnnotation:
- case modeEditArc:
- case modeEditPolygon:
- case modeEditSpiral:
- m_view->setCursor(QCursor(Qt::CrossCursor));
- break;
- default:
- m_view->setCursor(QCursor(Qt::ArrowCursor));
- break;
- }
-}
-
-#ifdef GESTURE_FRAME_PREVIEW
-void CanvasMode::clearPixmapCache()
-{
- if (m_pixmapCache.count())
- {
- foreach(PageItemPreview* ip, m_pixmapCache)
- {
- if (ip)
- delete ip;
- }
- m_pixmapCache.clear();
- }
-}
-#endif // GESTURE_FRAME_PREVIEW
-
-void CanvasMode::drawSnapLine(QPainter* p)
-{
- if (!m_doc->SnapElement)
- return;
- if (xSnap == 0.0 && ySnap == 0.0)
- return;
- int page = m_doc->OnPage(m_view->m_mousePointDoc.x(), m_view->m_mousePointDoc.y());
- if (page == -1)
- return;
- MarginStruct bleedValues;
- ScPage* dragToPage=m_doc->Pages->at(page);
- if (!dragToPage)
- return;
- m_doc->getBleeds(dragToPage, bleedValues);
- double xOffset = dragToPage->xOffset() - bleedValues.left();
- double yOffset = dragToPage->yOffset() - bleedValues.top();
- QPoint pageOrigin = m_canvas->canvasToLocal(QPointF(xOffset, yOffset));
- if (ySnap)
- {
- p->setPen(Qt::green);
- QPoint pt = m_canvas->canvasToLocal(QPointF(xOffset, ySnap));
- double w = (dragToPage->width() + bleedValues.left() + bleedValues.right()) * m_canvas->scale();
- p->drawLine(pageOrigin.x(), pt.y(), pageOrigin.x() + w, pt.y());
- ySnap = 0;
- }
- if (xSnap)
- {
- p->setPen(Qt::green);
- QPoint pt = m_canvas->canvasToLocal(QPointF(xSnap, yOffset));
- double h = (dragToPage->height() + bleedValues.bottom() + bleedValues.top()) * m_canvas->scale();
- p->drawLine(pt.x(), pageOrigin.y(), pt.x(), pageOrigin.y() + h);
- xSnap = 0;
- }
-}
-
-void CanvasMode::setResizeCursor(int how, double rot)
-{
- switch (how)
- {
- case 1:
- case 2:
- m_view->setCursor(ScResizeCursor(135 + rot));// Qt::SizeFDiagCursor
- break;
- case 3:
- case 4:
- m_view->setCursor(ScResizeCursor(45 + rot));// Qt::SizeBDiagCursor
- break;
- case 5:
- case 8:
- m_view->setCursor(ScResizeCursor(0 + rot));// Qt::SizeVerCursor
- break;
- case 6:
- case 7:
- m_view->setCursor(ScResizeCursor(90 + rot));// Qt::SizeHorCursor
- break;
- default:
- m_view->setCursor(QCursor(Qt::SizeAllCursor));
- break;
- }
-}
-
-bool CanvasMode::commonMouseMove(QMouseEvent *m)
-{
- //m_mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
- if ((m_canvas->m_viewMode.m_MouseButtonPressed && (m->buttons() & Qt::RightButton) && (m->modifiers() & Qt::ControlModifier)) || ((!(m->modifiers() & Qt::ControlModifier)) && (m->buttons() & Qt::MidButton)))
- {
- if (!m_panGesture)
- {
- m_panGesture = new PanGesture(this);
- }
- m_view->startGesture(m_panGesture);
- m_panGesture->mousePressEvent(m); // Not an error, this is used to register current canvas point
- return true;
- }
- return false;
-}
-
-void CanvasMode::commonDrawControls(QPainter* p, bool drawHandles)
-{
- if (m_canvas->m_viewMode.operItemMoving)
- drawOutline(p);
- else
- drawSelection(p, drawHandles);
-}
-
-void CanvasMode::commonDrawTextCursor(QPainter* p, PageItem_TextFrame* textframe, const QPointF& offset)
-{
- QLineF cursor;
- QPen cPen (Qt::black, 0.9 , Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
-
- // normalize Current Position
- textframe->itemText.normalizeCursorPosition();
- int textCursorPos (textframe->itemText.cursorPosition());
- cursor = textframe->textLayout.positionToPoint(textCursorPos);
-
- cPen.setColor(ScColorEngine::getRGBColor(m_doc->PageColors[textframe->itemText.charStyle(textCursorPos).fillColor()], m_doc));
-
- p->save();
- p->setTransform(textframe->getTransform(), true);
- p->setPen(cPen);
- p->setRenderHint(QPainter::Antialiasing, true);
- p->drawLine(cursor.translated(offset));
- p->restore();
-}
-
-void CanvasMode::commonkeyPressEvent_NormalNodeEdit(QKeyEvent *e)
-{
- int kk = e->key();
- Qt::KeyboardModifiers buttonModifiers = e->modifiers();
-// QString uc = e->text();
- ScribusMainWindow* mainWindow = m_view->m_ScMW;
- QList<QMdiSubWindow *> windows;
-
- QMdiArea* mdiArea = mainWindow->mdiArea;
- QMdiSubWindow* w = nullptr;
- PrefsManager& prefsManager = PrefsManager::instance();
- OutlinePalette* outlinePalette = mainWindow->outlinePalette;
- CheckDocument* docCheckerPalette = mainWindow->docCheckerPalette;
- QMap<QString, QPointer<ScrAction> >& scrActions(mainWindow->scrActions);
-
- if (m_keyRepeat)
- return;
- m_keyRepeat = true;
- int keyMod=0;
- if (e->modifiers() & Qt::ShiftModifier)
- keyMod |= Qt::SHIFT;
- if (e->modifiers() & Qt::ControlModifier)
- keyMod |= Qt::CTRL;
- if (e->modifiers() & Qt::AltModifier)
- keyMod |= Qt::ALT;
- //User presses escape and we have a doc open, and we have an item selected
- if (kk == Qt::Key_Escape)
- {
- m_keyRepeat = false;
- PageItem *currItem;
- if (m_doc->m_Selection->count() != 0)
- {
- currItem = m_doc->m_Selection->itemAt(0);
- currItem->Sizing = false;
- if (m_doc->SubMode != -1)
- {
- m_view->Deselect(false);
- m_doc->Items->removeOne(currItem);
- }
- else
- m_view->Deselect(false);
- m_view->cancelGroupTransaction();
- }
- m_doc->DragP = false;
- m_doc->leaveDrag = false;
- m_view->stopAllDrags();
- m_doc->SubMode = -1;
- m_doc->ElemToLink = nullptr;
- mainWindow->slotSelect();
- if (m_doc->m_Selection->isEmpty())
- mainWindow->HaveNewSel();
- prefsManager.appPrefs.uiPrefs.stickyTools = false;
- scrActions["stickyTools"]->setChecked(false);
- return;
- }
- if (m_view->m_ScMW->actionManager->compareKeySeqToShortcut(kk, e->modifiers(), "toolsZoomIn"))
- scrActions["toolsZoomIn"]->trigger();
- if (m_view->m_ScMW->actionManager->compareKeySeqToShortcut(kk, e->modifiers(), "toolsZoomOut"))
- scrActions["toolsZoomOut"]->trigger();
- /**If we have a doc and we are not changing the page or zoom level in the status bar */
- if ((!m_view->m_ScMW->zoomSpinBox->hasFocus()) && (!m_view->m_ScMW->pageSelector->hasFocus()))
- {
- //Show our context menu
- if (m_view->m_ScMW->actionManager->compareKeySeqToShortcut(kk, e->modifiers(), "viewShowContextMenu"))
- {
- ContextMenu* cmen=nullptr;
- m_view->setCursor(QCursor(Qt::ArrowCursor));
- if (m_doc->m_Selection->isEmpty())
- {
- //CB We should be able to get this calculated by the canvas.... it is already in m_canvas->globalToCanvas(m->globalPos());
- FPoint fp = m_canvas->globalToCanvas(QCursor::pos());
- cmen = new ContextMenu(mainWindow, m_doc, fp.x(), fp.y());
- }
- else
- cmen = new ContextMenu(*(m_doc->m_Selection), mainWindow, m_doc);
- if (cmen)
- {
- mainWindow->setUndoMode(true);
- cmen->exec(QCursor::pos());
- mainWindow->setUndoMode(false);
- }
- delete cmen;
- }
-
-
- /**
- * With no item selected we can:
- * - With space, get into panning mode (modePanning)
- * - With PageUp, scroll up
- * - With PageDown, scroll down
- * - With Tab, change active document windowActivated
- */
-
- if (m_doc->m_Selection->isEmpty())
- {
- int wheelVal = prefsManager.mouseWheelJump();
- if ((buttonModifiers & Qt::ShiftModifier) && !(buttonModifiers & Qt::ControlModifier) && !(buttonModifiers & Qt::AltModifier))
- wheelVal = qMax(qRound(wheelVal / 10.0), 1);
- switch (kk)
- {
- case Qt::Key_Space:
- m_keyRepeat = false;
- if (m_doc->appMode == modePanning)
- m_view->requestMode(modeNormal);
- else
- m_view->requestMode(modePanning);
- return;
- break;
- case Qt::Key_Left:
- m_view->scrollBy(-wheelVal, 0);
- m_keyRepeat = false;
- return;
- break;
- case Qt::Key_Right:
- m_view->scrollBy(wheelVal, 0);
- m_keyRepeat = false;
- return;
- break;
- case Qt::Key_Up:
- m_view->scrollBy(0, -wheelVal);
- m_keyRepeat = false;
- return;
- break;
- case Qt::Key_Down:
- m_view->scrollBy(0, wheelVal);
- m_keyRepeat = false;
- return;
- break;
- case Qt::Key_Tab:
- if (buttonModifiers == Qt::ControlModifier)
- {
- m_keyRepeat = false;
- windows = mdiArea->subWindowList();
- if (windows.count() > 1)
- {
- for (int i = 0; i < static_cast<int>(windows.count()); ++i)
- {
- if (mdiArea->activeSubWindow() == windows.at(i))
- {
- if (i == static_cast<int>(windows.count()-1))
- w = windows.at(0);
- else
- w = windows.at(i+1);
- break;
- }
- }
- outlinePalette->buildReopenVals();
- docCheckerPalette->clearErrorList();
- if (w)
- w->showNormal();
- mainWindow->newActWin(w);
- }
- return;
- }
- break;
- }
- }
- //Allow page up/down even when items are selected
- switch (kk)
- {
- case Qt::Key_PageUp:
- if (m_doc->masterPageMode() || m_doc->symbolEditMode())
- m_view->scrollBy(0, -prefsManager.mouseWheelJump());
- else
- {
- int pg = m_doc->currentPageNumber();
- if ((buttonModifiers & Qt::ShiftModifier) && !(buttonModifiers & Qt::ControlModifier) && !(buttonModifiers & Qt::AltModifier))
- pg--;
- else
- pg -= m_doc->pageSets()[m_doc->pagePositioning()].Columns;
- if (pg > -1)
- m_view->GotoPage(pg);
- }
- m_keyRepeat = false;
- return;
- break;
- case Qt::Key_PageDown:
- if (m_doc->masterPageMode() || m_doc->symbolEditMode())
- m_view->scrollBy(0, prefsManager.mouseWheelJump());
- else
- {
- int pg = m_doc->currentPageNumber();
- if ((buttonModifiers & Qt::ShiftModifier) && !(buttonModifiers & Qt::ControlModifier) && !(buttonModifiers & Qt::AltModifier))
- pg++;
- else
- pg += m_doc->pageSets()[m_doc->pagePositioning()].Columns;
- if (pg < static_cast<int>(m_doc->Pages->count()))
- m_view->GotoPage(pg);
- }
- m_keyRepeat = false;
- return;
- break;
- }
-
- /** Now if we have an item selected
- * - In normal mode we can:
- * -- Use backspace or delete to delete the item
- * -- Use itemRaise action shortcut to raise an item (actionmanager.cpp connect, no code here)
- * -- Use itemLower action shortcut to lower an item (actionmanager.cpp connect, no code here)
- * -- Use the arrow keys to move an item or group around for !inches:
- With no meta, by 1.0 unit
- Ctrl, by 10.0 units
- Shift by 0.1 units
- Ctrl Shift 0.01 units
- - For inches:
- With no meta, by 1.0 pt
- Ctrl, by 1.0 unit
- Shift by 0.1 units
- Ctrl Shift 0.01 units
- * -- Use the arrow keys to resize an item:
- Alt right arrow, move right side outwards (expand)
- Alt left arrow, move left side outwards (expand)
- Alt Shift right arrow, move left side inwards (shrink)
- Alt Shift left arrow, move right side inwards (shrink)
- * -- In edit mode of an image frame, use the arrow keys to resize the image:
- (flows to pageitem_imageframe for control)
- Alt right arrow, move right side of image outwards (expand)
- Alt left arrow, move right side inwards (shrink)
- Alt down arrow, move bottom side downwards (expand)
- Alt up arrow, move top side inwards (shrink)
- */
- if (m_doc->m_Selection->count() != 0)
- {
- double moveBy=1.0;
- if (m_doc->unitIndex()!=SC_INCHES)
- {
- if ((buttonModifiers & Qt::ShiftModifier) && !(buttonModifiers & Qt::ControlModifier) && !(buttonModifiers & Qt::AltModifier))
- moveBy=0.1;
- else if (!(buttonModifiers & Qt::ShiftModifier) && (buttonModifiers & Qt::ControlModifier) && !(buttonModifiers & Qt::AltModifier))
- moveBy=10.0;
- else if ((buttonModifiers & Qt::ShiftModifier) && (buttonModifiers & Qt::ControlModifier) && !(buttonModifiers & Qt::AltModifier))
- moveBy=0.01;
-
- moveBy/=m_doc->unitRatio();//Lets allow movement by the current doc ratio, not only points
- }
- else
- {
- if ((buttonModifiers & Qt::ShiftModifier) && !(buttonModifiers & Qt::ControlModifier) && !(buttonModifiers & Qt::AltModifier))
- moveBy=0.1/m_doc->unitRatio();
- else if (!(buttonModifiers & Qt::ShiftModifier) && (buttonModifiers & Qt::ControlModifier) && !(buttonModifiers & Qt::AltModifier))
- moveBy=1.0/m_doc->unitRatio();
- else if ((buttonModifiers & Qt::ShiftModifier) && (buttonModifiers & Qt::ControlModifier) && !(buttonModifiers & Qt::AltModifier))
- moveBy=0.01/m_doc->unitRatio();
- }
- bool resizing=((buttonModifiers & Qt::AltModifier) && !(buttonModifiers & Qt::ControlModifier));
- bool resizingsmaller=(resizing && (buttonModifiers & Qt::ShiftModifier));
- double resizeBy=1.0;
-
- //CB with control locked out due to the requirement of moveby of 0.01, we cannot support
- //resizeby 10 units unless we move to supporting modifier keys that most people don't have.
- //if (buttonModifiers & Qt::ControlModifier)
- // resizeBy*=10.0;
- resizeBy/=m_doc->unitRatio();
- if (resizingsmaller)
- resizeBy*=-1.0;
-
- PageItem *currItem = m_doc->m_Selection->itemAt(0);
-
- //#8860
- //rotationFC is a temporary variable to manage items rotation:
- //currently an item with e.g. 40° rotation is as 360° - 40° = 320°
- double rotationFC = fabs(360.0 - currItem->rotation());
- double radRotation = rotationFC * M_PI / 180.0;
-
- bool moveImage = false;
- if ((currItem->asImageFrame() || currItem->asLatexFrame() || currItem->asOSGFrame()) && currItem->imageIsAvailable && !currItem->fitImageToFrame())
- moveImage = true;
-
- switch (kk)
- {
- case Qt::Key_Backspace:
- case Qt::Key_Delete:
- if (buttonModifiers==Qt::NoModifier)
- m_doc->itemSelection_DeleteItem();
- else
- {
- if (m_view->m_ScMW->actionManager->compareKeySeqToShortcut(kk, buttonModifiers, "editClearContents"))
- scrActions["editClearContents"]->trigger();
- if (m_view->m_ScMW->actionManager->compareKeySeqToShortcut(kk, buttonModifiers, "editTruncateContents"))
- scrActions["editTruncateContents"]->trigger();
- }
- break;
- case Qt::Key_Left:
- if (!currItem->locked())
- {
- if (!resizing)
- {
- if ((m_doc->appMode == modeEditClip) && (m_doc->nodeEdit.hasNodeSelected()))
- {
- int storedClRe = m_doc->nodeEdit.clre();
- const auto& nodeSelection = m_doc->nodeEdit.selNode();
- if ((nodeSelection.count() != 0) && (m_doc->nodeEdit.edPoints()))
- {
- QPolygonF poly;
- if ((currItem->imageFlippedH() && (!m_doc->nodeEdit.isContourLine())) && (currItem->isSymbol() || currItem->isGroup()))
- moveBy *= -1;
- for (int itm = 0; itm < nodeSelection.count(); ++itm)
- {
- FPoint np;
- int clRe = nodeSelection.at(itm);
- if (m_doc->nodeEdit.isContourLine())
- np = currItem->ContourLine.point(clRe);
- else
- np = currItem->PoLine.point(clRe);
- m_doc->nodeEdit.setClre(clRe);
- np = np - FPoint(moveBy, 0);
- m_doc->nodeEdit.moveClipPoint(currItem, np);
- poly.append(np.toQPointF());
- }
- QTransform m = currItem->getTransform();
- poly = m.map(poly);
- QRectF oldR = poly.boundingRect().adjusted(-5, -5, 10, 10);
- QRectF newR(currItem->getBoundingRect());
- m_doc->regionsChanged()->update(newR.united(oldR));
- }
- m_doc->nodeEdit.setClre(storedClRe);
- }
- else
- {
- /* Don't use Grid or Guide Snapping when dragging Items or Groups with the keyboard */
- /* as the user might be trying to fine tune a position */
- bool sav1 = m_doc->SnapGuides;
- bool sav3 = m_doc->SnapElement;
- bool sav2 = m_doc->SnapGrid;
- m_doc->SnapGuides = false;
- m_doc->SnapGrid = false;
- m_doc->SnapElement = false;
- if (m_doc->m_Selection->count() > 1)
- m_view->startGroupTransaction(Um::Move, "", Um::IMove);
- m_doc->moveGroup(-moveBy, 0);
- if (m_doc->m_Selection->count() > 1)
- m_view->endGroupTransaction();
- m_doc->SnapElement = sav3;
- m_doc->SnapGuides = sav1;
- m_doc->SnapGrid = sav2;
- }
- }
- else
- {
- //CB If in EditContour mode, allow contour line to be scaled with arrow keys too
- if (m_doc->nodeEdit.isContourLine())
- m_view->TransformPoly(10, 0, resizeBy/unitGetRatioFromIndex(m_doc->unitIndex()));
- else if (!currItem->sizeLocked())
- {
- if ((rotationFC > 0.0 && rotationFC < 45.0) || (rotationFC >= 315.0 && rotationFC <= 360.0))
- {
- m_doc->sizeItem(currItem->width() + resizeBy, currItem->height(), currItem);
- m_doc->moveItem(-resizeBy * cos(radRotation), resizeBy * sin(radRotation), currItem);
- if (moveImage)
- currItem->moveImageXYOffsetBy(resizeBy / currItem->imageXScale(), 0);
- }
- else if (rotationFC >= 45.0 && rotationFC < 135.0)
- {
- m_doc->sizeItem(currItem->width(), currItem->height() + resizeBy, currItem);
- m_doc->moveItem(-resizeBy * sin(radRotation), -resizeBy * cos(radRotation), currItem);
- if (moveImage)
- currItem->moveImageXYOffsetBy(0, resizeBy / currItem->imageYScale());
- }
- else if (rotationFC >= 135.0 && rotationFC < 225.0)
- {
- m_doc->sizeItem(currItem->width() + resizeBy, currItem->height(), currItem);
- }
- else if (rotationFC >= 225.0 && rotationFC < 315.0)
- {
- m_doc->sizeItem(currItem->width(), currItem->height() + resizeBy, currItem);
- }
- currItem->Sizing = false;
- }
- }
- currItem->update();
- mainWindow->slotDocCh();
- }
- break;
- case Qt::Key_Right:
- if (!currItem->locked())
- {
- if (!resizing)
- {
- if ((m_doc->appMode == modeEditClip) && (m_doc->nodeEdit.hasNodeSelected()))
- {
- int storedClRe = m_doc->nodeEdit.clre();
- const auto& nodeSelection = m_doc->nodeEdit.selNode();
- if ((nodeSelection.count() != 0) && (m_doc->nodeEdit.edPoints()))
- {
- QPolygonF poly;
- if ((currItem->imageFlippedH() && (!m_doc->nodeEdit.isContourLine())) && (currItem->isSymbol() || currItem->isGroup()))
- moveBy *= -1;
- for (int itm = 0; itm < nodeSelection.count(); ++itm)
- {
- FPoint np;
- int clRe = nodeSelection.at(itm);
- if (m_doc->nodeEdit.isContourLine())
- np = currItem->ContourLine.point(clRe);
- else
- np = currItem->PoLine.point(clRe);
- m_doc->nodeEdit.setClre(clRe);
- np = np + FPoint(moveBy, 0);
- m_doc->nodeEdit.moveClipPoint(currItem, np);
- poly.append(np.toQPointF());
- }
- QTransform m = currItem->getTransform();
- poly = m.map(poly);
- QRectF oldR = poly.boundingRect().adjusted(-5, -5, 10, 10);
- QRectF newR(currItem->getBoundingRect());
- m_doc->regionsChanged()->update(newR.united(oldR));
- }
- m_doc->nodeEdit.setClre(storedClRe);
- }
- else
- {
- /* Don't use Grid or Guide Snapping when dragging Items or Groups with the keyboard */
- /* as the user might be trying to fine tune a position */
- bool sav1 = m_doc->SnapGuides;
- bool sav2 = m_doc->SnapGrid;
- bool sav3 = m_doc->SnapElement;
- m_doc->SnapGuides = false;
- m_doc->SnapGrid = false;
- m_doc->SnapElement = false;
- if (m_doc->m_Selection->count() > 1)
- m_view->startGroupTransaction(Um::Move, "", Um::IMove);
- m_doc->moveGroup(moveBy, 0);
- if (m_doc->m_Selection->count() > 1)
- m_view->endGroupTransaction();
- m_doc->SnapGuides = sav1;
- m_doc->SnapGrid = sav2;
- m_doc->SnapElement = sav3;
- }
- }
- else
- {
- //CB If in EditContour mode, allow contour line to be scaled with arrow keys too
- if (m_doc->nodeEdit.isContourLine())
- m_view->TransformPoly(11, 0, resizeBy/unitGetRatioFromIndex(m_doc->unitIndex()));
- else if (!currItem->sizeLocked())
- {
- if ((rotationFC > 0.0 && rotationFC < 45.0) || (rotationFC >= 315.0 && rotationFC <= 360.0))
- {
- m_doc->sizeItem(currItem->width() + resizeBy, currItem->height(), currItem);
- }
- else if (rotationFC >= 45.0 && rotationFC < 135.0)
- {
- m_doc->sizeItem(currItem->width(), currItem->height() + resizeBy, currItem);
- }
- else if (rotationFC >= 135.0 && rotationFC < 225.0)
- {
- m_doc->sizeItem(currItem->width() + resizeBy, currItem->height(), currItem);
- m_doc->moveItem(-resizeBy * cos(radRotation), resizeBy * sin(radRotation), currItem);
- if (moveImage)
- currItem->moveImageXYOffsetBy(resizeBy / currItem->imageXScale(), 0);
- }
- else if (rotationFC >= 225.0 && rotationFC < 315.0)
- {
- m_doc->sizeItem(currItem->width(), currItem->height() + resizeBy, currItem);
- m_doc->moveItem(-resizeBy * sin(radRotation), -resizeBy * cos(radRotation), currItem);
- if (moveImage)
- currItem->moveImageXYOffsetBy(0, resizeBy / currItem->imageYScale());
- }
- currItem->Sizing = false;
- }
- }
- currItem->update();
- mainWindow->slotDocCh();
- }
- break;
- case Qt::Key_Up:
- if (!currItem->locked())
- {
- if (!resizing)
- {
- if ((m_doc->appMode == modeEditClip) && (m_doc->nodeEdit.hasNodeSelected()))
- {
- int storedClRe = m_doc->nodeEdit.clre();
- const auto& nodeSelection = m_doc->nodeEdit.selNode();
- if ((nodeSelection.count() != 0) && (m_doc->nodeEdit.edPoints()))
- {
- QPolygonF poly;
- if ((currItem->imageFlippedV() && (!m_doc->nodeEdit.isContourLine())) && (currItem->isSymbol() || currItem->isGroup()))
- moveBy *= -1;
- for (int itm = 0; itm < nodeSelection.count(); ++itm)
- {
- FPoint np;
- int clRe = nodeSelection.at(itm);
- if (m_doc->nodeEdit.isContourLine())
- np = currItem->ContourLine.point(clRe);
- else
- np = currItem->PoLine.point(clRe);
- m_doc->nodeEdit.setClre(clRe);
- np = np - FPoint(0, moveBy);
- m_doc->nodeEdit.moveClipPoint(currItem, np);
- poly.append(np.toQPointF());
- }
- QTransform m = currItem->getTransform();
- poly = m.map(poly);
- QRectF oldR = poly.boundingRect().adjusted(-5, -5, 10, 10);
- QRectF newR(currItem->getBoundingRect());
- m_doc->regionsChanged()->update(newR.united(oldR));
- }
- m_doc->nodeEdit.setClre(storedClRe);
- }
- else
- {
- /* Don't use Grid or Guide Snapping when dragging Items or Groups with the keyboard */
- /* as the user might be trying to fine tune a position */
- bool sav1 = m_doc->SnapGuides;
- bool sav2 = m_doc->SnapGrid;
- bool sav3 = m_doc->SnapElement;
- m_doc->SnapGuides = false;
- m_doc->SnapGrid = false;
- m_doc->SnapElement = false;
- if (m_doc->m_Selection->count() > 1)
- m_view->startGroupTransaction(Um::Move, "", Um::IMove);
- m_doc->moveGroup(0, -moveBy);
- if (m_doc->m_Selection->count() > 1)
- m_view->endGroupTransaction();
- m_doc->SnapGuides = sav1;
- m_doc->SnapGrid = sav2;
- m_doc->SnapElement = sav3;
- }
- }
- else
- {
- //CB If in EditContour mode, allow contour line to be scaled with arrow keys too
- if (m_doc->nodeEdit.isContourLine())
- m_view->TransformPoly(12, 0, resizeBy/unitGetRatioFromIndex(m_doc->unitIndex()));
- else if (!currItem->sizeLocked())
- {
- if ((rotationFC > 0.0 && rotationFC < 45.0) || (rotationFC >= 315.0 && rotationFC <= 360.0))
- {
- m_doc->sizeItem(currItem->width(), currItem->height() + resizeBy, currItem);
- m_doc->moveItem(-resizeBy * sin(radRotation), -resizeBy * cos(radRotation), currItem);
- if (moveImage)
- currItem->moveImageXYOffsetBy(0, resizeBy / currItem->imageYScale());
- }
- else if (rotationFC >= 45.0 && rotationFC < 135.0)
- {
- m_doc->sizeItem(currItem->width() + resizeBy, currItem->height(), currItem);
- }
- else if (rotationFC >= 135.0 && rotationFC < 225.0)
- {
- m_doc->sizeItem(currItem->width(), currItem->height() + resizeBy, currItem);
- }
- else if (rotationFC >= 225.0 && rotationFC < 315.0)
- {
- m_doc->sizeItem(currItem->width() + resizeBy, currItem->height(), currItem);
- m_doc->moveItem(-resizeBy * cos(radRotation), resizeBy * sin(radRotation), currItem);
- if (moveImage)
- currItem->moveImageXYOffsetBy(resizeBy / currItem->imageXScale(), 0);
- }
- currItem->Sizing = false;
- }
- }
- currItem->update();
- mainWindow->slotDocCh();
- }
- break;
- case Qt::Key_Down:
- if (!currItem->locked())
- {
- if (!resizing)
- {
- if ((m_doc->appMode == modeEditClip) && (m_doc->nodeEdit.hasNodeSelected()))
- {
- int storedClRe = m_doc->nodeEdit.clre();
- const auto& nodeSelection = m_doc->nodeEdit.selNode();
- if ((nodeSelection.count() != 0) && (m_doc->nodeEdit.edPoints()))
- {
- QPolygonF poly;
- if ((currItem->imageFlippedV() && (!m_doc->nodeEdit.isContourLine())) && (currItem->isSymbol() || currItem->isGroup()))
- moveBy *= -1;
- for (int itm = 0; itm < nodeSelection.count(); ++itm)
- {
- FPoint np;
- int clRe = nodeSelection.at(itm);
- if (m_doc->nodeEdit.isContourLine())
- np = currItem->ContourLine.point(clRe);
- else
- np = currItem->PoLine.point(clRe);
- m_doc->nodeEdit.setClre(clRe);
- np = np - FPoint(0, -moveBy);
- m_doc->nodeEdit.moveClipPoint(currItem, np);
- poly.append(np.toQPointF());
- }
- QTransform m = currItem->getTransform();
- poly = m.map(poly);
- QRectF oldR = poly.boundingRect().adjusted(-5, -5, 10, 10);
- QRectF newR(currItem->getBoundingRect());
- m_doc->regionsChanged()->update(newR.united(oldR));
- }
- m_doc->nodeEdit.setClre(storedClRe);
- }
- else
- {
- /* Don't use Grid or Guide Snapping when dragging Items or Groups with the keyboard */
- /* as the user might be trying to fine tune a position */
- bool sav1 = m_doc->SnapGuides;
- bool sav2 = m_doc->SnapGrid;
- bool sav3 = m_doc->SnapElement;
- m_doc->SnapGuides = false;
- m_doc->SnapGrid = false;
- m_doc->SnapElement = false;
- if (m_doc->m_Selection->count() > 1)
- m_view->startGroupTransaction(Um::Move, "", Um::IMove);
- m_doc->moveGroup(0, moveBy);
- if (m_doc->m_Selection->count() > 1)
- m_view->endGroupTransaction();
- m_doc->SnapGuides = sav1;
- m_doc->SnapGrid = sav2;
- m_doc->SnapElement = sav3;
- }
- }
- else
- {
- //CB If in EditContour mode, allow contour line to be scaled with arrow keys too
- if (m_doc->nodeEdit.isContourLine())
- m_view->TransformPoly(13, 0, resizeBy/unitGetRatioFromIndex(m_doc->unitIndex()));
- else if (!currItem->sizeLocked())
- {
- if ((rotationFC > 0.0 && rotationFC < 45.0) || (rotationFC >= 315.0 && rotationFC <= 360.0))
- {
- m_doc->sizeItem(currItem->width(), currItem->height() + resizeBy, currItem);
- }
- else if (rotationFC >= 45.0 && rotationFC < 135.0)
- {
- m_doc->sizeItem(currItem->width() + resizeBy, currItem->height(), currItem);
- m_doc->moveItem(-resizeBy * cos(radRotation), resizeBy * sin(radRotation), currItem);
- if (moveImage)
- currItem->moveImageXYOffsetBy(resizeBy / currItem->imageXScale(), 0);
- }
- else if (rotationFC >= 135.0 && rotationFC < 225.0)
- {
- m_doc->sizeItem(currItem->width(), currItem->height() + resizeBy, currItem);
- m_doc->moveItem(-resizeBy * sin(radRotation), -resizeBy * cos(radRotation), currItem);
- if (moveImage)
- currItem->moveImageXYOffsetBy(0, resizeBy / currItem->imageYScale());
- }
- else if (rotationFC >= 225.0 && rotationFC < 315.0)
- {
- m_doc->sizeItem(currItem->width() + resizeBy, currItem->height(), currItem);
- }
- currItem->Sizing = false;
- }
- }
- currItem->update();
- mainWindow->slotDocCh();
- }
- break;
- default:
- break;
- }
- }
- }
- switch (kk)
- {
- case Qt::Key_Left:
- case Qt::Key_Right:
- case Qt::Key_Up:
- case Qt::Key_Down:
- m_arrowKeyDown = true;
- }
- m_keyRepeat = false;
-}
-
-void CanvasMode::commonkeyReleaseEvent(QKeyEvent *e)
-{
- //Exit out of panning mode if Control is release while the right mouse button is pressed
- if ((m_doc->appMode == modePanning) && (e->key() == Qt::Key_Control) && (QApplication::mouseButtons() & Qt::RightButton))
- m_view->requestMode(modeNormal);
- if (m_doc->appMode == modeMagnifier)
- m_view->setCursor(IconManager::instance().loadCursor("lupez.png"));
- if (e->isAutoRepeat() || !m_arrowKeyDown)
- return;
- switch(e->key())
- {
- case Qt::Key_Left:
- case Qt::Key_Right:
- case Qt::Key_Up:
- case Qt::Key_Down:
- m_arrowKeyDown = false;
- if ((!m_view->m_ScMW->zoomSpinBox->hasFocus()) && (!m_view->m_ScMW->pageSelector->hasFocus()))
- {
- int docSelectionCount=m_doc->m_Selection->count();
- if ((docSelectionCount != 0) && (m_doc->appMode == modeEditClip) && (m_doc->nodeEdit.hasNodeSelected()))
- {
- PageItem *currItem = m_doc->m_Selection->itemAt(0);
- double xposOrig = currItem->xPos();
- double yposOrig = currItem->yPos();
- m_doc->adjustItemSize(currItem, true);
- if (!m_doc->nodeEdit.isContourLine())
- currItem->ContourLine.translate(xposOrig - currItem->xPos(),yposOrig - currItem->yPos());
- currItem->update();
- m_doc->regionsChanged()->update(currItem->getVisualBoundingRect());
- }
- for (int i = 0; i < docSelectionCount; ++i)
- m_doc->m_Selection->itemAt(i)->checkChanges(true);
- if (docSelectionCount > 1 && m_view->groupTransactionStarted())
- m_view->endGroupTransaction();
- }
- break;
- }
-}
+/*
+ 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.h"
+
+#include "actionmanager.h"
+#include "appmodes.h"
+#include "canvas.h"
+#include "canvasgesture_pan.h"
+#include "canvasmode_copyproperties.h"
+#include "canvasmode_create.h"
+#include "canvasmode_drawbezier.h"
+#include "canvasmode_drawfreehand.h"
+#include "canvasmode_drawcalligraphic.h"
+#include "canvasmode_edit.h"
+#include "canvasmode_editarc.h"
+#include "canvasmode_editgradient.h"
+#include "canvasmode_editmeshgradient.h"
+#include "canvasmode_editmeshpatch.h"
+#include "canvasmode_editpolygon.h"
+#include "canvasmode_editspiral.h"
+#include "canvasmode_edittable.h"
+#include "canvasmode_editweldpoint.h"
+#include "canvasmode_eyedropper.h"
+#include "canvasmode_framelinks.h"
+#include "canvasmode_imageimport.h"
+#include "canvasmode_magnifier.h"
+#include "canvasmode_measurements.h"
+#include "canvasmode_nodeedit.h"
+#include "canvasmode_normal.h"
+#include "canvasmode_objimport.h"
+#include "canvasmode_panning.h"
+#include "canvasmode_rotate.h"
+#ifdef GESTURE_FRAME_PREVIEW
+#include "pageitempreview.h"
+#endif
+#include "pageitem_group.h"
+#include "pageitem_textframe.h"
+#include "prefsmanager.h"
+#include "selection.h"
+#include "sccolorengine.h"
+#include "scpainter.h"
+#include "scraction.h"
+#include "scribus.h"
+#include "scribusdoc.h"
+#include "scribusview.h"
+#include "ui/checkDocument.h"
+#include "ui/contextmenu.h"
+#include "ui/outlinepalette.h"
+#include "ui/pageselector.h"
+#include "ui/scrapbookpalette.h"
+#include "ui/scrspinbox.h"
+#include "ui/scresizecursor.h"
+#include "undomanager.h"
+#include "units.h"
+#include "iconmanager.h"
+#include "util_math.h"
+
+#include <QMdiArea>
+#include <QMdiSubWindow>
+#include <QPainter>
+#include <QPointF>
+
+CanvasMode::CanvasMode (ScribusView* view) :
+ m_view(view),
+ m_canvas(view->m_canvas),
+ m_doc(view->Doc),
+ m_panGesture(nullptr),
+ undoManager(UndoManager::instance()),
+ xSnap(0.0),
+ ySnap(0.0)
+{
+ m_pen["outline"] = QPen(Qt::gray, 1.0 , Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
+ m_pen["outline"].setCosmetic(true);
+ m_pen["selection"] = QPen(PrefsManager::instance().appPrefs.displayPrefs.frameColor, 1.0, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
+ m_pen["selection"].setCosmetic(true);
+ m_pen["selection-group"] = QPen(Qt::red, 1.0 , Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
+ m_pen["selection-group"].setCosmetic(true);
+ m_pen["selection-group-inside"] = QPen(PrefsManager::instance().appPrefs.displayPrefs.frameGroupColor, 1.0 , Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
+ m_pen["selection-group-inside"].setCosmetic(true);
+ m_pen["handle"] = QPen(PrefsManager::instance().appPrefs.displayPrefs.frameColor, 1.0, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
+ m_pen["handle"].setCosmetic(true);
+
+ m_brush["outline"] = Qt::NoBrush;
+ m_brush["selection"] = Qt::NoBrush;
+ m_brush["selection-group"] = QColor(255,0,0,10);
+ m_brush["selection-group-inside"] = Qt::NoBrush;
+ m_brush["handle"] = PrefsManager::instance().appPrefs.displayPrefs.frameColor;
+
+ m_keyRepeat = false;
+ m_arrowKeyDown = false;
+ //m_mousePointDoc = FPoint(0,0);
+}
+
+CanvasMode::~CanvasMode()
+{
+ delete m_panGesture;
+}
+
+CanvasMode* CanvasMode::createForAppMode(ScribusView* view, int appMode)
+{
+ CanvasMode* result;
+
+ switch (appMode)
+ {
+ case modeNormal:
+ case modeStoryEditor:
+ result = new CanvasMode_Normal(view);
+ break;
+ case modeCopyProperties:
+ result = new CanvasMode_CopyProperties(view);
+ break;
+ case modeEdit:
+ result = new CanvasMode_Edit(view);
+ break;
+ case modeEditClip:
+ result = new CanvasMode_NodeEdit(view);
+ break;
+ case modeEditGradientVectors:
+ result = new CanvasMode_EditGradient(view);
+ break;
+ case modeEditMeshGradient:
+ result = new CanvasMode_EditMeshGradient(view);
+ break;
+ case modeEditMeshPatch:
+ result = new CanvasMode_EditMeshPatch(view);
+ break;
+ case modeEditWeldPoint:
+ result = new CanvasMode_EditWeldPoint(view);
+ break;
+ case modeDrawBezierLine:
+ result = new BezierMode(view);
+ break;
+ case modeDrawFreehandLine:
+ result = new FreehandMode(view);
+ break;
+ case modeDrawCalligraphicLine:
+ result = new CalligraphicMode(view);
+ break;
+ case modeDrawLine:
+ case modeDrawShapes:
+ case modeDrawImage:
+ case modeDrawLatex:
+ case modeDrawText:
+ case modeDrawTable2:
+ case modeDrawRegularPolygon:
+ case modeDrawArc:
+ case modeDrawSpiral:
+ case modeInsertPDFButton:
+ case modeInsertPDFRadioButton:
+ case modeInsertPDFTextfield:
+ case modeInsertPDFCheckbox:
+ case modeInsertPDFCombobox:
+ case modeInsertPDFListbox:
+ case modeInsertPDFTextAnnotation:
+ case modeInsertPDFLinkAnnotation:
+ case modeInsertPDF3DAnnotation:
+ result = new CreateMode(view);
+ break;
+ case modeEyeDropper:
+ result = new CanvasMode_EyeDropper(view);
+ break;
+ case modeImportObject:
+ result = new CanvasMode_ObjImport(view);
+ break;
+ case modeLinkFrames:
+ case modeUnlinkFrames:
+ result = new CanvasMode_FrameLinks(view);
+ break;
+ case modeImportImage:
+ result = new CanvasMode_ImageImport(view);
+ break;
+ case modeMagnifier:
+ result = new CanvasMode_Magnifier(view);
+ break;
+ case modeMeasurementTool:
+ result = new MeasurementsMode(view);
+ break;
+ case modePanning:
+ result = new CanvasMode_Panning(view);
+ break;
+ case modeRotation:
+ result = new CanvasMode_Rotate(view);
+ break;
+ case modeEditArc:
+ result = new CanvasMode_EditArc(view);
+ break;
+ case modeEditPolygon:
+ result = new CanvasMode_EditPolygon(view);
+ break;
+ case modeEditSpiral:
+ result = new CanvasMode_EditSpiral(view);
+ break;
+ case modeEditTable:
+ result = new CanvasMode_EditTable(view);
+ break;
+ // more modes as they are defined...
+
+ default:
+ result = new CanvasMode_Normal(view);
+ break;
+ }
+ return result;
+}
+
+
+void CanvasMode::updateViewMode(CanvasViewMode* viewmode)
+{
+ viewmode->drawSelectedItemsWithControls = false;
+ viewmode->drawFramelinksWithContents = false;
+}
+
+void CanvasMode::drawSelectionHandles(QPainter *psx, QRectF selectionRect, bool background, bool insideGroup, double sx, double sy)
+{
+ m_pen["handle"] = QPen(PrefsManager::instance().appPrefs.displayPrefs.frameColor, 1.0, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
+ m_pen["handle"].setCosmetic(true);
+ m_pen["selection-group-inside"] = QPen(PrefsManager::instance().appPrefs.displayPrefs.frameGroupColor, 1.0 , Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
+ m_pen["selection-group-inside"].setCosmetic(true);
+ QPen ba = QPen(Qt::white, 3.0, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
+ ba.setCosmetic(true);
+ double markWidth = 4.0 / m_canvas->scale();
+ if (insideGroup)
+ markWidth /= qMax(sx, sy);
+ QRectF handleRect = QRectF(0, 0, markWidth, markWidth);
+ double x = selectionRect.x();
+ double y = selectionRect.y();
+ double w = selectionRect.width();
+ double h = selectionRect.height();
+ psx->setBrush(Qt::white);
+ if (background)
+ psx->setPen(ba);
+ else
+ {
+ if (insideGroup)
+ psx->setPen(m_pen["selection-group-inside"]);
+ else
+ psx->setPen(m_pen["handle"]);
+ }
+ handleRect.moveCenter(QPointF(x, y));
+ psx->drawRect(handleRect);
+ handleRect.moveCenter(QPointF(x+w/2.0, y));
+ psx->drawRect(handleRect);
+ handleRect.moveCenter(QPointF(x+w, y));
+ psx->drawRect(handleRect);
+ handleRect.moveCenter(QPointF(x+w, y+h/2.0));
+ psx->drawRect(handleRect);
+ handleRect.moveCenter(QPointF(x+w, y+h));
+ psx->drawRect(handleRect);
+ handleRect.moveCenter(QPointF(x+w/2.0, y+h));
+ psx->drawRect(handleRect);
+ handleRect.moveCenter(QPointF(x, y+h));
+ psx->drawRect(handleRect);
+ handleRect.moveCenter(QPointF(x, y+h/2.0));
+ psx->drawRect(handleRect);
+}
+
+void CanvasMode::drawSelection(QPainter* psx, bool drawHandles)
+{
+ m_pen["selection"] = QPen(PrefsManager::instance().appPrefs.displayPrefs.frameColor, 1.0, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
+ m_pen["selection"].setCosmetic(true);
+ m_pen["selection-group-inside"] = QPen(PrefsManager::instance().appPrefs.displayPrefs.frameGroupColor, 1.0 , Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
+ m_pen["selection-group-inside"].setCosmetic(true);
+ QPen ba = QPen(Qt::white, 3.0, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
+ ba.setCosmetic(true);
+ QPen bb = QPen(Qt::black, 1.0, Qt::DotLine, Qt::FlatCap, Qt::MiterJoin);
+ bb.setCosmetic(true);
+ psx->scale(m_canvas->scale(), m_canvas->scale());
+ psx->translate(-m_doc->minCanvasCoordinate.x(), -m_doc->minCanvasCoordinate.y());
+ psx->setClipping(true);
+ psx->setClipRegion(QRegion(m_canvas->exposedRect()));
+ if (m_doc->m_Selection->isMultipleSelection())
+ {
+ PageItem *curItem(nullptr);
+ for(int i = 0; i < m_doc->m_Selection->count(); ++i)
+ {
+ curItem = m_doc->m_Selection->itemAt(i);
+
+ if (drawHandles)
+ drawHandles = !curItem->locked();
+ }
+ // items inside a a multi
+ if (m_doc->m_Selection->count() > 1)
+ {
+ int docSelectionCount = m_doc->m_Selection->count();
+ PageItem *currItem;
+ for (int i = 0; i < docSelectionCount; ++i)
+ {
+ currItem = m_doc->m_Selection->itemAt(i);
+ if (!m_doc->Items->contains(currItem))
+ continue;
+ psx->save();
+ double lineAdjust(psx->pen().width() / m_canvas->scale());
+ double x, y, w, h;
+ w = currItem->visualWidth() ;
+ h = currItem->visualHeight() ;
+ if (currItem->rotation() != 0)
+ {
+ psx->setRenderHint(QPainter::Antialiasing);
+ psx->translate(currItem->xPos(), currItem->yPos());
+ psx->rotate(currItem->rotation());
+ x = currItem->asLine() ? 0 : (currItem->visualXPos() - currItem->xPos() - lineAdjust);
+ y = currItem->asLine() ? (h / -2.0) : (currItem->visualYPos() - currItem->yPos() - lineAdjust);
+ }
+ else
+ {
+ psx->translate(currItem->visualXPos(), currItem->visualYPos());
+ x = currItem->asLine() ? 0 : -lineAdjust;
+ y = currItem->asLine() ? 0 : -lineAdjust;
+ }
+ psx->setBrush(Qt::NoBrush);
+ psx->setPen(ba);
+ psx->drawRect(QRectF(x, y, w, h));
+ psx->setPen(m_pen["selection-group-inside"]);
+ psx->setBrush(m_brush["selection-group-inside"]);
+ psx->drawRect(QRectF(x, y, w, h));
+ psx->restore();
+ }
+ }
+ psx->save();
+ psx->setPen(m_pen["selection-group"]);
+ double lineAdjust(psx->pen().width() / m_canvas->scale());
+ double x, y, w, h;
+ m_doc->m_Selection->setGroupRect();
+ m_doc->m_Selection->getVisualGroupRect(&x, &y, &w, &h);
+
+ psx->translate(x,y);
+ x = -lineAdjust;
+ y = -lineAdjust;
+
+ psx->setBrush(Qt::NoBrush);
+ psx->setPen(ba);
+ psx->drawRect(QRectF(x, y, w, h));
+ if (drawHandles)
+ drawSelectionHandles(psx, QRectF(x, y, w, h), true);
+ psx->setPen(m_pen["selection-group"]);
+ psx->setBrush(m_brush["selection-group"]);
+ psx->drawRect(QRectF(x, y, w, h));
+ if (drawHandles)
+ drawSelectionHandles(psx, QRectF(x, y, w, h), false);
+ psx->restore();
+ }
+ else if (m_doc->m_Selection->count() != 0)
+ {
+ int docSelectionCount = m_doc->m_Selection->count();
+ PageItem *currItem;
+ for (int a = 0; a < docSelectionCount; ++a)
+ {
+ currItem = m_doc->m_Selection->itemAt(a);
+ psx->save();
+ psx->setPen(m_pen["selection"]);
+ psx->setBrush(m_brush["selection"]);
+ double lineAdjust(psx->pen().width() / m_canvas->scale());
+ double x, y, w, h;
+ if (currItem->isGroupChild())
+ {
+ QTransform t = currItem->getTransform();
+ double sx, sy;
+ getScaleFromMatrix(t, sx, sy);
+ psx->setTransform(t, true);
+ w = currItem->visualWidth();
+ h = currItem->visualHeight();
+ x = currItem->asLine() ? 0 : (-currItem->visualLineWidth() / 2.0);
+ y = -currItem->visualLineWidth() / 2.0;
+ psx->setBrush(Qt::NoBrush);
+ QRectF drRect = QRectF(x, y, w, h).normalized();
+ if (m_doc->drawAsPreview && !m_doc->editOnPreview)
+ {
+ if (!currItem->annotation().IsOpen())
+ {
+ psx->setPen(bb);
+ psx->setBrush(Qt::NoBrush);
+ psx->drawRect(drRect.adjusted(-1, -1, 1, 1));
+ }
+ }
+ else
+ {
+ psx->setPen(ba);
+ psx->drawRect(drRect);
+ if (drawHandles)
+ drawSelectionHandles(psx, QRectF(x, y, w, h), true, true, sx, sy);
+ psx->setPen(m_pen["selection-group-inside"]);
+ psx->setBrush(m_brush["selection-group-inside"]);
+ psx->drawRect(drRect);
+ if (drawHandles)
+ drawSelectionHandles(psx, QRectF(x, y, w, h), false, true, sx, sy);
+ }
+ }
+ else
+ {
+ w = currItem->visualWidth();
+ h = currItem->visualHeight();
+ if (currItem->rotation() != 0)
+ {
+ psx->setRenderHint(QPainter::Antialiasing);
+ psx->translate(currItem->xPos(), currItem->yPos());
+ psx->rotate(currItem->rotation());
+ x = currItem->asLine() ? 0 : (currItem->visualXPos() - currItem->xPos() - lineAdjust);
+ y = currItem->asLine() ? (h / -2.0) : (currItem->visualYPos() - currItem->yPos() - lineAdjust);
+ }
+ else
+ {
+ psx->translate(currItem->visualXPos(), currItem->visualYPos());
+ x = currItem->asLine() ? 0 : -lineAdjust;
+ y = currItem->asLine() ? 0 : -lineAdjust;
+ }
+ psx->setBrush(Qt::NoBrush);
+ if (m_doc->drawAsPreview && !m_doc->editOnPreview)
+ {
+ if (!currItem->annotation().IsOpen())
+ {
+ psx->setPen(bb);
+ psx->setBrush(Qt::NoBrush);
+ psx->drawRect(QRectF(x, y, w, h).adjusted(-1, -1, 1, 1));
+ }
+ }
+ else
+ {
+ psx->setPen(ba);
+ psx->drawRect(QRectF(x, y, w, h));
+ if (drawHandles && !currItem->locked() && !currItem->isLine())
+ drawSelectionHandles(psx, QRectF(x, y, w, h), true);
+ psx->setPen(m_pen["selection"]);
+ psx->setBrush(m_brush["selection"]);
+ psx->drawRect(QRectF(x, y, w, h));
+ }
+ if (drawHandles && !currItem->locked())
+ {
+ if (currItem->asLine())
+ {
+ const double markWidth = 4.0 / m_canvas->scale();
+ QRectF handleRect = QRectF(0, 0, markWidth, markWidth);
+ psx->setRenderHint(QPainter::Antialiasing);
+ psx->setBrush(Qt::white);
+ psx->setPen(m_pen["handle"]);
+ handleRect.moveCenter(QPointF(x, y+h/2.0));
+ psx->drawRect(handleRect);
+ handleRect.moveCenter(QPointF(x+w, y+h/2.0));
+ psx->drawRect(handleRect);
+ }
+ else
+ drawSelectionHandles(psx, QRectF(x, y, w, h), false);
+ }
+ if (currItem->isWelded())
+ {
+ psx->setPen(QPen(Qt::yellow, 8.0 / m_canvas->scale(), Qt::SolidLine, Qt::RoundCap, Qt::MiterJoin));
+ for (int i = 0 ; i < currItem->weldList.count(); i++)
+ {
+ PageItem::WeldingInfo wInf = currItem->weldList.at(i);
+ psx->drawPoint(QPointF(wInf.weldPoint.x(), wInf.weldPoint.y()));
+ }
+ }
+ }
+
+ psx->restore();
+ }
+
+ }
+}
+
+
+void CanvasMode::drawOutline(QPainter* p, double deltax, double deltay)
+{
+ p->save();
+ p->scale(m_canvas->scale(), m_canvas->scale());
+ p->translate(-m_doc->minCanvasCoordinate.x(), -m_doc->minCanvasCoordinate.y());
+
+ if (m_doc->m_Selection->count() == 1)
+ {
+ PageItem *currItem = m_doc->m_Selection->itemAt(0);
+
+// QRectF br(currItem->getVisualBoundingRect());
+#ifdef GESTURE_FRAME_PREVIEW
+ QImage *pixItem(0);
+ if (m_pixmapCache.contains(currItem))
+ {
+ if (m_pixmapCache.value(currItem)->isReady())
+ pixItem = m_pixmapCache.value(currItem)->getImage();
+ }
+ else
+ {
+ m_pixmapCache[currItem] = new PageItemPreview(currItem);
+ }
+
+ if (pixItem)
+ {
+ p->save();
+ p->translate(br.x(),br.y());
+ p->translate(deltax, deltay);
+ p->drawImage(br.toRect(), *pixItem, pixItem->rect());
+ p->restore();
+ }
+#endif // GESTURE_FRAME_PREVIEW
+ {
+ QTransform itemTrans = currItem->getTransform(deltax, deltay);
+ double visualWidth = currItem->visualWidth();
+ double visualHeight = currItem->visualHeight();
+ double visualLineWidth = currItem->visualLineWidth();
+ double matRot = getRotationDFromMatrix(itemTrans);
+
+ if (currItem->isGroup())
+ {
+ p->save();
+ p->setBrush(m_brush["outline"]);
+ p->setPen(m_pen["outline"]);
+ p->setWorldTransform(itemTrans, true);
+ if (matRot != 0)
+ p->setRenderHint(QPainter::Antialiasing);
+ p->drawRect(QRectF(0.0, 0.0, visualWidth, visualHeight));
+ p->setClipping(true);
+ p->setClipRect(QRectF(0.0, 0.0, visualWidth, visualHeight));
+ PageItem_Group* gItem = currItem->asGroupFrame();
+ int itemCountG = gItem->groupItemList.count();
+ if (itemCountG < m_canvas->moveWithFullOutlinesThreshold)
+ {
+ if (gItem->imageFlippedH())
+ {
+ p->translate(gItem->width(), 0);
+ p->scale(-1, 1);
+ }
+ if (gItem->imageFlippedV())
+ {
+ p->translate(0, gItem->height());
+ p->scale(1, -1);
+ }
+ p->scale(gItem->width() / gItem->groupWidth, gItem->height() / gItem->groupHeight);
+ for (int cg = 0; cg < itemCountG; cg++)
+ {
+ p->save();
+ currItem = gItem->groupItemList.at(cg);
+ p->translate(currItem->gXpos, currItem->gYpos);
+ if (currItem->rotation() != 0)
+ {
+ p->setRenderHint(QPainter::Antialiasing);
+ p->rotate(currItem->rotation());
+ }
+ p->drawPath(currItem->PoLine.toQPainterPath(false));
+ p->restore();
+ }
+ }
+ else
+ {
+ currItem->DrawPolyL(p, currItem->Clip);
+ }
+ p->restore();
+ }
+ else
+ {
+ p->save();
+ p->setBrush(m_brush["outline"]);
+ p->setPen(m_pen["outline"]);
+ p->setWorldTransform(itemTrans, true);
+ if (matRot != 0)
+ p->setRenderHint(QPainter::Antialiasing);
+ if (currItem->isLine())
+ p->drawRect(QRectF(0.0, -visualLineWidth / 2.0, currItem->visualWidth(), currItem->visualHeight()));
+ else
+ p->drawRect(QRectF(-visualLineWidth / 2.0, -visualLineWidth / 2.0, currItem->visualWidth(), currItem->visualHeight()));
+ p->restore();
+
+ p->save();
+ p->setBrush(m_brush["outline"]);
+ p->setPen(m_pen["outline"]);
+ p->setWorldTransform(itemTrans, true);
+ if (matRot != 0)
+ p->setRenderHint(QPainter::Antialiasing);
+ p->drawPath(currItem->PoLine.toQPainterPath(false));
+ p->restore();
+ }
+ }
+ }
+ else if (m_doc->m_Selection->count() > 1)
+ {
+ double x, y, w, h;
+ m_doc->m_Selection->setGroupRect();
+ m_doc->m_Selection->getGroupRect(&x, &y, &w, &h);
+ int docSelectionCount = m_doc->m_Selection->count();
+ if (docSelectionCount < m_canvas->moveWithBoxesOnlyThreshold)
+ {
+ PageItem *currItem;
+ for (int i = 0; i < docSelectionCount; ++i)
+ {
+ currItem = m_doc->m_Selection->itemAt(i);
+ if (!currItem->Parent && !m_doc->Items->contains(currItem))
+ continue;
+ if (currItem->Parent && !currItem->Parent->groupItemList.contains(currItem))
+ continue;
+
+ QTransform itemTrans = currItem->getTransform(deltax, deltay);
+ double visualWidth = currItem->visualWidth();
+ double visualHeight = currItem->visualHeight();
+ double visualLineWidth = currItem->visualLineWidth();
+ double matRot = getRotationDFromMatrix(itemTrans);
+
+ p->save();
+ if (docSelectionCount < m_canvas->moveWithFullOutlinesThreshold)
+ {
+// QRectF br(currItem->getVisualBoundingRect());
+#ifdef GESTURE_FRAME_PREVIEW
+ QImage *pixItem(0);
+ if (m_pixmapCache.contains(currItem))
+ {
+ if (m_pixmapCache.value(currItem)->isReady())
+ pixItem = m_pixmapCache.value(currItem)->getImage();
+ }
+ else
+ {
+ m_pixmapCache[currItem] = new PageItemPreview(currItem);
+ }
+
+
+ if (pixItem)
+ {
+ p->save();
+// p->translate(br.x() /*- x*/, br.y() /*- y*/);
+ p->drawImage(br.toRect(), *pixItem, pixItem->rect());
+ p->restore();
+ }
+#endif // GESTURE_FRAME_PREVIEW
+ {
+ p->save();
+ p->setBrush(m_brush["outline"]);
+ p->setPen(m_pen["outline"]);
+ p->setWorldTransform(itemTrans, true);
+ if (matRot != 0)
+ p->setRenderHint(QPainter::Antialiasing);
+ if (currItem->isLine())
+ p->drawRect(QRectF(0.0, -visualLineWidth / 2.0, visualWidth, visualHeight));
+ else
+ p->drawRect(QRectF(-visualLineWidth / 2.0, -visualLineWidth / 2.0, visualWidth, visualHeight));
+ p->restore();
+
+ p->save();
+ p->setBrush(m_brush["outline"]);
+ p->setPen(m_pen["outline"]);
+ p->setWorldTransform(itemTrans, true);
+ if (matRot != 0)
+ p->setRenderHint(QPainter::Antialiasing);
+ p->drawPath(currItem->PoLine.toQPainterPath(false));
+ p->restore();
+ }
+ }
+ else
+ {
+ p->setBrush(m_brush["outline"]);
+ p->setPen(m_pen["outline"]);
+ p->setWorldTransform(itemTrans, true);
+ if (matRot != 0)
+ p->setRenderHint(QPainter::Antialiasing);
+ if (currItem->isLine())
+ p->drawRect(QRectF(0.0, -visualLineWidth / 2.0, visualWidth, visualHeight));
+ else
+ p->drawRect(QRectF(-visualLineWidth / 2.0, -visualLineWidth / 2.0, visualWidth, visualHeight));
+ }
+ p->restore();
+ }
+ }
+ else
+ {
+ p->setBrush(m_brush["outline"]);
+ p->setPen(m_pen["outline"]);
+ p->translate(deltax, deltay);
+ p->translate(x, y);
+ p->drawRect(QRectF(0, 0, w, h));
+ }
+ }
+ p->restore();
+}
+
+QCursor CanvasMode::modeCursor()
+{
+ IconManager& im=IconManager::instance();
+ QCursor cursor;
+ switch (m_doc->appMode)
+ {
+ case modeDrawShapes:
+ case modeDrawArc:
+ case modeDrawSpiral:
+ cursor = im.loadCursor("drawframe.png");
+ break;
+ case modeDrawImage:
+ cursor = im.loadCursor("drawimageframe.png");
+ break;
+ case modeDrawLatex:
+ cursor = im.loadCursor("drawlatexframe.png");
+ break;
+ case modeDrawText:
+ cursor = im.loadCursor("drawtextframe.png");
+ break;
+ case modeDrawTable2:
+ cursor = im.loadCursor("drawtable.png");
+ break;
+ case modeDrawRegularPolygon:
+ cursor = im.loadCursor("drawpolyline.png");
+ break;
+ case modeDrawLine:
+ case modeDrawBezierLine:
+ cursor = QCursor(Qt::CrossCursor);
+ break;
+ case modeDrawFreehandLine:
+ cursor = im.loadCursor("DrawFreeLine.png", 0, 31);
+ break;
+ case modeDrawCalligraphicLine:
+ cursor = im.loadCursor("drawcalligraphy.png", 4, 4);
+ break;
+ case modeImportObject:
+ cursor = im.loadCursor("dragpix.png");
+ break;
+ case modeMagnifier:
+ if (m_view->Magnify)
+ cursor = im.loadCursor("lupez.png");
+ else
+ cursor = im.loadCursor("lupezm.png");
+ break;
+ case modePanning:
+ cursor = im.loadCursor("handc.png");
+ break;
+ case modeEyeDropper:
+ cursor = im.loadCursor("colorpickercursor.png", 0, 31);
+ break;
+ case modeLinkFrames:
+ cursor = im.loadCursor("LinkTextFrame.png", 0, 31);
+ break;
+ case modeMeasurementTool:
+ case modeEditGradientVectors:
+ case modeEditMeshGradient:
+ case modeEditMeshPatch:
+ case modeEditWeldPoint:
+ case modeInsertPDFButton:
+ case modeInsertPDFRadioButton:
+ case modeInsertPDFTextfield:
+ case modeInsertPDFCheckbox:
+ case modeInsertPDFCombobox:
+ case modeInsertPDFListbox:
+ case modeInsertPDFTextAnnotation:
+ case modeInsertPDFLinkAnnotation:
+ case modeInsertPDF3DAnnotation:
+ case modeEditArc:
+ case modeEditPolygon:
+ case modeEditSpiral:
+ cursor = QCursor(Qt::CrossCursor);
+ break;
+ default:
+ cursor = QCursor(Qt::ArrowCursor);
+ break;
+ }
+ return cursor;
+}
+
+void CanvasMode::setModeCursor()
+{
+ IconManager& im=IconManager::instance();
+ //NOTE: Merge with similar code in ScribusMainWindow::setAppMode()
+ switch (m_doc->appMode)
+ {
+ case modeDrawShapes:
+ case modeDrawArc:
+ case modeDrawSpiral:
+ m_view->setCursor(im.loadCursor("drawframe.png"));
+ break;
+ case modeDrawImage:
+ m_view->setCursor(im.loadCursor("drawimageframe.png"));
+ break;
+ case modeDrawLatex:
+ m_view->setCursor(im.loadCursor("drawlatexframe.png"));
+ break;
+ case modeDrawText:
+ m_view->setCursor(im.loadCursor("drawtextframe.png"));
+ break;
+ case modeDrawTable2:
+ m_view->setCursor(im.loadCursor("drawtable.png"));
+ break;
+ case modeDrawRegularPolygon:
+ m_view->setCursor(im.loadCursor("drawpolyline.png"));
+ break;
+ case modeDrawLine:
+ case modeDrawBezierLine:
+ m_view->setCursor(QCursor(Qt::CrossCursor));
+ break;
+ case modeDrawFreehandLine:
+ m_view->setCursor(im.loadCursor("DrawFreeLine.png", 0, 31));
+ break;
+ case modeDrawCalligraphicLine:
+ m_view->setCursor(im.loadCursor("drawcalligraphy.png", 4, 4));
+ break;
+ case modeImportObject:
+ m_view->setCursor(im.loadCursor("dragpix.png"));
+ break;
+ case modeMagnifier:
+ if (m_view->Magnify)
+ m_view->setCursor(im.loadCursor("lupez.png"));
+ else
+ m_view->setCursor(im.loadCursor("lupezm.png"));
+ break;
+ case modePanning:
+ m_view->setCursor(im.loadCursor("handc.png"));
+ break;
+ case modeEyeDropper:
+ m_view->setCursor(im.loadCursor("colorpickercursor.png", 0, 31));
+ break;
+ case modeLinkFrames:
+ m_view->setCursor(im.loadCursor("LinkTextFrame.png", 0, 31));
+ break;
+ case modeMeasurementTool:
+ case modeEditGradientVectors:
+ case modeEditMeshGradient:
+ case modeEditMeshPatch:
+ case modeEditWeldPoint:
+ case modeInsertPDFButton:
+ case modeInsertPDFRadioButton:
+ case modeInsertPDFTextfield:
+ case modeInsertPDFCheckbox:
+ case modeInsertPDFCombobox:
+ case modeInsertPDFListbox:
+ case modeInsertPDFTextAnnotation:
+ case modeInsertPDFLinkAnnotation:
+ case modeInsertPDF3DAnnotation:
+ case modeEditArc:
+ case modeEditPolygon:
+ case modeEditSpiral:
+ m_view->setCursor(QCursor(Qt::CrossCursor));
+ break;
+ default:
+ m_view->setCursor(QCursor(Qt::ArrowCursor));
+ break;
+ }
+}
+
+#ifdef GESTURE_FRAME_PREVIEW
+void CanvasMode::clearPixmapCache()
+{
+ if (m_pixmapCache.count())
+ {
+ foreach(PageItemPreview* ip, m_pixmapCache)
+ {
+ if (ip)
+ delete ip;
+ }
+ m_pixmapCache.clear();
+ }
+}
+#endif // GESTURE_FRAME_PREVIEW
+
+void CanvasMode::drawSnapLine(QPainter* p)
+{
+ if (!m_doc->SnapElement)
+ return;
+ if (xSnap == 0.0 && ySnap == 0.0)
+ return;
+ int page = m_doc->OnPage(m_view->m_mousePointDoc.x(), m_view->m_mousePointDoc.y());
+ if (page == -1)
+ return;
+ MarginStruct bleedValues;
+ ScPage* dragToPage=m_doc->Pages->at(page);
+ if (!dragToPage)
+ return;
+ m_doc->getBleeds(dragToPage, bleedValues);
+ double xOffset = dragToPage->xOffset() - bleedValues.left();
+ double yOffset = dragToPage->yOffset() - bleedValues.top();
+ QPoint pageOrigin = m_canvas->canvasToLocal(QPointF(xOffset, yOffset));
+ if (ySnap)
+ {
+ p->setPen(Qt::green);
+ QPoint pt = m_canvas->canvasToLocal(QPointF(xOffset, ySnap));
+ double w = (dragToPage->width() + bleedValues.left() + bleedValues.right()) * m_canvas->scale();
+ p->drawLine(pageOrigin.x(), pt.y(), pageOrigin.x() + w, pt.y());
+ ySnap = 0;
+ }
+ if (xSnap)
+ {
+ p->setPen(Qt::green);
+ QPoint pt = m_canvas->canvasToLocal(QPointF(xSnap, yOffset));
+ double h = (dragToPage->height() + bleedValues.bottom() + bleedValues.top()) * m_canvas->scale();
+ p->drawLine(pt.x(), pageOrigin.y(), pt.x(), pageOrigin.y() + h);
+ xSnap = 0;
+ }
+}
+
+void CanvasMode::setResizeCursor(int how, double rot)
+{
+ switch (how)
+ {
+ case 1:
+ case 2:
+ m_view->setCursor(ScResizeCursor(135 + rot));// Qt::SizeFDiagCursor
+ break;
+ case 3:
+ case 4:
+ m_view->setCursor(ScResizeCursor(45 + rot));// Qt::SizeBDiagCursor
+ break;
+ case 5:
+ case 8:
+ m_view->setCursor(ScResizeCursor(0 + rot));// Qt::SizeVerCursor
+ break;
+ case 6:
+ case 7:
+ m_view->setCursor(ScResizeCursor(90 + rot));// Qt::SizeHorCursor
+ break;
+ default:
+ m_view->setCursor(QCursor(Qt::SizeAllCursor));
+ break;
+ }
+}
+
+bool CanvasMode::commonMouseMove(QMouseEvent *m)
+{
+ //m_mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
+ if ((m_canvas->m_viewMode.m_MouseButtonPressed && (m->buttons() & Qt::RightButton) && (m->modifiers() & Qt::ControlModifier)) || ((!(m->modifiers() & Qt::ControlModifier)) && (m->buttons() & Qt::MidButton)))
+ {
+ if (!m_panGesture)
+ {
+ m_panGesture = new PanGesture(this);
+ }
+ m_view->startGesture(m_panGesture);
+ m_panGesture->mousePressEvent(m); // Not an error, this is used to register current canvas point
+ return true;
+ }
+ return false;
+}
+
+void CanvasMode::commonDrawControls(QPainter* p, bool drawHandles)
+{
+ if (m_canvas->m_viewMode.operItemMoving)
+ drawOutline(p);
+ else
+ drawSelection(p, drawHandles);
+}
+
+void CanvasMode::commonDrawTextCursor(QPainter* p, PageItem_TextFrame* textframe, const QPointF& offset)
+{
+ QLineF cursor;
+ QPen cPen (Qt::black, 0.9 , Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
+
+ // normalize Current Position
+ textframe->itemText.normalizeCursorPosition();
+ int textCursorPos (textframe->itemText.cursorPosition());
+ cursor = textframe->textLayout.positionToPoint(textCursorPos);
+
+ cPen.setColor(ScColorEngine::getRGBColor(m_doc->PageColors[textframe->itemText.charStyle(textCursorPos).fillColor()], m_doc));
+
+ p->save();
+ p->setTransform(textframe->getTransform(), true);
+ p->setPen(cPen);
+ p->setRenderHint(QPainter::Antialiasing, true);
+ p->drawLine(cursor.translated(offset));
+ p->restore();
+}
+
+void CanvasMode::commonkeyPressEvent_NormalNodeEdit(QKeyEvent *e)
+{
+ int kk = e->key();
+ Qt::KeyboardModifiers buttonModifiers = e->modifiers();
+// QString uc = e->text();
+ ScribusMainWindow* mainWindow = m_view->m_ScMW;
+ QList<QMdiSubWindow *> windows;
+
+ QMdiArea* mdiArea = mainWindow->mdiArea;
+ QMdiSubWindow* w = nullptr;
+ PrefsManager& prefsManager = PrefsManager::instance();
+ OutlinePalette* outlinePalette = mainWindow->outlinePalette;
+ CheckDocument* docCheckerPalette = mainWindow->docCheckerPalette;
+ QMap<QString, QPointer<ScrAction> >& scrActions(mainWindow->scrActions);
+
+ if (m_keyRepeat)
+ return;
+ m_keyRepeat = true;
+ int keyMod=0;
+ if (e->modifiers() & Qt::ShiftModifier)
+ keyMod |= Qt::SHIFT;
+ if (e->modifiers() & Qt::ControlModifier)
+ keyMod |= Qt::CTRL;
+ if (e->modifiers() & Qt::AltModifier)
+ keyMod |= Qt::ALT;
+ //User presses escape and we have a doc open, and we have an item selected
+ if (kk == Qt::Key_Escape)
+ {
+ m_keyRepeat = false;
+ PageItem *currItem;
+ if (m_doc->m_Selection->count() != 0)
+ {
+ currItem = m_doc->m_Selection->itemAt(0);
+ currItem->Sizing = false;
+ if (m_doc->SubMode != -1)
+ {
+ m_view->Deselect(false);
+ m_doc->Items->removeOne(currItem);
+ }
+ else
+ m_view->Deselect(false);
+ m_view->cancelGroupTransaction();
+ }
+ m_doc->DragP = false;
+ m_doc->leaveDrag = false;
+ m_view->stopAllDrags();
+ m_doc->SubMode = -1;
+ m_doc->ElemToLink = nullptr;
+ mainWindow->slotSelect();
+ if (m_doc->m_Selection->isEmpty())
+ mainWindow->HaveNewSel();
+ prefsManager.appPrefs.uiPrefs.stickyTools = false;
+ scrActions["stickyTools"]->setChecked(false);
+ return;
+ }
+ if (m_view->m_ScMW->actionManager->compareKeySeqToShortcut(kk, e->modifiers(), "toolsZoomIn"))
+ scrActions["toolsZoomIn"]->trigger();
+ if (m_view->m_ScMW->actionManager->compareKeySeqToShortcut(kk, e->modifiers(), "toolsZoomOut"))
+ scrActions["toolsZoomOut"]->trigger();
+ /**If we have a doc and we are not changing the page or zoom level in the status bar */
+ if ((!m_view->m_ScMW->zoomSpinBox->hasFocus()) && (!m_view->m_ScMW->pageSelector->hasFocus()))
+ {
+ //Show our context menu
+ if (m_view->m_ScMW->actionManager->compareKeySeqToShortcut(kk, e->modifiers(), "viewShowContextMenu"))
+ {
+ ContextMenu* cmen=nullptr;
+ m_view->setCursor(QCursor(Qt::ArrowCursor));
+ if (m_doc->m_Selection->isEmpty())
+ {
+ //CB We should be able to get this calculated by the canvas.... it is already in m_canvas->globalToCanvas(m->globalPos());
+ FPoint fp = m_canvas->globalToCanvas(QCursor::pos());
+ cmen = new ContextMenu(mainWindow, m_doc, fp.x(), fp.y());
+ }
+ else
+ cmen = new ContextMenu(*(m_doc->m_Selection), mainWindow, m_doc);
+ if (cmen)
+ {
+ mainWindow->setUndoMode(true);
+ cmen->exec(QCursor::pos());
+ mainWindow->setUndoMode(false);
+ }
+ delete cmen;
+ }
+
+
+ /**
+ * With no item selected we can:
+ * - With space, get into panning mode (modePanning)
+ * - With PageUp, scroll up
+ * - With PageDown, scroll down
+ * - With Tab, change active document windowActivated
+ */
+
+ if (m_doc->m_Selection->isEmpty())
+ {
+ int wheelVal = prefsManager.mouseWheelJump();
+ if ((buttonModifiers & Qt::ShiftModifier) && !(buttonModifiers & Qt::ControlModifier) && !(buttonModifiers & Qt::AltModifier))
+ wheelVal = qMax(qRound(wheelVal / 10.0), 1);
+ switch (kk)
+ {
+ case Qt::Key_Space:
+ m_keyRepeat = false;
+ if (m_doc->appMode == modePanning)
+ m_view->requestMode(modeNormal);
+ else
+ m_view->requestMode(modePanning);
+ return;
+ break;
+ case Qt::Key_Left:
+ m_view->scrollBy(-wheelVal, 0);
+ m_keyRepeat = false;
+ return;
+ break;
+ case Qt::Key_Right:
+ m_view->scrollBy(wheelVal, 0);
+ m_keyRepeat = false;
+ return;
+ break;
+ case Qt::Key_Up:
+ m_view->scrollBy(0, -wheelVal);
+ m_keyRepeat = false;
+ return;
+ break;
+ case Qt::Key_Down:
+ m_view->scrollBy(0, wheelVal);
+ m_keyRepeat = false;
+ return;
+ break;
+ case Qt::Key_Tab:
+ if (buttonModifiers == Qt::ControlModifier)
+ {
+ m_keyRepeat = false;
+ windows = mdiArea->subWindowList();
+ if (windows.count() > 1)
+ {
+ for (int i = 0; i < static_cast<int>(windows.count()); ++i)
+ {
+ if (mdiArea->activeSubWindow() == windows.at(i))
+ {
+ if (i == static_cast<int>(windows.count()-1))
+ w = windows.at(0);
+ else
+ w = windows.at(i+1);
+ break;
+ }
+ }
+ outlinePalette->buildReopenVals();
+ docCheckerPalette->clearErrorList();
+ if (w)
+ w->showNormal();
+ mainWindow->newActWin(w);
+ }
+ return;
+ }
+ break;
+ }
+ }
+ //Allow page up/down even when items are selected
+ switch (kk)
+ {
+ case Qt::Key_PageUp:
+ if (m_doc->masterPageMode() || m_doc->symbolEditMode())
+ m_view->scrollBy(0, -prefsManager.mouseWheelJump());
+ else
+ {
+ int pg = m_doc->currentPageNumber();
+ if ((buttonModifiers & Qt::ShiftModifier) && !(buttonModifiers & Qt::ControlModifier) && !(buttonModifiers & Qt::AltModifier))
+ pg--;
+ else
+ pg -= m_doc->pageSets()[m_doc->pagePositioning()].Columns;
+ if (pg > -1)
+ m_view->GotoPage(pg);
+ }
+ m_keyRepeat = false;
+ return;
+ break;
+ case Qt::Key_PageDown:
+ if (m_doc->masterPageMode() || m_doc->symbolEditMode())
+ m_view->scrollBy(0, prefsManager.mouseWheelJump());
+ else
+ {
+ int pg = m_doc->currentPageNumber();
+ if ((buttonModifiers & Qt::ShiftModifier) && !(buttonModifiers & Qt::ControlModifier) && !(buttonModifiers & Qt::AltModifier))
+ pg++;
+ else
+ pg += m_doc->pageSets()[m_doc->pagePositioning()].Columns;
+ if (pg < static_cast<int>(m_doc->Pages->count()))
+ m_view->GotoPage(pg);
+ }
+ m_keyRepeat = false;
+ return;
+ break;
+ }
+
+ /** Now if we have an item selected
+ * - In normal mode we can:
+ * -- Use backspace or delete to delete the item
+ * -- Use itemRaise action shortcut to raise an item (actionmanager.cpp connect, no code here)
+ * -- Use itemLower action shortcut to lower an item (actionmanager.cpp connect, no code here)
+ * -- Use the arrow keys to move an item or group around for !inches:
+ With no meta, by 1.0 unit
+ Ctrl, by 10.0 units
+ Shift by 0.1 units
+ Ctrl Shift 0.01 units
+ - For inches:
+ With no meta, by 1.0 pt
+ Ctrl, by 1.0 unit
+ Shift by 0.1 units
+ Ctrl Shift 0.01 units
+ * -- Use the arrow keys to resize an item:
+ Alt right arrow, move right side outwards (expand)
+ Alt left arrow, move left side outwards (expand)
+ Alt Shift right arrow, move left side inwards (shrink)
+ Alt Shift left arrow, move right side inwards (shrink)
+ * -- In edit mode of an image frame, use the arrow keys to resize the image:
+ (flows to pageitem_imageframe for control)
+ Alt right arrow, move right side of image outwards (expand)
+ Alt left arrow, move right side inwards (shrink)
+ Alt down arrow, move bottom side downwards (expand)
+ Alt up arrow, move top side inwards (shrink)
+ */
+ if (m_doc->m_Selection->count() != 0)
+ {
+ double moveBy=1.0;
+ if (m_doc->unitIndex()!=SC_INCHES)
+ {
+ if ((buttonModifiers & Qt::ShiftModifier) && !(buttonModifiers & Qt::ControlModifier) && !(buttonModifiers & Qt::AltModifier))
+ moveBy=0.1;
+ else if (!(buttonModifiers & Qt::ShiftModifier) && (buttonModifiers & Qt::ControlModifier) && !(buttonModifiers & Qt::AltModifier))
+ moveBy=10.0;
+ else if ((buttonModifiers & Qt::ShiftModifier) && (buttonModifiers & Qt::ControlModifier) && !(buttonModifiers & Qt::AltModifier))
+ moveBy=0.01;
+
+ moveBy/=m_doc->unitRatio();//Lets allow movement by the current doc ratio, not only points
+ }
+ else
+ {
+ if ((buttonModifiers & Qt::ShiftModifier) && !(buttonModifiers & Qt::ControlModifier) && !(buttonModifiers & Qt::AltModifier))
+ moveBy=0.1/m_doc->unitRatio();
+ else if (!(buttonModifiers & Qt::ShiftModifier) && (buttonModifiers & Qt::ControlModifier) && !(buttonModifiers & Qt::AltModifier))
+ moveBy=1.0/m_doc->unitRatio();
+ else if ((buttonModifiers & Qt::ShiftModifier) && (buttonModifiers & Qt::ControlModifier) && !(buttonModifiers & Qt::AltModifier))
+ moveBy=0.01/m_doc->unitRatio();
+ }
+ bool resizing=((buttonModifiers & Qt::AltModifier) && !(buttonModifiers & Qt::ControlModifier));
+ bool resizingsmaller=(resizing && (buttonModifiers & Qt::ShiftModifier));
+ double resizeBy=1.0;
+
+ //CB with control locked out due to the requirement of moveby of 0.01, we cannot support
+ //resizeby 10 units unless we move to supporting modifier keys that most people don't have.
+ //if (buttonModifiers & Qt::ControlModifier)
+ // resizeBy*=10.0;
+ resizeBy/=m_doc->unitRatio();
+ if (resizingsmaller)
+ resizeBy*=-1.0;
+
+ PageItem *currItem = m_doc->m_Selection->itemAt(0);
+
+ //#8860
+ //rotationFC is a temporary variable to manage items rotation:
+ //currently an item with e.g. 40° rotation is as 360° - 40° = 320°
+ double rotationFC = fabs(360.0 - currItem->rotation());
+ double radRotation = rotationFC * M_PI / 180.0;
+
+ bool moveImage = false;
+ if ((currItem->asImageFrame() || currItem->asLatexFrame() || currItem->asOSGFrame()) && currItem->imageIsAvailable && !currItem->fitImageToFrame())
+ moveImage = true;
+
+ switch (kk)
+ {
+ case Qt::Key_Backspace:
+ case Qt::Key_Delete:
+ if (buttonModifiers==Qt::NoModifier)
+ m_doc->itemSelection_DeleteItem();
+ else
+ {
+ if (m_view->m_ScMW->actionManager->compareKeySeqToShortcut(kk, buttonModifiers, "editClearContents"))
+ scrActions["editClearContents"]->trigger();
+ if (m_view->m_ScMW->actionManager->compareKeySeqToShortcut(kk, buttonModifiers, "editTruncateContents"))
+ scrActions["editTruncateContents"]->trigger();
+ }
+ break;
+ case Qt::Key_Left:
+ if (!currItem->locked())
+ {
+ if (!resizing)
+ {
+ if ((m_doc->appMode == modeEditClip) && (m_doc->nodeEdit.hasNodeSelected()))
+ {
+ int storedClRe = m_doc->nodeEdit.clre();
+ const auto& nodeSelection = m_doc->nodeEdit.selNode();
+ if ((nodeSelection.count() != 0) && (m_doc->nodeEdit.edPoints()))
+ {
+ QPolygonF poly;
+ m_doc->nodeEdit.beginTransaction(currItem);
+ if ((currItem->imageFlippedH() && (!m_doc->nodeEdit.isContourLine())) && (currItem->isSymbol() || currItem->isGroup()))
+ moveBy *= -1;
+ undoManager->setUndoEnabled(false); // Record only core points action
+ for (int itm = 0; itm < nodeSelection.count(); ++itm)
+ {
+ FPoint np;
+ int clRe = nodeSelection.at(itm);
+ if (m_doc->nodeEdit.isContourLine())
+ np = currItem->ContourLine.point(clRe);
+ else
+ np = currItem->PoLine.point(clRe);
+ m_doc->nodeEdit.setClre(clRe);
+ np = np - FPoint(moveBy, 0);
+ m_doc->nodeEdit.moveClipPoint(currItem, np);
+ poly.append(np.toQPointF());
+ }
+ undoManager->setUndoEnabled(true); // Record only core points action
+ QTransform m = currItem->getTransform();
+ poly = m.map(poly);
+ QRectF oldR = poly.boundingRect().adjusted(-5, -5, 10, 10);
+ QRectF newR(currItem->getBoundingRect());
+ m_doc->regionsChanged()->update(newR.united(oldR));
+ }
+ m_doc->nodeEdit.setClre(storedClRe);
+ }
+ else
+ {
+ /* Don't use Grid or Guide Snapping when dragging Items or Groups with the keyboard */
+ /* as the user might be trying to fine tune a position */
+ bool sav1 = m_doc->SnapGuides;
+ bool sav3 = m_doc->SnapElement;
+ bool sav2 = m_doc->SnapGrid;
+ m_doc->SnapGuides = false;
+ m_doc->SnapGrid = false;
+ m_doc->SnapElement = false;
+ if (m_doc->m_Selection->count() > 1)
+ m_view->startGroupTransaction(Um::Move, "", Um::IMove);
+ m_doc->moveGroup(-moveBy, 0);
+ if (m_doc->m_Selection->count() > 1)
+ m_view->endGroupTransaction();
+ m_doc->SnapElement = sav3;
+ m_doc->SnapGuides = sav1;
+ m_doc->SnapGrid = sav2;
+ }
+ }
+ else
+ {
+ //CB If in EditContour mode, allow contour line to be scaled with arrow keys too
+ if (m_doc->nodeEdit.isContourLine())
+ m_view->TransformPoly(10, 0, resizeBy/unitGetRatioFromIndex(m_doc->unitIndex()));
+ else if (!currItem->sizeLocked())
+ {
+ if ((rotationFC > 0.0 && rotationFC < 45.0) || (rotationFC >= 315.0 && rotationFC <= 360.0))
+ {
+ m_doc->sizeItem(currItem->width() + resizeBy, currItem->height(), currItem);
+ m_doc->moveItem(-resizeBy * cos(radRotation), resizeBy * sin(radRotation), currItem);
+ if (moveImage)
+ currItem->moveImageXYOffsetBy(resizeBy / currItem->imageXScale(), 0);
+ }
+ else if (rotationFC >= 45.0 && rotationFC < 135.0)
+ {
+ m_doc->sizeItem(currItem->width(), currItem->height() + resizeBy, currItem);
+ m_doc->moveItem(-resizeBy * sin(radRotation), -resizeBy * cos(radRotation), currItem);
+ if (moveImage)
+ currItem->moveImageXYOffsetBy(0, resizeBy / currItem->imageYScale());
+ }
+ else if (rotationFC >= 135.0 && rotationFC < 225.0)
+ {
+ m_doc->sizeItem(currItem->width() + resizeBy, currItem->height(), currItem);
+ }
+ else if (rotationFC >= 225.0 && rotationFC < 315.0)
+ {
+ m_doc->sizeItem(currItem->width(), currItem->height() + resizeBy, currItem);
+ }
+ currItem->Sizing = false;
+ }
+ }
+ currItem->update();
+ mainWindow->slotDocCh();
+ }
+ break;
+ case Qt::Key_Right:
+ if (!currItem->locked())
+ {
+ if (!resizing)
+ {
+ if ((m_doc->appMode == modeEditClip) && (m_doc->nodeEdit.hasNodeSelected()))
+ {
+ int storedClRe = m_doc->nodeEdit.clre();
+ const auto& nodeSelection = m_doc->nodeEdit.selNode();
+ if ((nodeSelection.count() != 0) && (m_doc->nodeEdit.edPoints()))
+ {
+ QPolygonF poly;
+ m_doc->nodeEdit.beginTransaction(currItem);
+ if ((currItem->imageFlippedH() && (!m_doc->nodeEdit.isContourLine())) && (currItem->isSymbol() || currItem->isGroup()))
+ moveBy *= -1;
+ undoManager->setUndoEnabled(false); // Record only core points action
+ for (int itm = 0; itm < nodeSelection.count(); ++itm)
+ {
+ FPoint np;
+ int clRe = nodeSelection.at(itm);
+ if (m_doc->nodeEdit.isContourLine())
+ np = currItem->ContourLine.point(clRe);
+ else
+ np = currItem->PoLine.point(clRe);
+ m_doc->nodeEdit.setClre(clRe);
+ np = np + FPoint(moveBy, 0);
+ m_doc->nodeEdit.moveClipPoint(currItem, np);
+ poly.append(np.toQPointF());
+ }
+ undoManager->setUndoEnabled(true); // Record only core points action
+ QTransform m = currItem->getTransform();
+ poly = m.map(poly);
+ QRectF oldR = poly.boundingRect().adjusted(-5, -5, 10, 10);
+ QRectF newR(currItem->getBoundingRect());
+ m_doc->regionsChanged()->update(newR.united(oldR));
+ }
+ m_doc->nodeEdit.setClre(storedClRe);
+ }
+ else
+ {
+ /* Don't use Grid or Guide Snapping when dragging Items or Groups with the keyboard */
+ /* as the user might be trying to fine tune a position */
+ bool sav1 = m_doc->SnapGuides;
+ bool sav2 = m_doc->SnapGrid;
+ bool sav3 = m_doc->SnapElement;
+ m_doc->SnapGuides = false;
+ m_doc->SnapGrid = false;
+ m_doc->SnapElement = false;
+ if (m_doc->m_Selection->count() > 1)
+ m_view->startGroupTransaction(Um::Move, "", Um::IMove);
+ m_doc->moveGroup(moveBy, 0);
+ if (m_doc->m_Selection->count() > 1)
+ m_view->endGroupTransaction();
+ m_doc->SnapGuides = sav1;
+ m_doc->SnapGrid = sav2;
+ m_doc->SnapElement = sav3;
+ }
+ }
+ else
+ {
+ //CB If in EditContour mode, allow contour line to be scaled with arrow keys too
+ if (m_doc->nodeEdit.isContourLine())
+ m_view->TransformPoly(11, 0, resizeBy/unitGetRatioFromIndex(m_doc->unitIndex()));
+ else if (!currItem->sizeLocked())
+ {
+ if ((rotationFC > 0.0 && rotationFC < 45.0) || (rotationFC >= 315.0 && rotationFC <= 360.0))
+ {
+ m_doc->sizeItem(currItem->width() + resizeBy, currItem->height(), currItem);
+ }
+ else if (rotationFC >= 45.0 && rotationFC < 135.0)
+ {
+ m_doc->sizeItem(currItem->width(), currItem->height() + resizeBy, currItem);
+ }
+ else if (rotationFC >= 135.0 && rotationFC < 225.0)
+ {
+ m_doc->sizeItem(currItem->width() + resizeBy, currItem->height(), currItem);
+ m_doc->moveItem(-resizeBy * cos(radRotation), resizeBy * sin(radRotation), currItem);
+ if (moveImage)
+ currItem->moveImageXYOffsetBy(resizeBy / currItem->imageXScale(), 0);
+ }
+ else if (rotationFC >= 225.0 && rotationFC < 315.0)
+ {
+ m_doc->sizeItem(currItem->width(), currItem->height() + resizeBy, currItem);
+ m_doc->moveItem(-resizeBy * sin(radRotation), -resizeBy * cos(radRotation), currItem);
+ if (moveImage)
+ currItem->moveImageXYOffsetBy(0, resizeBy / currItem->imageYScale());
+ }
+ currItem->Sizing = false;
+ }
+ }
+ currItem->update();
+ mainWindow->slotDocCh();
+ }
+ break;
+ case Qt::Key_Up:
+ if (!currItem->locked())
+ {
+ if (!resizing)
+ {
+ if ((m_doc->appMode == modeEditClip) && (m_doc->nodeEdit.hasNodeSelected()))
+ {
+ int storedClRe = m_doc->nodeEdit.clre();
+ const auto& nodeSelection = m_doc->nodeEdit.selNode();
+ if ((nodeSelection.count() != 0) && (m_doc->nodeEdit.edPoints()))
+ {
+ QPolygonF poly;
+ m_doc->nodeEdit.beginTransaction(currItem);
+ if ((currItem->imageFlippedV() && (!m_doc->nodeEdit.isContourLine())) && (currItem->isSymbol() || currItem->isGroup()))
+ moveBy *= -1;
+ undoManager->setUndoEnabled(false); // Record only core points action
+ for (int itm = 0; itm < nodeSelection.count(); ++itm)
+ {
+ FPoint np;
+ int clRe = nodeSelection.at(itm);
+ if (m_doc->nodeEdit.isContourLine())
+ np = currItem->ContourLine.point(clRe);
+ else
+ np = currItem->PoLine.point(clRe);
+ m_doc->nodeEdit.setClre(clRe);
+ np = np - FPoint(0, moveBy);
+ m_doc->nodeEdit.moveClipPoint(currItem, np);
+ poly.append(np.toQPointF());
+ }
+ undoManager->setUndoEnabled(true); // Record only core points action
+ QTransform m = currItem->getTransform();
+ poly = m.map(poly);
+ QRectF oldR = poly.boundingRect().adjusted(-5, -5, 10, 10);
+ QRectF newR(currItem->getBoundingRect());
+ m_doc->regionsChanged()->update(newR.united(oldR));
+ }
+ m_doc->nodeEdit.setClre(storedClRe);
+ }
+ else
+ {
+ /* Don't use Grid or Guide Snapping when dragging Items or Groups with the keyboard */
+ /* as the user might be trying to fine tune a position */
+ bool sav1 = m_doc->SnapGuides;
+ bool sav2 = m_doc->SnapGrid;
+ bool sav3 = m_doc->SnapElement;
+ m_doc->SnapGuides = false;
+ m_doc->SnapGrid = false;
+ m_doc->SnapElement = false;
+ if (m_doc->m_Selection->count() > 1)
+ m_view->startGroupTransaction(Um::Move, "", Um::IMove);
+ m_doc->moveGroup(0, -moveBy);
+ if (m_doc->m_Selection->count() > 1)
+ m_view->endGroupTransaction();
+ m_doc->SnapGuides = sav1;
+ m_doc->SnapGrid = sav2;
+ m_doc->SnapElement = sav3;
+ }
+ }
+ else
+ {
+ //CB If in EditContour mode, allow contour line to be scaled with arrow keys too
+ if (m_doc->nodeEdit.isContourLine())
+ m_view->TransformPoly(12, 0, resizeBy/unitGetRatioFromIndex(m_doc->unitIndex()));
+ else if (!currItem->sizeLocked())
+ {
+ if ((rotationFC > 0.0 && rotationFC < 45.0) || (rotationFC >= 315.0 && rotationFC <= 360.0))
+ {
+ m_doc->sizeItem(currItem->width(), currItem->height() + resizeBy, currItem);
+ m_doc->moveItem(-resizeBy * sin(radRotation), -resizeBy * cos(radRotation), currItem);
+ if (moveImage)
+ currItem->moveImageXYOffsetBy(0, resizeBy / currItem->imageYScale());
+ }
+ else if (rotationFC >= 45.0 && rotationFC < 135.0)
+ {
+ m_doc->sizeItem(currItem->width() + resizeBy, currItem->height(), currItem);
+ }
+ else if (rotationFC >= 135.0 && rotationFC < 225.0)
+ {
+ m_doc->sizeItem(currItem->width(), currItem->height() + resizeBy, currItem);
+ }
+ else if (rotationFC >= 225.0 && rotationFC < 315.0)
+ {
+ m_doc->sizeItem(currItem->width() + resizeBy, currItem->height(), currItem);
+ m_doc->moveItem(-resizeBy * cos(radRotation), resizeBy * sin(radRotation), currItem);
+ if (moveImage)
+ currItem->moveImageXYOffsetBy(resizeBy / currItem->imageXScale(), 0);
+ }
+ currItem->Sizing = false;
+ }
+ }
+ currItem->update();
+ mainWindow->slotDocCh();
+ }
+ break;
+ case Qt::Key_Down:
+ if (!currItem->locked())
+ {
+ if (!resizing)
+ {
+ if ((m_doc->appMode == modeEditClip) && (m_doc->nodeEdit.hasNodeSelected()))
+ {
+ int storedClRe = m_doc->nodeEdit.clre();
+ const auto& nodeSelection = m_doc->nodeEdit.selNode();
+ if ((nodeSelection.count() != 0) && (m_doc->nodeEdit.edPoints()))
+ {
+ QPolygonF poly;
+ m_doc->nodeEdit.beginTransaction(currItem);
+ if ((currItem->imageFlippedV() && (!m_doc->nodeEdit.isContourLine())) && (currItem->isSymbol() || currItem->isGroup()))
+ moveBy *= -1;
+ undoManager->setUndoEnabled(false); // Record only core points action
+ for (int itm = 0; itm < nodeSelection.count(); ++itm)
+ {
+ FPoint np;
+ int clRe = nodeSelection.at(itm);
+ if (m_doc->nodeEdit.isContourLine())
+ np = currItem->ContourLine.point(clRe);
+ else
+ np = currItem->PoLine.point(clRe);
+ m_doc->nodeEdit.setClre(clRe);
+ np = np - FPoint(0, -moveBy);
+ m_doc->nodeEdit.moveClipPoint(currItem, np);
+ poly.append(np.toQPointF());
+ }
+ undoManager->setUndoEnabled(true); // Record only core points action
+ QTransform m = currItem->getTransform();
+ poly = m.map(poly);
+ QRectF oldR = poly.boundingRect().adjusted(-5, -5, 10, 10);
+ QRectF newR(currItem->getBoundingRect());
+ m_doc->regionsChanged()->update(newR.united(oldR));
+ }
+ m_doc->nodeEdit.setClre(storedClRe);
+ }
+ else
+ {
+ /* Don't use Grid or Guide Snapping when dragging Items or Groups with the keyboard */
+ /* as the user might be trying to fine tune a position */
+ bool sav1 = m_doc->SnapGuides;
+ bool sav2 = m_doc->SnapGrid;
+ bool sav3 = m_doc->SnapElement;
+ m_doc->SnapGuides = false;
+ m_doc->SnapGrid = false;
+ m_doc->SnapElement = false;
+ if (m_doc->m_Selection->count() > 1)
+ m_view->startGroupTransaction(Um::Move, "", Um::IMove);
+ m_doc->moveGroup(0, moveBy);
+ if (m_doc->m_Selection->count() > 1)
+ m_view->endGroupTransaction();
+ m_doc->SnapGuides = sav1;
+ m_doc->SnapGrid = sav2;
+ m_doc->SnapElement = sav3;
+ }
+ }
+ else
+ {
+ //CB If in EditContour mode, allow contour line to be scaled with arrow keys too
+ if (m_doc->nodeEdit.isContourLine())
+ m_view->TransformPoly(13, 0, resizeBy/unitGetRatioFromIndex(m_doc->unitIndex()));
+ else if (!currItem->sizeLocked())
+ {
+ if ((rotationFC > 0.0 && rotationFC < 45.0) || (rotationFC >= 315.0 && rotationFC <= 360.0))
+ {
+ m_doc->sizeItem(currItem->width(), currItem->height() + resizeBy, currItem);
+ }
+ else if (rotationFC >= 45.0 && rotationFC < 135.0)
+ {
+ m_doc->sizeItem(currItem->width() + resizeBy, currItem->height(), currItem);
+ m_doc->moveItem(-resizeBy * cos(radRotation), resizeBy * sin(radRotation), currItem);
+ if (moveImage)
+ currItem->moveImageXYOffsetBy(resizeBy / currItem->imageXScale(), 0);
+ }
+ else if (rotationFC >= 135.0 && rotationFC < 225.0)
+ {
+ m_doc->sizeItem(currItem->width(), currItem->height() + resizeBy, currItem);
+ m_doc->moveItem(-resizeBy * sin(radRotation), -resizeBy * cos(radRotation), currItem);
+ if (moveImage)
+ currItem->moveImageXYOffsetBy(0, resizeBy / currItem->imageYScale());
+ }
+ else if (rotationFC >= 225.0 && rotationFC < 315.0)
+ {
+ m_doc->sizeItem(currItem->width() + resizeBy, currItem->height(), currItem);
+ }
+ currItem->Sizing = false;
+ }
+ }
+ currItem->update();
+ mainWindow->slotDocCh();
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ switch (kk)
+ {
+ case Qt::Key_Left:
+ case Qt::Key_Right:
+ case Qt::Key_Up:
+ case Qt::Key_Down:
+ m_arrowKeyDown = true;
+ }
+ m_keyRepeat = false;
+}
+
+void CanvasMode::commonkeyReleaseEvent(QKeyEvent *e)
+{
+ //Exit out of panning mode if Control is release while the right mouse button is pressed
+ if ((m_doc->appMode == modePanning) && (e->key() == Qt::Key_Control) && (QApplication::mouseButtons() & Qt::RightButton))
+ m_view->requestMode(modeNormal);
+ if (m_doc->appMode == modeMagnifier)
+ m_view->setCursor(IconManager::instance().loadCursor("lupez.png"));
+ if (e->isAutoRepeat() || !m_arrowKeyDown)
+ return;
+ switch(e->key())
+ {
+ case Qt::Key_Left:
+ case Qt::Key_Right:
+ case Qt::Key_Up:
+ case Qt::Key_Down:
+ m_arrowKeyDown = false;
+ if ((!m_view->m_ScMW->zoomSpinBox->hasFocus()) && (!m_view->m_ScMW->pageSelector->hasFocus()))
+ {
+ int docSelectionCount = m_doc->m_Selection->count();
+ if ((docSelectionCount != 0) && (m_doc->appMode == modeEditClip) && (m_doc->nodeEdit.hasNodeSelected()))
+ {
+ PageItem *currItem = m_doc->m_Selection->itemAt(0);
+ double xposOrig = currItem->xPos();
+ double yposOrig = currItem->yPos();
+ m_doc->adjustItemSize(currItem, true);
+ if (!m_doc->nodeEdit.isContourLine())
+ currItem->ContourLine.translate(xposOrig - currItem->xPos(),yposOrig - currItem->yPos());
+ m_doc->nodeEdit.finishTransaction(currItem);
+ currItem->update();
+ m_doc->regionsChanged()->update(currItem->getVisualBoundingRect());
+ }
+ for (int i = 0; i < docSelectionCount; ++i)
+ m_doc->m_Selection->itemAt(i)->checkChanges(true);
+ if (docSelectionCount > 1 && m_view->groupTransactionStarted())
+ m_view->endGroupTransaction();
+ }
+ break;
+ }
+}
Modified: trunk/Scribus/scribus/canvasmode_nodeedit.cpp
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=23353&path=/trunk/Scribus/scribus/canvasmode_nodeedit.cpp
==============================================================================
--- trunk/Scribus/scribus/canvasmode_nodeedit.cpp (original)
+++ trunk/Scribus/scribus/canvasmode_nodeedit.cpp Tue Nov 12 11:03:24 2019
@@ -508,11 +508,13 @@
void CanvasMode_NodeEdit::handleNodeEditPress(QMouseEvent* m, QRect)
{
FPoint npf2;
+ bool edited = false;
+ bool pfound = false;
PageItem* currItem = m_doc->m_Selection->itemAt(0);
FPointArray Clip = m_doc->nodeEdit.beginTransaction(currItem);
- bool edited = false;
- bool pfound = false;
+ m_doc->nodeEdit.deselect();
+
QTransform pm2 = currItem->getTransform();
npf2 = m_canvas->globalToCanvas(m->globalPos()).transformPoint(pm2, true);
if ((currItem->isSymbol() || currItem->isGroup()) && (!m_doc->nodeEdit.isContourLine()))
@@ -1132,7 +1134,8 @@
}
//Control Modifier to have parallele shape
- if (m->modifiers() == Qt::ControlModifier){
+ if (m->modifiers() == Qt::ControlModifier)
+ {
FPointArray cli;
if (m_doc->nodeEdit.isContourLine())
cli = currItem->ContourLine;
Modified: trunk/Scribus/scribus/nodeeditcontext.cpp
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=23353&path=/trunk/Scribus/scribus/nodeeditcontext.cpp
==============================================================================
--- trunk/Scribus/scribus/nodeeditcontext.cpp (original)
+++ trunk/Scribus/scribus/nodeeditcontext.cpp Tue Nov 12 11:03:24 2019
@@ -75,13 +75,11 @@
if (Doc->nodeEdit.m_isContourLine)
{
Clip = currItem->ContourLine;
- // m_isContourLine = true;
uAction = Um::EditContour;
}
else
{
Clip = currItem->PoLine;
- // m_isContourLine = false;
uAction = Um::EditShape;
}
@@ -96,7 +94,6 @@
m_oldItemY = currItem->yPos();
if (UndoManager::undoEnabled())
nodeTransaction = undoManager->beginTransaction(currItem->getUName(), currItem->getUPixmap(), uAction);
- Doc->nodeEdit.deselect();
return Clip;
}
More information about the scribus-commit
mailing list