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()
const
47void MoveTool::loadSettings()
49 mRotationIncrement = mEditor->preference()->getInt(SETTING::ROTATION_INCREMENT);
50 QSettings pencilSettings(PENCIL2D, PENCIL2D);
52 mPropertyUsed[TransformToolProperties::SHOWSELECTIONINFO_ENABLED] = { Layer::BITMAP, Layer::VECTOR };
53 mPropertyUsed[TransformToolProperties::ANTI_ALIASING_ENABLED] = { Layer::BITMAP };
56 info[TransformToolProperties::SHOWSELECTIONINFO_ENABLED] =
false;
57 info[TransformToolProperties::ANTI_ALIASING_ENABLED] =
true;
59 toolProperties().insertProperties(info);
60 toolProperties().loadFrom(typeName(), pencilSettings);
62 if (toolProperties().requireMigration(pencilSettings, ToolProperties::VERSION_1)) {
63 toolProperties().setBaseValue(TransformToolProperties::SHOWSELECTIONINFO_ENABLED, pencilSettings.
value(
"ShowSelectionInfo",
false).
toBool());
64 toolProperties().setBaseValue(TransformToolProperties::ANTI_ALIASING_ENABLED, pencilSettings.
value(
"moveAA",
true).
toBool());
67 connect(mEditor->preference(), &PreferenceManager::optionChanged,
this, &MoveTool::updateSettings);
72 MoveMode mode = MoveMode::NONE;
74 if (selectMan->somethingSelected())
76 mode = mEditor->select()->getMoveMode();
78 else if (mEditor->overlays()->anyOverlayEnabled())
86void MoveTool::updateSettings(
const SETTING setting)
90 case SETTING::ROTATION_INCREMENT:
91 mRotationIncrement = mEditor->preference()->getInt(SETTING::ROTATION_INCREMENT);
93 case SETTING::OVERLAY_PERSPECTIVE1:
94 mEditor->overlays()->settingsUpdated(setting, mEditor->preference()->isOn(setting));
96 case SETTING::OVERLAY_PERSPECTIVE2:
97 mEditor->overlays()->settingsUpdated(setting, mEditor->preference()->isOn(setting));
99 case SETTING::OVERLAY_PERSPECTIVE3:
100 mEditor->overlays()->settingsUpdated(setting, mEditor->preference()->isOn(setting));
109 Layer* currentLayer = currentPaintableLayer();
110 if (currentLayer ==
nullptr)
return;
112 if (mEditor->select()->somethingSelected())
114 beginInteraction(
event->canvasPos(),
event->modifiers(), currentLayer);
116 else if (mEditor->overlays()->anyOverlayEnabled())
118 LayerCamera* layerCam = mEditor->layers()->getCameraLayerBelow(mEditor->currentLayerIndex());
121 mPerspMode = mEditor->overlays()->getMoveModeForPoint(
event->canvasPos(), layerCam->getViewAtFrame(mEditor->currentFrame()));
122 mEditor->overlays()->setMoveMode(mPerspMode);
123 QPoint mapped = layerCam->getViewAtFrame(mEditor->currentFrame()).
map(
event->canvasPos()).toPoint();
124 mEditor->overlays()->updatePerspective(mapped);
132 Layer* currentLayer = currentPaintableLayer();
133 if (currentLayer ==
nullptr)
return;
135 if (mScribbleArea->isPointerInUse())
137 transformSelection(
event->canvasPos(),
event->modifiers());
139 if (mEditor->overlays()->anyOverlayEnabled())
141 LayerCamera* layerCam = mEditor->layers()->getCameraLayerBelow(mEditor->currentLayerIndex());
143 mEditor->overlays()->updatePerspective(layerCam->getViewAtFrame(mEditor->currentFrame()).
map(
event->canvasPos()));
145 if (mEditor->select()->somethingSelected())
147 transformSelection(
event->canvasPos(),
event->modifiers());
154 mEditor->select()->setMoveModeForAnchorInRange(
event->canvasPos());
155 if (mEditor->overlays()->anyOverlayEnabled())
157 LayerCamera *layerCam = mEditor->layers()->getCameraLayerBelow(mEditor->currentLayerIndex());
159 mPerspMode = mEditor->overlays()->getMoveModeForPoint(
event->canvasPos(), layerCam->getViewAtFrame(mEditor->currentFrame()));
161 mScribbleArea->updateToolCursor();
163 if (currentLayer->type() == Layer::VECTOR)
173 mEditor->undoRedo()->
record(mUndoSaveState, typeName());
175 if (mEditor->overlays()->anyOverlayEnabled())
177 mEditor->overlays()->setMoveMode(MoveMode::NONE);
178 mPerspMode = MoveMode::NONE;
181 auto selectMan = mEditor->select();
182 if (!selectMan->somethingSelected())
185 mScribbleArea->updateToolCursor();
191 auto selectMan = mEditor->select();
192 if (selectMan->somethingSelected())
194 int rotationIncrement = 0;
195 if (selectMan->getMoveMode() == MoveMode::ROTATION && keyMod &
Qt::ShiftModifier)
197 rotationIncrement = mRotationIncrement;
204 if (selectMan->getMoveMode() == MoveMode::ROTATION) {
205 QPointF anchorPoint = selectMan->currentTransformAnchor();
206 newAngle = selectMan->angleFromPoint(pos, anchorPoint) - mRotatedAngle;
209 selectMan->adjustSelection(pos, mOffset, newAngle, rotationIncrement);
213 selectMan->setMoveMode(MoveMode::NONE);
219 auto selectMan = mEditor->select();
220 QRectF selectionRect = selectMan->mySelectionRect();
221 if (!selectionRect.
isNull())
223 mUndoSaveState = mEditor->undoRedo()->
state(UndoRedoRecordType::KEYFRAME_MODIFY);
224 mEditor->backup(typeName());
229 if (selectMan->isOutsideSelectionArea(pos))
231 applyTransformation();
232 mEditor->deselectAll();
236 if (selectMan->getMoveMode() == MoveMode::MIDDLE)
240 selectMan->setMoveMode(MoveMode::ROTATION);
244 if (layer->type() == Layer::VECTOR)
249 selectMan->setTransformAnchor(selectMan->getSelectionAnchorPoint());
251 mOffset = selectMan->myTranslation();
253 if(selectMan->getMoveMode() == MoveMode::ROTATION) {
254 mRotatedAngle = selectMan->angleFromPoint(pos, selectMan->currentTransformAnchor()) - selectMan->myRotation();
265 assert(layer->type() == Layer::VECTOR);
267 VectorImage* vectorImage = vecLayer->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
268 if (vectorImage ==
nullptr) {
return; }
270 if (!mEditor->select()->closestCurves().
empty())
272 setCurveSelected(vectorImage, keyMod);
276 setAreaSelected(pos, vectorImage, keyMod);
282 auto selectMan = mEditor->select();
283 if (!vectorImage->
isSelected(selectMan->closestCurves()))
287 applyTransformation();
289 vectorImage->
setSelected(selectMan->closestCurves(),
true);
290 selectMan->setSelection(vectorImage->getSelectionRect(),
false);
301 applyTransformation();
304 mEditor->select()->setSelection(vectorImage->getSelectionRect(),
false);
314 auto selectMan = mEditor->select();
315 auto layerVector =
static_cast<LayerVector*
>(layer);
316 VectorImage* pVecImg = layerVector->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
317 if (pVecImg ==
nullptr) {
return; }
318 selectMan->setCurves(pVecImg->
getCurvesCloseTo(pos, selectMan->selectionTolerance()));
321void MoveTool::applyTransformation()
324 mScribbleArea->applyTransformedSelection();
328 selectMan->setSelection(selectMan->mapToSelection(
QPolygonF(selectMan->mySelectionRect())).boundingRect());
336 if (currentPaintableLayer())
338 applyTransformation();
345 return mScribbleArea->isPointerInUse() &&
346 (mEditor->select()->somethingSelected() || mEditor->overlays()->getMoveMode() != MoveMode::NONE);
349Layer* MoveTool::currentPaintableLayer()
351 Layer* layer = mEditor->layers()->currentLayer();
352 if (layer ==
nullptr)
354 if (!layer->isPaintable())
359QCursor MoveTool::cursor(MoveMode mode)
const
364 QPainter cursorPainter(&cursorPixmap);
369 case MoveMode::PERSP_LEFT:
370 case MoveMode::PERSP_RIGHT:
371 case MoveMode::PERSP_MIDDLE:
372 case MoveMode::PERSP_SINGLE:
374 cursorPainter.drawImage(
QPoint(6,6),
QImage(
"://icons/general/cursor-move.svg"));
377 case MoveMode::TOPLEFT:
378 case MoveMode::BOTTOMRIGHT:
380 cursorPainter.drawImage(
QPoint(6,6),
QImage(
"://icons/general/cursor-diagonal-left.svg"));
383 case MoveMode::TOPRIGHT:
384 case MoveMode::BOTTOMLEFT:
386 cursorPainter.drawImage(
QPoint(6,6),
QImage(
"://icons/general/cursor-diagonal-right.svg"));
389 case MoveMode::ROTATIONLEFT:
390 case MoveMode::ROTATIONRIGHT:
391 case MoveMode::ROTATION:
393 cursorPainter.drawImage(
QPoint(6,6),
QImage(
"://icons/general/cursor-rotate.svg"));
396 case MoveMode::MIDDLE:
397 case MoveMode::CENTER:
399 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
QVariant value(const QString &key, const QVariant &defaultValue) const const
typedef KeyboardModifiers
bool toBool() const const