17#include "selecttool.h"
19#include "pointerevent.h"
20#include "vectorimage.h"
22#include "layervector.h"
23#include "scribblearea.h"
24#include "layermanager.h"
25#include "toolmanager.h"
26#include "selectionmanager.h"
27#include "undoredomanager.h"
33void SelectTool::loadSettings()
35 properties.width = -1;
36 properties.feather = -1;
37 properties.stabilizerLevel = -1;
38 properties.useAA = -1;
40 properties.showSelectionInfo = settings.value(
"ShowSelectionInfo").toBool();
41 mPropertyEnabled[SHOWSELECTIONINFO] =
true;
44void SelectTool::saveSettings()
48 settings.setValue(
"ShowSelectionInfo", properties.showSelectionInfo);
56 if (mScribbleArea->isPointerInUse()) {
return QCursor(mCursorPixmap); }
58 MoveMode mode = mEditor->select()->getMoveMode();
61 QPainter cursorPainter(&mCursorPixmap);
66 case MoveMode::TOPLEFT:
67 case MoveMode::BOTTOMRIGHT:
69 cursorPainter.drawPixmap(
QPoint(6,6),
QPixmap(
"://icons/general/cursor-diagonal-left.svg"));
72 case MoveMode::TOPRIGHT:
73 case MoveMode::BOTTOMLEFT:
75 cursorPainter.drawPixmap(
QPoint(6,6),
QPixmap(
"://icons/general/cursor-diagonal-right.svg"));
78 case MoveMode::MIDDLE:
80 cursorPainter.drawPixmap(
QPoint(6,6),
QPixmap(
"://icons/general/cursor-move.svg"));
84 cursorPainter.drawPixmap(
QPoint(3,3),
QPixmap(
":icons/general/cross.png"));
93void SelectTool::resetToDefault()
95 setShowSelectionInfo(
false);
98void SelectTool::setShowSelectionInfo(
const bool b)
100 properties.showSelectionInfo = b;
103void SelectTool::beginSelection(
Layer* currentLayer,
const QPointF& pos)
105 auto selectMan = mEditor->select();
107 if (selectMan->somethingSelected() && mMoveMode != MoveMode::NONE)
109 if (currentLayer->type() == Layer::VECTOR)
111 VectorImage* vectorImage =
static_cast<LayerVector*
>(currentLayer)->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
112 if (vectorImage !=
nullptr) {
116 mSelectionRect = mEditor->select()->mapToSelection(mEditor->select()->mySelectionRect()).boundingRect();
120 selectMan->setSelection(
QRectF(pos.
x(), pos.
y(), 1, 1), mEditor->layers()->currentLayer()->type() == Layer::BITMAP);
121 mAnchorOriginPoint = pos;
129 Layer* currentLayer = mEditor->layers()->currentLayer();
130 if (currentLayer ==
nullptr)
return;
131 if (!currentLayer->isPaintable()) {
return; }
133 auto selectMan = mEditor->select();
135 mUndoState = mEditor->undoRedo()->
state(UndoRedoRecordType::KEYFRAME_MODIFY);
137 mPressPoint =
event->canvasPos();
138 selectMan->setMoveModeForAnchorInRange(mPressPoint);
139 mMoveMode = selectMan->getMoveMode();
140 mStartMoveMode = mMoveMode;
142 beginSelection(currentLayer, mPressPoint);
147 Layer* currentLayer = mEditor->layers()->currentLayer();
148 if (currentLayer ==
nullptr) {
return; }
149 if (!currentLayer->isPaintable()) {
return; }
150 auto selectMan = mEditor->select();
152 if (!selectMan->somethingSelected()) {
return; }
154 selectMan->setMoveModeForAnchorInRange(
event->canvasPos());
155 mMoveMode = selectMan->getMoveMode();
156 mScribbleArea->updateToolCursor();
158 if (mScribbleArea->isPointerInUse())
160 controlOffsetOrigin(
event->canvasPos(), mAnchorOriginPoint);
162 if (currentLayer->type() == Layer::VECTOR)
164 VectorImage* vectorImage =
static_cast<LayerVector*
>(currentLayer)->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
165 if (vectorImage !=
nullptr) {
166 vectorImage->select(selectMan->mapToSelection(
QPolygonF(selectMan->mySelectionRect())).boundingRect());
174void SelectTool::pointerReleaseEvent(
PointerEvent* event)
176 Layer* currentLayer = mEditor->layers()->currentLayer();
177 if (currentLayer ==
nullptr)
return;
185 mEditor->deselectAll();
187 if (maybeDeselect(
event->canvasPos()))
189 mEditor->deselectAll();
196 mEditor->undoRedo()->
record(mUndoState, typeName());
198 mStartMoveMode = MoveMode::NONE;
199 mSelectionRect = mEditor->select()->mapToSelection(mEditor->select()->mySelectionRect()).boundingRect();
201 mScribbleArea->updateToolCursor();
205bool SelectTool::maybeDeselect(
const QPointF& pos)
207 return (!isSelectionPointValid(pos) && mEditor->select()->getMoveMode() == MoveMode::NONE);
216 if (currentLayer->type() == Layer::VECTOR)
218 VectorImage* vectorImage =
static_cast<LayerVector*
>(currentLayer)->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
219 if (vectorImage ==
nullptr) {
return; }
220 auto selectMan = mEditor->select();
221 selectMan->setSelection(vectorImage->getSelectionRect(),
false);
225void SelectTool::controlOffsetOrigin(
QPointF currentPoint,
QPointF anchorPoint)
228 if (mStartMoveMode != MoveMode::NONE) {
229 QRectF rect = mSelectionRect;
231 QPointF offset = offsetFromPressPos(currentPoint);
232 if (mStartMoveMode == MoveMode::TOPLEFT) {
233 rect.
adjust(offset.
x(), offset.
y(), 0, 0);
234 }
else if (mStartMoveMode == MoveMode::TOPRIGHT) {
235 rect.
adjust(0, offset.
y(), offset.
x(), 0);
236 }
else if (mStartMoveMode == MoveMode::BOTTOMRIGHT) {
237 rect.
adjust(0, 0, offset.
x(), offset.
y());
238 }
else if (mStartMoveMode == MoveMode::BOTTOMLEFT) {
239 rect.
adjust(offset.
x(), 0, 0, offset.
y());
246 mEditor->select()->setSelection(rect,
true);
259 qreal mouseX = currentPoint.
x();
260 qreal mouseY = currentPoint.
y();
262 QRectF selectRect = mSelectionRect;
264 if (mouseX <= originPoint.
x())
271 selectRect.
setLeft(originPoint.
x());
275 if (mouseY <= originPoint.
y())
277 selectRect.
setTop(mouseY);
282 selectRect.
setTop(originPoint.
y());
286 if (selectRect.
width() <= 0) {
289 if (selectRect.
height() <= 0) {
293 editor()->select()->setSelection(selectRect);
296bool SelectTool::keyPressEvent(
QKeyEvent* event)
298 switch (
event->key())
311 return BaseTool::keyPressEvent(
event);
316 return pos - mPressPoint;
void updateFrame()
Update frame.
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.
void deselectAll()
VectorImage::deselectAll.
qreal length() const const
virtual bool event(QEvent *e)
void fill(const QColor &color)
void adjust(qreal dx1, qreal dy1, qreal dx2, qreal dy2)
qreal height() const const
bool isValid() const const
QRectF normalized() const const
void setHeight(qreal height)
void setWidth(qreal width)
void translate(qreal dx, qreal dy)
qreal width() const const