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()
51 properties.width = -1;
52 properties.feather = -1;
53 properties.useFeather =
false;
54 properties.stabilizerLevel = -1;
55 properties.useAA = settings.value(
"moveAA").toBool();
56 mRotationIncrement = mEditor->preference()->getInt(SETTING::ROTATION_INCREMENT);
57 properties.showSelectionInfo = settings.value(
"ShowSelectionInfo").toBool();
58 mPropertyEnabled[SHOWSELECTIONINFO] =
true;
59 mPropertyEnabled[ANTI_ALIASING] =
true;
61 connect(mEditor->preference(), &PreferenceManager::optionChanged,
this, &MoveTool::updateSettings);
64void MoveTool::saveSettings()
68 settings.setValue(
"ShowSelectionInfo", properties.showSelectionInfo);
69 settings.setValue(
"moveAA", properties.useAA);
76 MoveMode mode = MoveMode::NONE;
78 if (selectMan->somethingSelected())
80 mode = mEditor->select()->getMoveMode();
82 else if (mEditor->overlays()->anyOverlayEnabled())
90void MoveTool::updateSettings(
const SETTING setting)
94 case SETTING::ROTATION_INCREMENT:
95 mRotationIncrement = mEditor->preference()->getInt(SETTING::ROTATION_INCREMENT);
97 case SETTING::OVERLAY_PERSPECTIVE1:
98 mEditor->overlays()->settingsUpdated(setting, mEditor->preference()->isOn(setting));
100 case SETTING::OVERLAY_PERSPECTIVE2:
101 mEditor->overlays()->settingsUpdated(setting, mEditor->preference()->isOn(setting));
103 case SETTING::OVERLAY_PERSPECTIVE3:
104 mEditor->overlays()->settingsUpdated(setting, mEditor->preference()->isOn(setting));
113 Layer* currentLayer = currentPaintableLayer();
114 if (currentLayer ==
nullptr)
return;
116 if (mEditor->select()->somethingSelected())
118 beginInteraction(
event->canvasPos(),
event->modifiers(), currentLayer);
120 else if (mEditor->overlays()->anyOverlayEnabled())
122 LayerCamera* layerCam = mEditor->layers()->getCameraLayerBelow(mEditor->currentLayerIndex());
125 mPerspMode = mEditor->overlays()->getMoveModeForPoint(
event->canvasPos(), layerCam->getViewAtFrame(mEditor->currentFrame()));
126 mEditor->overlays()->setMoveMode(mPerspMode);
127 QPoint mapped = layerCam->getViewAtFrame(mEditor->currentFrame()).
map(
event->canvasPos()).toPoint();
128 mEditor->overlays()->updatePerspective(mapped);
136 Layer* currentLayer = currentPaintableLayer();
137 if (currentLayer ==
nullptr)
return;
139 if (mScribbleArea->isPointerInUse())
141 transformSelection(
event->canvasPos(),
event->modifiers());
143 if (mEditor->overlays()->anyOverlayEnabled())
145 LayerCamera* layerCam = mEditor->layers()->getCameraLayerBelow(mEditor->currentLayerIndex());
147 mEditor->overlays()->updatePerspective(layerCam->getViewAtFrame(mEditor->currentFrame()).
map(
event->canvasPos()));
149 if (mEditor->select()->somethingSelected())
151 transformSelection(
event->canvasPos(),
event->modifiers());
158 mEditor->select()->setMoveModeForAnchorInRange(
event->canvasPos());
159 if (mEditor->overlays()->anyOverlayEnabled())
161 LayerCamera *layerCam = mEditor->layers()->getCameraLayerBelow(mEditor->currentLayerIndex());
163 mPerspMode = mEditor->overlays()->getMoveModeForPoint(
event->canvasPos(), layerCam->getViewAtFrame(mEditor->currentFrame()));
165 mScribbleArea->updateToolCursor();
167 if (currentLayer->type() == Layer::VECTOR)
177 mEditor->undoRedo()->
record(mUndoSaveState, typeName());
179 if (mEditor->overlays()->anyOverlayEnabled())
181 mEditor->overlays()->setMoveMode(MoveMode::NONE);
182 mPerspMode = MoveMode::NONE;
185 auto selectMan = mEditor->select();
186 if (!selectMan->somethingSelected())
189 mScribbleArea->updateToolCursor();
195 auto selectMan = mEditor->select();
196 if (selectMan->somethingSelected())
198 int rotationIncrement = 0;
199 if (selectMan->getMoveMode() == MoveMode::ROTATION && keyMod &
Qt::ShiftModifier)
201 rotationIncrement = mRotationIncrement;
208 if (selectMan->getMoveMode() == MoveMode::ROTATION) {
209 QPointF anchorPoint = selectMan->currentTransformAnchor();
210 newAngle = selectMan->angleFromPoint(pos, anchorPoint) - mRotatedAngle;
213 selectMan->adjustSelection(pos, mOffset, newAngle, rotationIncrement);
217 selectMan->setMoveMode(MoveMode::NONE);
223 auto selectMan = mEditor->select();
224 QRectF selectionRect = selectMan->mySelectionRect();
225 if (!selectionRect.
isNull())
227 mUndoSaveState = mEditor->undoRedo()->
state(UndoRedoRecordType::KEYFRAME_MODIFY);
228 mEditor->backup(typeName());
233 if (selectMan->isOutsideSelectionArea(pos))
235 applyTransformation();
236 mEditor->deselectAll();
240 if (selectMan->getMoveMode() == MoveMode::MIDDLE)
244 selectMan->setMoveMode(MoveMode::ROTATION);
248 if (layer->type() == Layer::VECTOR)
253 selectMan->setTransformAnchor(selectMan->getSelectionAnchorPoint());
255 mOffset = selectMan->myTranslation();
257 if(selectMan->getMoveMode() == MoveMode::ROTATION) {
258 mRotatedAngle = selectMan->angleFromPoint(pos, selectMan->currentTransformAnchor()) - selectMan->myRotation();
269 assert(layer->type() == Layer::VECTOR);
271 VectorImage* vectorImage = vecLayer->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
272 if (vectorImage ==
nullptr) {
return; }
274 if (!mEditor->select()->closestCurves().
empty())
276 setCurveSelected(vectorImage, keyMod);
280 setAreaSelected(pos, vectorImage, keyMod);
286 auto selectMan = mEditor->select();
287 if (!vectorImage->
isSelected(selectMan->closestCurves()))
291 applyTransformation();
293 vectorImage->
setSelected(selectMan->closestCurves(),
true);
294 selectMan->setSelection(vectorImage->getSelectionRect(),
false);
305 applyTransformation();
308 mEditor->select()->setSelection(vectorImage->getSelectionRect(),
false);
318 auto selectMan = mEditor->select();
319 auto layerVector =
static_cast<LayerVector*
>(layer);
320 VectorImage* pVecImg = layerVector->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
321 if (pVecImg ==
nullptr) {
return; }
322 selectMan->setCurves(pVecImg->
getCurvesCloseTo(pos, selectMan->selectionTolerance()));
325void MoveTool::applyTransformation()
328 mScribbleArea->applyTransformedSelection();
332 selectMan->setSelection(selectMan->mapToSelection(
QPolygonF(selectMan->mySelectionRect())).boundingRect());
340 if (currentPaintableLayer())
342 applyTransformation();
351 return mScribbleArea->isPointerInUse() &&
352 (mEditor->select()->somethingSelected() || mEditor->overlays()->getMoveMode() != MoveMode::NONE);
355void MoveTool::resetToDefault()
357 setShowSelectionInfo(
false);
361void MoveTool::setShowSelectionInfo(
const bool b)
363 properties.showSelectionInfo = b;
366 settings.setValue(
"ShowSelectionInfo", b);
370Layer* MoveTool::currentPaintableLayer()
372 Layer* layer = mEditor->layers()->currentLayer();
373 if (layer ==
nullptr)
375 if (!layer->isPaintable())
380QCursor MoveTool::cursor(MoveMode mode)
const
385 QPainter cursorPainter(&cursorPixmap);
390 case MoveMode::PERSP_LEFT:
391 case MoveMode::PERSP_RIGHT:
392 case MoveMode::PERSP_MIDDLE:
393 case MoveMode::PERSP_SINGLE:
395 cursorPainter.drawImage(
QPoint(6,6),
QImage(
"://icons/general/cursor-move.svg"));
398 case MoveMode::TOPLEFT:
399 case MoveMode::BOTTOMRIGHT:
401 cursorPainter.drawImage(
QPoint(6,6),
QImage(
"://icons/general/cursor-diagonal-left.svg"));
404 case MoveMode::TOPRIGHT:
405 case MoveMode::BOTTOMLEFT:
407 cursorPainter.drawImage(
QPoint(6,6),
QImage(
"://icons/general/cursor-diagonal-right.svg"));
410 case MoveMode::ROTATIONLEFT:
411 case MoveMode::ROTATIONRIGHT:
412 case MoveMode::ROTATION:
414 cursorPainter.drawImage(
QPoint(6,6),
QImage(
"://icons/general/cursor-rotate.svg"));
417 case MoveMode::MIDDLE:
418 case MoveMode::CENTER:
420 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