24#include "pointerevent.h"
26#include "toolmanager.h"
27#include "strokeinterpolator.h"
28#include "selectionmanager.h"
29#include "overlaymanager.h"
30#include "undoredomanager.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);
62void MoveTool::saveSettings()
66 settings.setValue(
"ShowSelectionInfo", properties.showSelectionInfo);
73 MoveMode mode = MoveMode::NONE;
75 if (selectMan->somethingSelected())
77 mode = mEditor->select()->getMoveMode();
79 else if (mEditor->overlays()->anyOverlayEnabled())
87void MoveTool::updateSettings(
const SETTING setting)
91 case SETTING::ROTATION_INCREMENT:
92 mRotationIncrement = mEditor->preference()->getInt(SETTING::ROTATION_INCREMENT);
94 case SETTING::OVERLAY_PERSPECTIVE1:
95 mEditor->overlays()->settingsUpdated(setting, mEditor->preference()->isOn(setting));
97 case SETTING::OVERLAY_PERSPECTIVE2:
98 mEditor->overlays()->settingsUpdated(setting, mEditor->preference()->isOn(setting));
100 case SETTING::OVERLAY_PERSPECTIVE3:
101 mEditor->overlays()->settingsUpdated(setting, mEditor->preference()->isOn(setting));
110 Layer* currentLayer = currentPaintableLayer();
111 if (currentLayer ==
nullptr)
return;
113 if (mEditor->select()->somethingSelected())
115 beginInteraction(
event->canvasPos(),
event->modifiers(), currentLayer);
117 else if (mEditor->overlays()->anyOverlayEnabled())
119 LayerCamera* layerCam = mEditor->layers()->getCameraLayerBelow(mEditor->currentLayerIndex());
122 mPerspMode = mEditor->overlays()->getMoveModeForPoint(
event->canvasPos(), layerCam->getViewAtFrame(mEditor->currentFrame()));
123 mEditor->overlays()->setMoveMode(mPerspMode);
124 QPoint mapped = layerCam->getViewAtFrame(mEditor->currentFrame()).
map(
event->canvasPos()).toPoint();
125 mEditor->overlays()->updatePerspective(mapped);
133 Layer* currentLayer = currentPaintableLayer();
134 if (currentLayer ==
nullptr)
return;
136 if (mScribbleArea->isPointerInUse())
138 transformSelection(
event->canvasPos(),
event->modifiers());
140 if (mEditor->overlays()->anyOverlayEnabled())
142 LayerCamera* layerCam = mEditor->layers()->getCameraLayerBelow(mEditor->currentLayerIndex());
144 mEditor->overlays()->updatePerspective(layerCam->getViewAtFrame(mEditor->currentFrame()).
map(
event->canvasPos()));
146 if (mEditor->select()->somethingSelected())
148 transformSelection(
event->canvasPos(),
event->modifiers());
155 mEditor->select()->setMoveModeForAnchorInRange(
event->canvasPos());
156 if (mEditor->overlays()->anyOverlayEnabled())
158 LayerCamera *layerCam = mEditor->layers()->getCameraLayerBelow(mEditor->currentLayerIndex());
160 mPerspMode = mEditor->overlays()->getMoveModeForPoint(
event->canvasPos(), layerCam->getViewAtFrame(mEditor->currentFrame()));
162 mScribbleArea->updateToolCursor();
164 if (currentLayer->type() == Layer::VECTOR)
174 mEditor->undoRedo()->
record(mUndoSaveState, typeName());
176 if (mEditor->overlays()->anyOverlayEnabled())
178 mEditor->overlays()->setMoveMode(MoveMode::NONE);
179 mPerspMode = MoveMode::NONE;
182 auto selectMan = mEditor->select();
183 if (!selectMan->somethingSelected())
186 mScribbleArea->updateToolCursor();
192 auto selectMan = mEditor->select();
193 if (selectMan->somethingSelected())
195 int rotationIncrement = 0;
196 if (selectMan->getMoveMode() == MoveMode::ROTATION && keyMod &
Qt::ShiftModifier)
198 rotationIncrement = mRotationIncrement;
205 if (selectMan->getMoveMode() == MoveMode::ROTATION) {
206 QPointF anchorPoint = selectMan->currentTransformAnchor();
207 newAngle = selectMan->angleFromPoint(pos, anchorPoint) - mRotatedAngle;
210 selectMan->adjustSelection(pos, mOffset, newAngle, rotationIncrement);
214 selectMan->setMoveMode(MoveMode::NONE);
220 auto selectMan = mEditor->select();
221 QRectF selectionRect = selectMan->mySelectionRect();
222 if (!selectionRect.
isNull())
224 mUndoSaveState = mEditor->undoRedo()->
state(UndoRedoRecordType::KEYFRAME_MODIFY);
225 mEditor->backup(typeName());
230 if (selectMan->isOutsideSelectionArea(pos))
232 applyTransformation();
233 mEditor->deselectAll();
237 if (selectMan->getMoveMode() == MoveMode::MIDDLE)
241 selectMan->setMoveMode(MoveMode::ROTATION);
245 if (layer->type() == Layer::VECTOR)
250 selectMan->setTransformAnchor(selectMan->getSelectionAnchorPoint());
252 mOffset = selectMan->myTranslation();
254 if(selectMan->getMoveMode() == MoveMode::ROTATION) {
255 mRotatedAngle = selectMan->angleFromPoint(pos, selectMan->currentTransformAnchor()) - selectMan->myRotation();
266 assert(layer->type() == Layer::VECTOR);
268 VectorImage* vectorImage = vecLayer->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
269 if (vectorImage ==
nullptr) {
return; }
271 if (!mEditor->select()->closestCurves().
empty())
273 setCurveSelected(vectorImage, keyMod);
277 setAreaSelected(pos, vectorImage, keyMod);
283 auto selectMan = mEditor->select();
284 if (!vectorImage->
isSelected(selectMan->closestCurves()))
288 applyTransformation();
290 vectorImage->
setSelected(selectMan->closestCurves(),
true);
291 selectMan->setSelection(vectorImage->getSelectionRect(),
false);
302 applyTransformation();
305 mEditor->select()->setSelection(vectorImage->getSelectionRect(),
false);
315 auto selectMan = mEditor->select();
316 auto layerVector =
static_cast<LayerVector*
>(layer);
317 VectorImage* pVecImg = layerVector->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
318 if (pVecImg ==
nullptr) {
return; }
319 selectMan->setCurves(pVecImg->
getCurvesCloseTo(pos, selectMan->selectionTolerance()));
322void MoveTool::applyTransformation()
325 mScribbleArea->applyTransformedSelection();
329 selectMan->setSelection(selectMan->mapToSelection(
QPolygonF(selectMan->mySelectionRect())).boundingRect());
337 if (currentPaintableLayer())
339 applyTransformation();
345 return mScribbleArea->isPointerInUse() &&
346 (mEditor->select()->somethingSelected() || mEditor->overlays()->getMoveMode() != MoveMode::NONE);
349void MoveTool::resetToDefault()
351 setShowSelectionInfo(
false);
354void MoveTool::setShowSelectionInfo(
const bool b)
356 properties.showSelectionInfo = b;
359 settings.setValue(
"ShowSelectionInfo", b);
363Layer* MoveTool::currentPaintableLayer()
365 Layer* layer = mEditor->layers()->currentLayer();
366 if (layer ==
nullptr)
368 if (!layer->isPaintable())
373QCursor MoveTool::cursor(MoveMode mode)
const
378 QPainter cursorPainter(&cursorPixmap);
383 case MoveMode::PERSP_LEFT:
384 case MoveMode::PERSP_RIGHT:
385 case MoveMode::PERSP_MIDDLE:
386 case MoveMode::PERSP_SINGLE:
388 cursorPainter.drawImage(
QPoint(6,6),
QImage(
"://icons/general/cursor-move.svg"));
391 case MoveMode::TOPLEFT:
392 case MoveMode::BOTTOMRIGHT:
394 cursorPainter.drawImage(
QPoint(6,6),
QImage(
"://icons/general/cursor-diagonal-left.svg"));
397 case MoveMode::TOPRIGHT:
398 case MoveMode::BOTTOMLEFT:
400 cursorPainter.drawImage(
QPoint(6,6),
QImage(
"://icons/general/cursor-diagonal-right.svg"));
403 case MoveMode::ROTATIONLEFT:
404 case MoveMode::ROTATIONRIGHT:
405 case MoveMode::ROTATION:
407 cursorPainter.drawImage(
QPoint(6,6),
QImage(
"://icons/general/cursor-rotate.svg"));
410 case MoveMode::MIDDLE:
411 case MoveMode::CENTER:
413 cursorPainter.drawImage(
QPoint(6,6),
QImage(
"://icons/general/cursor-move.svg"));
void frameModified(int frameNumber)
This should be emitted after modifying the frame content.
void updateFrame()
Will call update() and update the canvas Only call this directly If you need the cache to be intact a...
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.
void record(const UndoSaveState *&undoState, const QString &description)
Records the given save state.
const UndoSaveState * state(UndoRedoRecordType recordType) const
Prepares and returns a save state with the given scope.
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