17#include "erasertool.h"
25#include "scribblearea.h"
26#include "layermanager.h"
27#include "viewmanager.h"
28#include "layervector.h"
29#include "vectorimage.h"
30#include "pointerevent.h"
37ToolType EraserTool::type()
42void EraserTool::loadSettings()
46 mPropertyEnabled[WIDTH] =
true;
47 mPropertyEnabled[USEFEATHER] =
true;
48 mPropertyEnabled[FEATHER] =
true;
49 mPropertyEnabled[USEFEATHER] =
true;
50 mPropertyEnabled[PRESSURE] =
true;
51 mPropertyEnabled[STABILIZATION] =
true;
52 mPropertyEnabled[ANTI_ALIASING] =
true;
56 properties.width = settings.value(
"eraserWidth", 24.0).toDouble();
57 properties.feather = settings.value(
"eraserFeather", 48.0).toDouble();
58 properties.useFeather = settings.value(
"eraserUseFeather",
true).toBool();
59 properties.pressure = settings.value(
"eraserPressure",
true).toBool();
60 properties.invisibility = DISABLED;
61 properties.preserveAlpha = OFF;
62 properties.stabilizerLevel = settings.value(
"stabilizerLevel", StabilizationLevel::NONE).toInt();
63 properties.useAA = settings.value(
"eraserAA", 1).toInt();
65 if (properties.useFeather) { properties.useAA = -1; }
71void EraserTool::resetToDefault()
78 setStabilizerLevel(StabilizationLevel::NONE);
81void EraserTool::setWidth(
const qreal width)
84 properties.width = width;
88 settings.setValue(
"eraserWidth", width);
92void EraserTool::setUseFeather(
const bool usingFeather)
95 properties.useFeather = usingFeather;
99 settings.setValue(
"eraserUseFeather", usingFeather);
103void EraserTool::setFeather(
const qreal feather)
106 properties.feather = feather;
110 settings.setValue(
"eraserFeather", feather);
114void EraserTool::setPressure(
const bool pressure)
117 properties.pressure = pressure;
121 settings.setValue(
"eraserPressure", pressure);
125void EraserTool::setAA(
const int AA)
128 properties.useAA = AA;
132 settings.setValue(
"eraserAA", AA);
136void EraserTool::setStabilizerLevel(
const int level)
138 properties.stabilizerLevel = level;
141 settings.setValue(
"stabilizerLevel", level);
153 mInterpolator.pointerPressEvent(event);
154 if (handleQuickSizing(event)) {
158 startStroke(event->inputType());
159 mLastBrushPoint = getCurrentPoint();
160 mMouseDownPoint = getCurrentPoint();
162 StrokeTool::pointerPressEvent(event);
167 mInterpolator.pointerMoveEvent(event);
168 if (handleQuickSizing(event)) {
174 mCurrentPressure = mInterpolator.getPressure();
176 if (properties.stabilizerLevel != mInterpolator.getStabilizerLevel())
178 mInterpolator.setStabilizerLevel(properties.stabilizerLevel);
182 StrokeTool::pointerMoveEvent(event);
185void EraserTool::pointerReleaseEvent(
PointerEvent *event)
187 mInterpolator.pointerReleaseEvent(event);
188 if (handleQuickSizing(event)) {
192 if (event->inputType() != mCurrentInputType)
return;
194 mEditor->backup(typeName());
196 qreal distance =
QLineF(getCurrentPoint(), mMouseDownPoint).
length();
199 paintAt(mMouseDownPoint);
209 StrokeTool::pointerReleaseEvent(event);
213void EraserTool::paintAt(
QPointF point)
215 Layer* layer = mEditor->layers()->currentLayer();
216 if (layer->type() == Layer::BITMAP)
218 qreal pressure = (properties.pressure) ? mCurrentPressure : 1.0;
219 qreal opacity = (properties.pressure) ? (mCurrentPressure * 0.5) : 1.0;
220 qreal brushWidth = properties.width * pressure;
221 mCurrentWidth = brushWidth;
223 mScribbleArea->drawBrush(point,
226 QColor(255, 255, 255, 255),
229 properties.useFeather,
230 properties.useAA == ON);
234void EraserTool::drawStroke()
236 StrokeTool::drawStroke();
239 Layer* layer = mEditor->layers()->currentLayer();
241 if (layer->type() == Layer::BITMAP)
243 qreal pressure = (properties.pressure) ? mCurrentPressure : 1.0;
244 qreal opacity = (properties.pressure) ? (mCurrentPressure * 0.5) : 1.0;
245 qreal brushWidth = properties.width * pressure;
246 mCurrentWidth = brushWidth;
248 qreal brushStep = (0.5 * brushWidth);
249 brushStep = qMax(1.0, brushStep);
257 int steps = qRound(distance / brushStep);
259 for (
int i = 0; i < steps; i++)
261 QPointF point = mLastBrushPoint + (i + 1) * brushStep * (getCurrentPoint() - mLastBrushPoint) / distance;
263 mScribbleArea->drawBrush(point,
269 properties.useFeather,
270 properties.useAA == ON);
271 if (i == (steps - 1))
273 mLastBrushPoint = getCurrentPoint();
277 else if (layer->type() == Layer::VECTOR)
279 mCurrentWidth = properties.width;
280 if (properties.pressure)
282 mCurrentWidth = (mCurrentWidth + (mInterpolator.getPressure() * mCurrentWidth)) * 0.5;
284 qreal brushWidth = mCurrentWidth;
299void EraserTool::removeVectorPaint()
301 Layer* layer = mEditor->layers()->currentLayer();
302 if (layer->type() == Layer::VECTOR)
304 mScribbleArea->clearDrawingBuffer();
305 VectorImage* vectorImage =
static_cast<LayerVector*
>(layer)->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
306 if (vectorImage ==
nullptr) {
return; }
312 mEditor->setModified(mEditor->layers()->currentLayerIndex(), mEditor->currentFrame());
316void EraserTool::updateStrokes()
318 Layer* layer = mEditor->layers()->currentLayer();
319 if (layer->type() == Layer::BITMAP || layer->type() == Layer::VECTOR)
324 if (layer->type() == Layer::VECTOR)
326 qreal radius = properties.width / 2;
328 VectorImage* currKey =
static_cast<VectorImage*
>(layer->getLastKeyFrameAtPosition(mEditor->currentFrame()));
330 for (
auto nearbyVertice : nearbyVertices)
Qt::MouseButtons buttons() const
Returns Qt::MouseButtons()
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
CompositionMode_SourceOver