17#include "smudgetool.h"
21#include "pointerevent.h"
22#include "vectorimage.h"
24#include "scribblearea.h"
26#include "layermanager.h"
27#include "viewmanager.h"
28#include "selectionmanager.h"
30#include "layerbitmap.h"
31#include "layervector.h"
39ToolType SmudgeTool::type()
44void SmudgeTool::loadSettings()
48 mPropertyEnabled[WIDTH] =
true;
49 mPropertyEnabled[FEATHER] =
true;
52 properties.width = settings.value(
"smudgeWidth", 24.0).toDouble();
53 properties.feather = settings.value(
"smudgeFeather", 48.0).toDouble();
54 properties.pressure =
false;
55 properties.stabilizerLevel = -1;
61void SmudgeTool::resetToDefault()
67void SmudgeTool::setWidth(
const qreal width)
70 properties.width = width;
74 settings.setValue(
"smudgeWidth", width);
78void SmudgeTool::setFeather(
const qreal feather)
81 properties.feather = feather;
85 settings.setValue(
"smudgeFeather", feather);
89void SmudgeTool::setPressure(
const bool pressure)
92 properties.pressure = pressure;
96 settings.setValue(
"smudgePressure", pressure);
109 return QCursor(
QPixmap(
":icons/general/cursor-smudge.svg"), 4, 18);
113 return QCursor(
QPixmap(
":icons/general/cursor-smudge-liquify.svg"), 4, 18);
117bool SmudgeTool::keyPressEvent(
QKeyEvent *event)
125 return StrokeTool::keyPressEvent(event);
128bool SmudgeTool::keyReleaseEvent(
QKeyEvent *event)
136 return StrokeTool::keyReleaseEvent(event);
141 mInterpolator.pointerPressEvent(event);
142 if (handleQuickSizing(event)) {
146 Layer* layer = mEditor->layers()->currentLayer();
147 auto selectMan = mEditor->select();
148 if (layer ==
nullptr) {
return; }
152 startStroke(event->inputType());
153 if (layer->type() == Layer::BITMAP)
155 mLastBrushPoint = getCurrentPoint();
157 else if (layer->type() == Layer::VECTOR)
159 const int currentFrame = mEditor->currentFrame();
160 const float distanceFrom = selectMan->selectionTolerance();
162 if (vectorImage ==
nullptr) {
return; }
163 selectMan->setCurves(vectorImage->
getCurvesCloseTo(getCurrentPoint(), distanceFrom));
164 selectMan->setVertices(vectorImage->
getVerticesCloseTo(getCurrentPoint(), distanceFrom));
166 if (selectMan->closestCurves().size() > 0 || selectMan->closestCurves().size() > 0)
178 mEditor->deselectAll();
181 vectorImage->
setSelected(selectMan->closestVertices(),
true);
182 selectMan->vectorSelection.add(selectMan->closestCurves());
183 selectMan->vectorSelection.add(selectMan->closestVertices());
189 mEditor->deselectAll();
194 StrokeTool::pointerPressEvent(event);
199 mInterpolator.pointerMoveEvent(event);
200 if (handleQuickSizing(event)) {
204 if (event->inputType() != mCurrentInputType)
return;
206 Layer* layer = mEditor->layers()->currentLayer();
207 if (layer ==
nullptr) {
return; }
209 if (layer->type() != Layer::BITMAP && layer->type() != Layer::VECTOR)
214 auto selectMan = mEditor->select();
217 if (layer->type() == Layer::BITMAP)
225 VectorImage* vectorImage =
static_cast<LayerVector*
>(layer)->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
226 if (vectorImage ==
nullptr) {
return; }
233 blit.extend(vectorImage->getBoundsOfTransformedCurves().
toRect());
234 selectMan->setSelectionTransform(
QTransform().
translate(offsetFromPressPos().x(), offsetFromPressPos().y()));
236 blit.extend(vectorImage->getBoundsOfTransformedCurves().
toRect());
239 mScribbleArea->
update(mEditor->view()->mapCanvasToScreen(blit).toRect().adjusted(-1, -1, 1, 1));
245 if (layer->type() == Layer::VECTOR)
247 VectorImage* vectorImage =
static_cast<LayerVector*
>(layer)->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
248 if (vectorImage ==
nullptr) {
return; }
250 selectMan->setVertices(vectorImage->
getVerticesCloseTo(getCurrentPoint(), selectMan->selectionTolerance()));
255 StrokeTool::pointerMoveEvent(event);
258void SmudgeTool::pointerReleaseEvent(
PointerEvent* event)
260 mInterpolator.pointerReleaseEvent(event);
261 if (handleQuickSizing(event)) {
265 if (event->inputType() != mCurrentInputType)
return;
267 Layer* layer = mEditor->layers()->currentLayer();
268 if (layer ==
nullptr) {
return; }
272 mEditor->backup(typeName());
274 if (layer->type() == Layer::BITMAP)
277 mScribbleArea->paintBitmapBuffer();
278 mScribbleArea->clearDrawingBuffer();
281 else if (layer->type() == Layer::VECTOR)
284 if (vectorImage ==
nullptr) {
return; }
287 auto selectMan = mEditor->select();
288 selectMan->resetSelectionTransform();
289 for (
int k = 0; k < selectMan->vectorSelection.curve.size(); k++)
291 int curveNumber = selectMan->vectorSelection.curve.at(k);
292 vectorImage->curve(curveNumber).smoothCurve();
294 mEditor->setModified(mEditor->layers()->currentLayerIndex(), mEditor->currentFrame());
298 StrokeTool::pointerReleaseEvent(event);
301void SmudgeTool::drawStroke()
303 if (!mScribbleArea->isLayerPaintable())
return;
305 Layer* layer = mEditor->layers()->currentLayer();
306 if (layer ==
nullptr) {
return; }
308 BitmapImage *sourceImage =
static_cast<LayerBitmap*
>(layer)->getLastBitmapImageAtFrame(mEditor->currentFrame(), 0);
309 if (sourceImage ==
nullptr) {
return; }
311 StrokeTool::drawStroke();
314 for (
int i = 0; i < p.
size(); i++)
316 p[i] = mEditor->view()->mapScreenToCanvas(p[i]);
320 mCurrentWidth = properties.width;
321 qreal brushWidth = mCurrentWidth + 0.0 * properties.feather;
322 qreal offset = qMax(0.0, mCurrentWidth - 0.5 * properties.feather) / brushWidth;
334 int steps = qRound(distance / brushStep);
336 QPointF sourcePoint = mLastBrushPoint;
337 for (
int i = 0; i < steps; i++)
339 targetImage.paste(&mScribbleArea->mTiledBuffer);
340 QPointF targetPoint = mLastBrushPoint + (i + 1) * (brushStep) * (b - mLastBrushPoint) / distance;
341 mScribbleArea->liquifyBrush(&targetImage,
348 if (i == (steps - 1))
350 mLastBrushPoint = targetPoint;
352 sourcePoint = targetPoint;
357 qreal brushStep = 2.0;
359 int steps = qRound(distance / brushStep);
361 QPointF sourcePoint = mLastBrushPoint;
362 for (
int i = 0; i < steps; i++)
364 targetImage.paste(&mScribbleArea->mTiledBuffer);
365 QPointF targetPoint = mLastBrushPoint + (i + 1) * (brushStep) * (b - mLastBrushPoint) / distance;
366 mScribbleArea->blurBrush(&targetImage,
373 if (i == (steps - 1))
375 mLastBrushPoint = targetPoint;
377 sourcePoint = targetPoint;
382QPointF SmudgeTool::offsetFromPressPos()
384 return getCurrentPoint() - getCurrentPressPoint();
void frameModified(int frameNumber)
This should be emitted after modifying the frame content.
Qt::MouseButton button() const
Returns Qt::MouseButton()
Qt::KeyboardModifiers modifiers() const
Returns the modifier created by keyboard while a device was in use.
Qt::MouseButtons buttons() const
Returns Qt::MouseButtons()
void setSelected(int curveNumber, bool YesOrNo)
VectorImage::setSelected.
void applySelectionTransformation()
VectorImage::applySelectionTransformation.
void setSelectionTransformation(QTransform transform)
VectorImage::setSelectionTransformation.
QList< VertexRef > getVerticesCloseTo(QPointF thisPoint, qreal maxDistance)
VectorImage::getVerticesCloseTo.
bool isSelected(int curveNumber)
VectorImage::isSelected.
QList< int > getCurvesCloseTo(QPointF thisPoint, qreal maxDistance)
VectorImage::getCurvesCloseTo.
QHash::iterator insert(const Key &key, const T &value)
qreal length() const const
QRect toRect() const const