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());
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(mUndoSaveStateId, 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;
213 selectMan->setMoveMode(MoveMode::NONE);
219 auto selectMan = mEditor->select();
220 QRectF selectionRect = selectMan->mySelectionRect();
221 if (!selectionRect.
isNull())
223 mUndoSaveStateId = mEditor->undoRedo()->
createState(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());
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());
317 if (pVecImg ==
nullptr) {
return; }
318 selectMan->setCurves(pVecImg->
getCurvesCloseTo(pos, selectMan->selectionTolerance()));
321void MoveTool::applyTransformation()
324 mScribbleArea->applyTransformedSelection();
332void MoveTool::applyTransformationAndDeselect()
335 mScribbleArea->applyTransformedSelection();
337 Layer* currentLayer = mEditor->layers()->currentLayer();
338 if (currentLayer->type() == Layer::VECTOR) {
339 auto keyFrame =
static_cast<VectorImage*
>(currentLayer->getLastKeyFrameAtPosition(mEditor->currentFrame()));
346 mEditor->select()->resetSelectionProperties();
354 if (currentPaintableLayer())
356 applyTransformation();
363 return mScribbleArea->isPointerInUse() &&
364 (mEditor->select()->somethingSelected() || mEditor->overlays()->getMoveMode() != MoveMode::NONE);
367Layer* MoveTool::currentPaintableLayer()
369 Layer* layer = mEditor->layers()->currentLayer();
370 if (layer ==
nullptr)
372 if (!layer->isPaintable())
377QCursor MoveTool::cursor(MoveMode mode)
const
382 QPainter cursorPainter(&cursorPixmap);
387 case MoveMode::PERSP_LEFT:
388 case MoveMode::PERSP_RIGHT:
389 case MoveMode::PERSP_MIDDLE:
390 case MoveMode::PERSP_SINGLE:
392 cursorPainter.drawImage(
QPoint(6,6),
QImage(
"://icons/general/cursor-move.svg"));
395 case MoveMode::TOPLEFT:
396 case MoveMode::BOTTOMRIGHT:
398 cursorPainter.drawImage(
QPoint(6,6),
QImage(
"://icons/general/cursor-diagonal-left.svg"));
401 case MoveMode::TOPRIGHT:
402 case MoveMode::BOTTOMLEFT:
404 cursorPainter.drawImage(
QPoint(6,6),
QImage(
"://icons/general/cursor-diagonal-right.svg"));
407 case MoveMode::ROTATIONLEFT:
408 case MoveMode::ROTATIONRIGHT:
409 case MoveMode::ROTATION:
411 cursorPainter.drawImage(
QPoint(6,6),
QImage(
"://icons/general/cursor-rotate.svg"));
414 case MoveMode::MIDDLE:
415 case MoveMode::CENTER:
417 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...
The SelectionManager class acts as the "Brain" of the selection system.
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 setMoveModeForAnchorInRange(const QPointF &point)
Checks if the point is over a handle (corner) or body and sets the MoveMode accordingly.
QPointF mapToSelection(const QPointF &point) const
Maps a point from Canvas/Layer space INTO the Selection's transformed space.
void setSelection(QRectF rect, bool roundPixels=false)
Defines the selection area.
void adjustSelection(const QPointF ¤tPoint, const QPointF &offset, qreal rotationOffset, int rotationIncrement=0)
Updates the selection transform (move, scale, rotate) based on input delta.
void record(SAVESTATE_ID SaveStateId, const QString &description)
Records the given save state.
SAVESTATE_ID createState(UndoRedoRecordType recordType)
Prepares and returns an save state with common data.
void deselectAll()
VectorImage::deselectAll.
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