17#include "erasertool.h"
25#include "scribblearea.h"
26#include "layermanager.h"
27#include "viewmanager.h"
28#include "undoredomanager.h"
29#include "layervector.h"
30#include "vectorimage.h"
31#include "pointerevent.h"
38ToolType EraserTool::type()
43void EraserTool::loadSettings()
47 mPropertyEnabled[WIDTH] =
true;
48 mPropertyEnabled[USEFEATHER] =
true;
49 mPropertyEnabled[FEATHER] =
true;
50 mPropertyEnabled[USEFEATHER] =
true;
51 mPropertyEnabled[PRESSURE] =
true;
52 mPropertyEnabled[STABILIZATION] =
true;
53 mPropertyEnabled[ANTI_ALIASING] =
true;
57 properties.width = settings.value(
"eraserWidth", 24.0).toDouble();
58 properties.feather = settings.value(
"eraserFeather", 48.0).toDouble();
59 properties.useFeather = settings.value(
"eraserUseFeather",
true).toBool();
60 properties.pressure = settings.value(
"eraserPressure",
true).toBool();
61 properties.invisibility = DISABLED;
62 properties.preserveAlpha = OFF;
63 properties.stabilizerLevel = settings.value(
"stabilizerLevel", StabilizationLevel::NONE).toInt();
64 properties.useAA = settings.value(
"eraserAA", 1).toInt();
66 if (properties.useFeather) { properties.useAA = -1; }
72void EraserTool::saveSettings()
76 settings.setValue(
"eraserWidth", properties.width);
77 settings.setValue(
"eraserFeather", properties.feather);
78 settings.setValue(
"eraserUseFeather", properties.useFeather);
79 settings.setValue(
"eraserPressure", properties.pressure);
80 settings.setValue(
"eraserAA", properties.useAA);
81 settings.setValue(
"stabilizerLevel", properties.stabilizerLevel);
86void EraserTool::resetToDefault()
93 setStabilizerLevel(StabilizationLevel::NONE);
96void EraserTool::setWidth(
const qreal width)
99 properties.width = width;
102void EraserTool::setUseFeather(
const bool usingFeather)
105 properties.useFeather = usingFeather;
108void EraserTool::setFeather(
const qreal feather)
111 properties.feather = feather;
114void EraserTool::setPressure(
const bool pressure)
117 properties.pressure = pressure;
120void EraserTool::setAA(
const int AA)
123 properties.useAA = AA;
126void EraserTool::setStabilizerLevel(
const int level)
128 properties.stabilizerLevel = level;
139 mInterpolator.pointerPressEvent(
event);
140 if (handleQuickSizing(
event)) {
144 startStroke(
event->inputType());
145 mLastBrushPoint = getCurrentPoint();
146 mMouseDownPoint = getCurrentPoint();
148 StrokeTool::pointerPressEvent(
event);
153 mInterpolator.pointerMoveEvent(
event);
154 if (handleQuickSizing(
event)) {
160 mCurrentPressure = mInterpolator.getPressure();
162 if (properties.stabilizerLevel != mInterpolator.getStabilizerLevel())
164 mInterpolator.setStabilizerLevel(properties.stabilizerLevel);
168 StrokeTool::pointerMoveEvent(
event);
171void EraserTool::pointerReleaseEvent(
PointerEvent *event)
173 mInterpolator.pointerReleaseEvent(
event);
174 if (handleQuickSizing(
event)) {
178 if (
event->inputType() != mCurrentInputType)
return;
180 mEditor->backup(typeName());
182 qreal distance =
QLineF(getCurrentPoint(), mMouseDownPoint).
length();
185 paintAt(mMouseDownPoint);
195 StrokeTool::pointerReleaseEvent(
event);
199void EraserTool::paintAt(
QPointF point)
201 Layer* layer = mEditor->layers()->currentLayer();
202 if (layer->type() == Layer::BITMAP)
204 qreal pressure = (properties.pressure) ? mCurrentPressure : 1.0;
205 qreal opacity = (properties.pressure) ? (mCurrentPressure * 0.5) : 1.0;
206 qreal brushWidth = properties.width * pressure;
207 mCurrentWidth = brushWidth;
209 mScribbleArea->drawBrush(point,
212 QColor(255, 255, 255, 255),
215 properties.useFeather,
216 properties.useAA == ON);
220void EraserTool::drawStroke()
222 StrokeTool::drawStroke();
225 Layer* layer = mEditor->layers()->currentLayer();
227 if (layer->type() == Layer::BITMAP)
229 qreal pressure = (properties.pressure) ? mCurrentPressure : 1.0;
230 qreal opacity = (properties.pressure) ? (mCurrentPressure * 0.5) : 1.0;
231 qreal brushWidth = properties.width * pressure;
232 mCurrentWidth = brushWidth;
234 qreal brushStep = (0.5 * brushWidth);
235 brushStep = qMax(1.0, brushStep);
243 int steps = qRound(distance / brushStep);
245 for (
int i = 0; i < steps; i++)
247 QPointF point = mLastBrushPoint + (i + 1) * brushStep * (getCurrentPoint() - mLastBrushPoint) / distance;
249 mScribbleArea->drawBrush(point,
255 properties.useFeather,
256 properties.useAA == ON);
257 if (i == (steps - 1))
259 mLastBrushPoint = getCurrentPoint();
263 else if (layer->type() == Layer::VECTOR)
265 mCurrentWidth = properties.width;
266 if (properties.pressure)
268 mCurrentWidth = (mCurrentWidth + (mInterpolator.getPressure() * mCurrentWidth)) * 0.5;
270 qreal brushWidth = mCurrentWidth;
285void EraserTool::removeVectorPaint()
287 Layer* layer = mEditor->layers()->currentLayer();
288 if (layer->type() == Layer::VECTOR)
290 mScribbleArea->clearDrawingBuffer();
291 VectorImage* vectorImage =
static_cast<LayerVector*
>(layer)->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
292 if (vectorImage ==
nullptr) {
return; }
298 mEditor->setModified(mEditor->layers()->currentLayerIndex(), mEditor->currentFrame());
302void EraserTool::updateStrokes()
304 Layer* layer = mEditor->layers()->currentLayer();
305 if (layer->type() == Layer::BITMAP || layer->type() == Layer::VECTOR)
310 if (layer->type() == Layer::VECTOR)
312 qreal radius = properties.width / 2;
314 VectorImage* currKey =
static_cast<VectorImage*
>(layer->getLastKeyFrameAtPosition(mEditor->currentFrame()));
316 for (
auto nearbyVertice : nearbyVertices)
void setSelected(int curveNumber, bool YesOrNo)
VectorImage::setSelected.
void deleteSelectedPoints()
VectorImage::deleteSelectedPoints.
QList< VertexRef > getVerticesCloseTo(QPointF thisPoint, qreal maxDistance)
VectorImage::getVerticesCloseTo.
QHash::iterator insert(const Key &key, const T &value)
qreal length() const const
virtual bool event(QEvent *e)
CompositionMode_SourceOver