17#include "buckettool.h"
22#include "pointerevent.h"
25#include "layervector.h"
26#include "layerbitmap.h"
27#include "layercamera.h"
28#include "layermanager.h"
29#include "colormanager.h"
30#include "viewmanager.h"
31#include "vectorimage.h"
33#include "scribblearea.h"
40ToolType BucketTool::type()
45void BucketTool::loadSettings()
47 mPropertyEnabled[TOLERANCE] =
true;
48 mPropertyEnabled[WIDTH] =
true;
49 mPropertyEnabled[FILL_MODE] =
true;
53 properties.width = settings.value(
"fillThickness", 4.0).toDouble();
54 properties.feather = 10;
55 properties.stabilizerLevel = StabilizationLevel::NONE;
56 properties.useAA = DISABLED;
57 properties.tolerance = settings.value(SETTING_BUCKET_TOLERANCE, 32.0).toDouble();
58 properties.toleranceEnabled = settings.value(SETTING_BUCKET_TOLERANCE_ON,
false).toBool();
60 properties.bucketFillExpand = settings.value(SETTING_BUCKET_FILL_EXPAND, 2.0).toInt();
61 properties.bucketFillExpandEnabled = settings.value(SETTING_BUCKET_FILL_EXPAND_ON,
true).toBool();
62 properties.bucketFillReferenceMode = settings.value(SETTING_BUCKET_FILL_REFERENCE_MODE, 0).toInt();
63 properties.fillMode = settings.value(SETTING_FILL_MODE, 0).toInt();
66void BucketTool::saveSettings()
70 settings.setValue(
"fillThickness", properties.width);
71 settings.setValue(SETTING_BUCKET_TOLERANCE, properties.tolerance);
72 settings.setValue(SETTING_BUCKET_TOLERANCE_ON, properties.toleranceEnabled);
73 settings.setValue(SETTING_BUCKET_FILL_EXPAND, properties.bucketFillExpand);
74 settings.setValue(SETTING_BUCKET_FILL_EXPAND_ON, properties.bucketFillExpandEnabled);
75 settings.setValue(SETTING_BUCKET_FILL_REFERENCE_MODE, properties.bucketFillReferenceMode);
76 settings.setValue(SETTING_FILL_MODE, properties.fillMode);
81void BucketTool::resetToDefault()
87 setFillExpandEnabled(
true);
88 setToleranceEnabled(
false);
89 setFillReferenceMode(0);
94 if (mEditor->preference()->isOn(SETTING::TOOL_CURSOR))
96 return QCursor(
QPixmap(
":icons/general/cursor-bucket.svg"), -1, 17);
104void BucketTool::setTolerance(
const int tolerance)
107 properties.tolerance = tolerance;
118 properties.width = width;
121void BucketTool::setFillMode(
int mode)
124 properties.fillMode = mode;
127void BucketTool::setToleranceEnabled(
const bool enabled)
129 properties.toleranceEnabled = enabled;
133void BucketTool::setFillExpandEnabled(
const bool enabled)
135 properties.bucketFillExpandEnabled = enabled;
139void BucketTool::setFillExpand(
const int fillExpandValue)
141 properties.bucketFillExpand = fillExpandValue;
144void BucketTool::setFillReferenceMode(
int referenceMode)
146 properties.bucketFillReferenceMode = referenceMode;
151 mInterpolator.pointerPressEvent(
event);
152 startStroke(
event->inputType());
154 Layer* targetLayer = mEditor->layers()->currentLayer();
156 if (targetLayer->type() != Layer::BITMAP) {
return; }
158 LayerCamera* layerCam = mEditor->layers()->getCameraLayerBelow(mEditor->currentLayerIndex());
162 layerCam ? layerCam->getViewAtFrame(mEditor->currentFrame()).
inverted().
mapRect(layerCam->getViewRect()) :
QRect(),
174 mInterpolator.pointerMoveEvent(
event);
177 Layer* layer = mEditor->layers()->currentLayer();
178 if (layer->type() == Layer::VECTOR)
182 else if (layer->type() == Layer::BITMAP)
185 mFilledOnMove =
true;
190void BucketTool::pointerReleaseEvent(
PointerEvent* event)
192 mInterpolator.pointerReleaseEvent(
event);
193 if (
event->inputType() != mCurrentInputType)
return;
195 Layer* layer = editor()->layers()->currentLayer();
196 if (layer ==
nullptr) {
return; }
201 if (layer->type() == Layer::VECTOR) {
202 mEditor->backup(typeName());
205 else if (layer->type() == Layer::BITMAP && !mFilledOnMove)
210 mFilledOnMove =
false;
215void BucketTool::paintBitmap()
217 mBitmapBucket.
paint(getCurrentPoint(), [
this](BucketState progress,
int layerIndex,
int frameIndex)
219 if (progress == BucketState::WillFillTarget)
221 mEditor->backup(layerIndex, frameIndex, typeName());
223 else if (progress == BucketState::DidFillTarget)
225 mEditor->setModified(layerIndex, frameIndex);
230void BucketTool::paintVector(
Layer* layer)
232 mScribbleArea->clearDrawingBuffer();
234 VectorImage* vectorImage =
static_cast<LayerVector*
>(layer)->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
235 if (vectorImage ==
nullptr) {
return; }
248 mEditor->setModified(mEditor->layers()->currentLayerIndex(), mEditor->currentFrame());
251void BucketTool::applyChanges()
253 mScribbleArea->applyTransformedSelection();
256void BucketTool::drawStroke()
258 StrokeTool::drawStroke();
260 if (properties.stabilizerLevel != mInterpolator.getStabilizerLevel())
262 mInterpolator.setStabilizerLevel(properties.stabilizerLevel);
267 Layer* layer = mEditor->layers()->currentLayer();
269 if (layer->type() == Layer::VECTOR)
275 mCurrentWidth * mEditor->view()->scaling(),
283 path.cubicTo(p[1], p[2], p[3]);
void paint(const QPointF &updatedPoint, std::function< void(BucketState, int, int)> progress)
Will paint at the given point, given that it makes sense.
QColor frontColor(bool useIndexedColor=true)
frontColor
void invalidatePainterCaches()
Invalidate the layer pixmap and camera painter caches.
void applyColorToSelectedArea(int colorNumber)
VectorImage::applyColorToSelectedArea.
void fillSelectedPath(int color)
VectorImage::fillSelectedPath.
bool isPathFilled()
VectorImage::isPathFilled.
void applyColorToSelectedCurve(int colorNumber)
VectorImage::applyColorToSelectedCurve.
void applyWidthToSelection(qreal width)
VectorImage::applyWidthToSelection.
virtual bool event(QEvent *e)