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"
32void SelectTool::loadSettings()
34 properties.width = -1;
35 properties.feather = -1;
36 properties.stabilizerLevel = -1;
37 properties.useAA = -1;
39 properties.showSelectionInfo = settings.value(
"ShowSelectionInfo").toBool();
40 mPropertyEnabled[SHOWSELECTIONINFO] =
true;
46 if (mScribbleArea->isPointerInUse()) {
return QCursor(mCursorPixmap); }
48 MoveMode mode = mEditor->select()->getMoveMode();
51 QPainter cursorPainter(&mCursorPixmap);
56 case MoveMode::TOPLEFT:
57 case MoveMode::BOTTOMRIGHT:
59 cursorPainter.drawPixmap(
QPoint(6,6),
QPixmap(
"://icons/general/cursor-diagonal-left.svg"));
62 case MoveMode::TOPRIGHT:
63 case MoveMode::BOTTOMLEFT:
65 cursorPainter.drawPixmap(
QPoint(6,6),
QPixmap(
"://icons/general/cursor-diagonal-right.svg"));
68 case MoveMode::MIDDLE:
70 cursorPainter.drawPixmap(
QPoint(6,6),
QPixmap(
"://icons/general/cursor-move.svg"));
74 cursorPainter.drawPixmap(
QPoint(3,3),
QPixmap(
":icons/general/cross.png"));
83void SelectTool::resetToDefault()
85 setShowSelectionInfo(
false);
88void SelectTool::setShowSelectionInfo(
const bool b)
90 properties.showSelectionInfo = b;
93 settings.setValue(
"ShowSelectionInfo", b);
96void SelectTool::beginSelection(
Layer* currentLayer,
const QPointF& pos)
98 auto selectMan = mEditor->select();
100 if (selectMan->somethingSelected() && mMoveMode != MoveMode::NONE)
102 if (currentLayer->type() == Layer::VECTOR)
104 VectorImage* vectorImage =
static_cast<LayerVector*
>(currentLayer)->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
105 if (vectorImage !=
nullptr) {
109 mSelectionRect = mEditor->select()->mapToSelection(mEditor->select()->mySelectionRect()).boundingRect();
113 selectMan->setSelection(
QRectF(pos.
x(), pos.
y(), 1, 1), mEditor->layers()->currentLayer()->type() == Layer::BITMAP);
114 mAnchorOriginPoint = pos;
122 Layer* currentLayer = mEditor->layers()->currentLayer();
123 if (currentLayer ==
nullptr)
return;
124 if (!currentLayer->isPaintable()) {
return; }
126 auto selectMan = mEditor->select();
128 mPressPoint =
event->canvasPos();
129 selectMan->setMoveModeForAnchorInRange(mPressPoint);
130 mMoveMode = selectMan->getMoveMode();
131 mStartMoveMode = mMoveMode;
133 beginSelection(currentLayer, mPressPoint);
138 Layer* currentLayer = mEditor->layers()->currentLayer();
139 if (currentLayer ==
nullptr) {
return; }
140 if (!currentLayer->isPaintable()) {
return; }
141 auto selectMan = mEditor->select();
143 if (!selectMan->somethingSelected()) {
return; }
145 selectMan->setMoveModeForAnchorInRange(
event->canvasPos());
146 mMoveMode = selectMan->getMoveMode();
147 mScribbleArea->updateToolCursor();
149 if (mScribbleArea->isPointerInUse())
151 controlOffsetOrigin(
event->canvasPos(), mAnchorOriginPoint);
153 if (currentLayer->type() == Layer::VECTOR)
155 VectorImage* vectorImage =
static_cast<LayerVector*
>(currentLayer)->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
156 if (vectorImage !=
nullptr) {
157 vectorImage->select(selectMan->mapToSelection(
QPolygonF(selectMan->mySelectionRect())).boundingRect());
165void SelectTool::pointerReleaseEvent(
PointerEvent* event)
167 Layer* currentLayer = mEditor->layers()->currentLayer();
168 if (currentLayer ==
nullptr)
return;
176 mEditor->deselectAll();
178 if (maybeDeselect(
event->canvasPos()))
180 mEditor->deselectAll();
187 mStartMoveMode = MoveMode::NONE;
188 mSelectionRect = mEditor->select()->mapToSelection(mEditor->select()->mySelectionRect()).boundingRect();
190 mScribbleArea->updateToolCursor();
194bool SelectTool::maybeDeselect(
const QPointF& pos)
196 return (!isSelectionPointValid(pos) && mEditor->select()->getMoveMode() == MoveMode::NONE);
205 if (currentLayer->type() == Layer::VECTOR)
207 VectorImage* vectorImage =
static_cast<LayerVector*
>(currentLayer)->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
208 if (vectorImage ==
nullptr) {
return; }
209 auto selectMan = mEditor->select();
210 selectMan->setSelection(vectorImage->getSelectionRect(),
false);
214void SelectTool::controlOffsetOrigin(
QPointF currentPoint,
QPointF anchorPoint)
217 if (mStartMoveMode != MoveMode::NONE) {
218 QRectF rect = mSelectionRect;
220 QPointF offset = offsetFromPressPos(currentPoint);
221 if (mStartMoveMode == MoveMode::TOPLEFT) {
222 rect.
adjust(offset.
x(), offset.
y(), 0, 0);
223 }
else if (mStartMoveMode == MoveMode::TOPRIGHT) {
224 rect.
adjust(0, offset.
y(), offset.
x(), 0);
225 }
else if (mStartMoveMode == MoveMode::BOTTOMRIGHT) {
226 rect.
adjust(0, 0, offset.
x(), offset.
y());
227 }
else if (mStartMoveMode == MoveMode::BOTTOMLEFT) {
228 rect.
adjust(offset.
x(), 0, 0, offset.
y());
235 mEditor->select()->setSelection(rect,
true);
248 qreal mouseX = currentPoint.
x();
249 qreal mouseY = currentPoint.
y();
251 QRectF selectRect = mSelectionRect;
253 if (mouseX <= originPoint.
x())
260 selectRect.
setLeft(originPoint.
x());
264 if (mouseY <= originPoint.
y())
266 selectRect.
setTop(mouseY);
271 selectRect.
setTop(originPoint.
y());
275 if (selectRect.
width() <= 0) {
278 if (selectRect.
height() <= 0) {
282 editor()->select()->setSelection(selectRect);
285bool SelectTool::keyPressEvent(
QKeyEvent* event)
287 switch (
event->key())
300 return BaseTool::keyPressEvent(
event);
305 return pos - mPressPoint;
void updateFrame()
Update frame.
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