24#include "pointerevent.h"
26#include "toolmanager.h"
27#include "viewmanager.h"
28#include "strokemanager.h"
29#include "selectionmanager.h"
30#include "overlaymanager.h"
31#include "scribblearea.h"
32#include "layervector.h"
33#include "layermanager.h"
34#include "layercamera.h"
36#include "vectorimage.h"
42ToolType MoveTool::type()
47void MoveTool::loadSettings()
49 properties.width = -1;
50 properties.feather = -1;
51 properties.useFeather =
false;
52 properties.stabilizerLevel = -1;
53 properties.useAA = -1;
54 mRotationIncrement = mEditor->preference()->getInt(SETTING::ROTATION_INCREMENT);
56 properties.showSelectionInfo = settings.value(
"ShowSelectionInfo").toBool();
57 mPropertyEnabled[SHOWSELECTIONINFO] =
true;
59 connect(mEditor->preference(), &PreferenceManager::optionChanged,
this, &MoveTool::updateSettings);
64 MoveMode mode = MoveMode::NONE;
66 if (selectMan->somethingSelected())
68 mode = mEditor->select()->getMoveMode();
70 else if (mEditor->overlays()->anyOverlayEnabled())
72 LayerCamera* layerCam = mEditor->layers()->getCameraLayerBelow(mEditor->currentLayerIndex());
74 mode = mEditor->overlays()->getMoveModeForPoint(getCurrentPoint(), layerCam->getViewAtFrame(mEditor->currentFrame()));
81void MoveTool::updateSettings(
const SETTING setting)
85 case SETTING::ROTATION_INCREMENT:
86 mRotationIncrement = mEditor->preference()->getInt(SETTING::ROTATION_INCREMENT);
88 case SETTING::OVERLAY_PERSPECTIVE1:
89 mEditor->overlays()->settingsUpdated(setting, mEditor->preference()->isOn(setting));
91 case SETTING::OVERLAY_PERSPECTIVE2:
92 mEditor->overlays()->settingsUpdated(setting, mEditor->preference()->isOn(setting));
94 case SETTING::OVERLAY_PERSPECTIVE3:
95 mEditor->overlays()->settingsUpdated(setting, mEditor->preference()->isOn(setting));
104 mCurrentLayer = currentPaintableLayer();
105 if (mCurrentLayer ==
nullptr)
return;
107 if (mEditor->select()->somethingSelected())
109 beginInteraction(
event->modifiers(), mCurrentLayer);
111 if (mEditor->overlays()->anyOverlayEnabled())
113 mEditor->overlays()->setMoveMode(mPerspMode);
115 LayerCamera* layerCam = mEditor->layers()->getCameraLayerBelow(mEditor->currentLayerIndex());
118 QPoint mapped = layerCam->getViewAtFrame(mEditor->currentFrame()).
map(getCurrentPoint()).toPoint();
119 mEditor->overlays()->updatePerspective(mapped);
127 mCurrentLayer = currentPaintableLayer();
128 if (mCurrentLayer ==
nullptr)
return;
130 if (mScribbleArea->isPointerInUse())
132 transformSelection(
event->modifiers());
134 if (mEditor->overlays()->anyOverlayEnabled())
136 LayerCamera* layerCam = mEditor->layers()->getCameraLayerBelow(mEditor->currentLayerIndex());
138 mEditor->overlays()->updatePerspective(layerCam->getViewAtFrame(mEditor->currentFrame()).
map(getCurrentPoint()));
140 if (mEditor->select()->somethingSelected())
142 transformSelection(
event->modifiers());
149 mEditor->select()->setMoveModeForAnchorInRange(getCurrentPoint());
150 mScribbleArea->updateToolCursor();
152 if (mCurrentLayer->type() == Layer::VECTOR)
162 if (mEditor->overlays()->anyOverlayEnabled())
164 mEditor->overlays()->setMoveMode(MoveMode::NONE);
165 mPerspMode = MoveMode::NONE;
168 auto selectMan = mEditor->select();
169 if (!selectMan->somethingSelected())
172 mScribbleArea->updateToolCursor();
178 auto selectMan = mEditor->select();
179 if (selectMan->somethingSelected())
181 int rotationIncrement = 0;
182 if (selectMan->getMoveMode() == MoveMode::ROTATION && keyMod &
Qt::ShiftModifier)
184 rotationIncrement = mRotationIncrement;
191 if (selectMan->getMoveMode() == MoveMode::ROTATION) {
192 QPointF anchorPoint = selectMan->currentTransformAnchor();
193 newAngle = selectMan->angleFromPoint(getCurrentPoint(), anchorPoint) - mRotatedAngle;
194 mPreviousAngle = newAngle;
197 selectMan->adjustSelection(getCurrentPoint(), mOffset, newAngle, rotationIncrement);
201 selectMan->setMoveMode(MoveMode::NONE);
207 auto selectMan = mEditor->select();
208 QRectF selectionRect = selectMan->mySelectionRect();
209 if (!selectionRect.
isNull())
211 mEditor->backup(typeName());
216 if (selectMan->isOutsideSelectionArea(getCurrentPoint()))
218 applyTransformation();
219 mEditor->deselectAll();
223 if (selectMan->getMoveMode() == MoveMode::MIDDLE)
227 selectMan->setMoveMode(MoveMode::ROTATION);
231 if (layer->type() == Layer::VECTOR)
236 selectMan->setTransformAnchor(selectMan->getSelectionAnchorPoint());
238 mOffset = selectMan->myTranslation();
240 if(selectMan->getMoveMode() == MoveMode::ROTATION) {
241 mRotatedAngle = selectMan->angleFromPoint(getCurrentPoint(), selectMan->currentTransformAnchor()) - mPreviousAngle;
252 assert(layer->type() == Layer::VECTOR);
254 VectorImage* vectorImage = vecLayer->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
255 if (vectorImage ==
nullptr) {
return; }
257 if (!mEditor->select()->closestCurves().
empty())
259 setCurveSelected(vectorImage, keyMod);
263 setAreaSelected(vectorImage, keyMod);
269 auto selectMan = mEditor->select();
270 if (!vectorImage->
isSelected(selectMan->closestCurves()))
274 applyTransformation();
276 vectorImage->
setSelected(selectMan->closestCurves(),
true);
277 selectMan->setSelection(vectorImage->getSelectionRect(),
false);
288 applyTransformation();
291 mEditor->select()->setSelection(vectorImage->getSelectionRect(),
false);
301 auto selectMan = mEditor->select();
302 auto layerVector =
static_cast<LayerVector*
>(layer);
303 VectorImage* pVecImg = layerVector->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
304 if (pVecImg ==
nullptr) {
return; }
305 selectMan->setCurves(pVecImg->
getCurvesCloseTo(getCurrentPoint(), selectMan->selectionTolerance()));
308void MoveTool::cancelChanges()
310 mScribbleArea->cancelTransformedSelection();
311 mEditor->deselectAll();
314void MoveTool::applyTransformation()
317 mScribbleArea->applyTransformedSelection();
321 selectMan->setSelection(selectMan->mapToSelection(
QPolygonF(selectMan->mySelectionRect())).boundingRect());
326bool MoveTool::leavingThisTool()
330 switch (mCurrentLayer->type())
332 case Layer::BITMAP: applyTransformation();
break;
333 case Layer::VECTOR: applyTransformation();
break;
340void MoveTool::resetToDefault()
342 setShowSelectionInfo(
false);
345void MoveTool::setShowSelectionInfo(
const bool b)
347 properties.showSelectionInfo = b;
350 settings.setValue(
"ShowSelectionInfo", b);
354Layer* MoveTool::currentPaintableLayer()
356 Layer* layer = mEditor->layers()->currentLayer();
357 if (layer ==
nullptr)
359 if (!layer->isPaintable())
364QCursor MoveTool::cursor(MoveMode mode)
const
369 QPainter cursorPainter(&cursorPixmap);
374 case MoveMode::PERSP_LEFT:
375 case MoveMode::PERSP_RIGHT:
376 case MoveMode::PERSP_MIDDLE:
377 case MoveMode::PERSP_SINGLE:
379 cursorPainter.drawImage(
QPoint(6,6),
QImage(
"://icons/new/svg/cursor-move.svg"));
382 case MoveMode::TOPLEFT:
383 case MoveMode::BOTTOMRIGHT:
385 cursorPainter.drawImage(
QPoint(6,6),
QImage(
"://icons/new/svg/cursor-diagonal-left.svg"));
388 case MoveMode::TOPRIGHT:
389 case MoveMode::BOTTOMLEFT:
391 cursorPainter.drawImage(
QPoint(6,6),
QImage(
"://icons/new/svg/cursor-diagonal-right.svg"));
394 case MoveMode::ROTATIONLEFT:
395 case MoveMode::ROTATIONRIGHT:
396 case MoveMode::ROTATION:
398 cursorPainter.drawImage(
QPoint(6,6),
QImage(
"://icons/new/svg/cursor-rotate.svg"));
401 case MoveMode::MIDDLE:
402 case MoveMode::CENTER:
404 cursorPainter.drawImage(
QPoint(6,6),
QImage(
"://icons/new/svg/cursor-move.svg"));
void updateCurrentFrame()
Will call update() and update the canvas Only call this directly If you need the cache to be intact a...
void frameModified(int frameNumber)
This should be emitted after modifying the frame content.
void setDragOrigin(const QPointF point)
The point from where the dragging will be based of inside the selection area.
void alignPositionToAxis(bool state)
Locks movement either horizontally or vertically depending on drag direction.
bool isAreaSelected(int areaNumber)
VectorImage::isAreaSelected.
void setSelected(int curveNumber, bool YesOrNo)
VectorImage::setSelected.
int getLastAreaNumber(QPointF point)
VectorImage::getLastAreaNumber.
void setAreaSelected(int areaNumber, bool YesOrNo)
VectorImage::setAreaSelected.
bool isSelected(int curveNumber)
VectorImage::isSelected.
QList< int > getCurvesCloseTo(QPointF thisPoint, qreal maxDistance)
VectorImage::getCurvesCloseTo.
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
virtual bool event(QEvent *e)
void fill(const QColor &color)
bool isNull() const const
typedef KeyboardModifiers