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 "toolmanager.h"
31#include "viewmanager.h"
32#include "vectorimage.h"
34#include "scribblearea.h"
41void BucketTool::loadSettings()
43 mPropertyUsed[BucketToolProperties::FILLTHICKNESS_VALUE] = { Layer::VECTOR };
44 mPropertyUsed[BucketToolProperties::COLORTOLERANCE_VALUE] = { Layer::BITMAP };
45 mPropertyUsed[BucketToolProperties::COLORTOLERANCE_ENABLED] = { Layer::BITMAP };
46 mPropertyUsed[BucketToolProperties::FILLEXPAND_VALUE] = { Layer::BITMAP };
47 mPropertyUsed[BucketToolProperties::FILLEXPAND_ENABLED] = { Layer::BITMAP };
48 mPropertyUsed[BucketToolProperties::FILLLAYERREFERENCEMODE_VALUE] = { Layer::BITMAP };
49 mPropertyUsed[BucketToolProperties::FILLMODE_VALUE] = { Layer::BITMAP };
51 QSettings pencilSettings(PENCIL2D, PENCIL2D);
55 info[BucketToolProperties::FILLTHICKNESS_VALUE] = { 1.0, 100.0, 4.0 };
56 info[BucketToolProperties::COLORTOLERANCE_VALUE] = { 1, 100, 32 };
57 info[BucketToolProperties::COLORTOLERANCE_ENABLED] =
false;
58 info[BucketToolProperties::FILLEXPAND_VALUE] = { 1, 25, 2 };
59 info[BucketToolProperties::FILLEXPAND_ENABLED] =
true;
60 info[BucketToolProperties::FILLLAYERREFERENCEMODE_VALUE] = { 0, 1, 0 };
61 info[BucketToolProperties::FILLMODE_VALUE] = { 0, 2, 0 };
63 toolProperties().insertProperties(info);
64 toolProperties().loadFrom(typeName(), pencilSettings);
66 if (toolProperties().requireMigration(pencilSettings, ToolProperties::VERSION_1)) {
67 toolProperties().setBaseValue(BucketToolProperties::FILLTHICKNESS_VALUE, pencilSettings.
value(
"fillThickness", 4.0).
toReal());
68 toolProperties().setBaseValue(BucketToolProperties::COLORTOLERANCE_VALUE, pencilSettings.
value(
"Tolerance", 32).
toInt());
69 toolProperties().setBaseValue(BucketToolProperties::COLORTOLERANCE_ENABLED, pencilSettings.
value(
"BucketToleranceEnabled",
false).
toBool());
70 toolProperties().setBaseValue(BucketToolProperties::FILLEXPAND_VALUE, pencilSettings.
value(
"BucketFillExpand", 2).
toInt());
71 toolProperties().setBaseValue(BucketToolProperties::FILLEXPAND_ENABLED, pencilSettings.
value(
"BucketFillExpandEnabled",
true).
toBool());
72 toolProperties().setBaseValue(BucketToolProperties::FILLLAYERREFERENCEMODE_VALUE, pencilSettings.
value(
"BucketFillReferenceMode", 0).
toInt());
73 toolProperties().setBaseValue(BucketToolProperties::FILLMODE_VALUE, pencilSettings.
value(
"FillMode", 0).
toInt());
75 pencilSettings.
remove(
"fillThickness");
76 pencilSettings.
remove(
"Tolerance");
77 pencilSettings.
remove(
"BucketToleranceEnabled");
78 pencilSettings.
remove(
"BucketFillExpand");
79 pencilSettings.
remove(
"BucketFillExpandEnabled");
80 pencilSettings.
remove(
"BucketFillReferenceMode");
81 pencilSettings.
remove(
"FillMode");
87 if (mEditor->preference()->isOn(SETTING::TOOL_CURSOR))
89 return QCursor(
QPixmap(
":icons/general/cursor-bucket.svg"), -1, 17);
99 mInterpolator.pointerPressEvent(
event);
101 Layer* targetLayer = mEditor->layers()->currentLayer();
103 if (targetLayer->type() != Layer::BITMAP) {
return; }
105 LayerCamera* layerCam = mEditor->layers()->getCameraLayerBelow(mEditor->currentLayerIndex());
107 mUndoSaveState = mEditor->undoRedo()->
state(UndoRedoRecordType::KEYFRAME_MODIFY);
110 layerCam ? layerCam->getViewAtFrame(mEditor->currentFrame()).
inverted().
mapRect(layerCam->getViewRect()) :
QRect(),
122 mInterpolator.pointerMoveEvent(
event);
125 Layer* layer = mEditor->layers()->currentLayer();
126 if (layer->type() == Layer::BITMAP)
129 mFilledOnMove =
true;
134void BucketTool::pointerReleaseEvent(
PointerEvent* event)
136 mInterpolator.pointerReleaseEvent(
event);
138 Layer* layer = editor()->layers()->currentLayer();
139 if (layer ==
nullptr) {
return; }
144 if (layer->type() == Layer::VECTOR) {
145 mEditor->backup(typeName());
148 else if (layer->type() == Layer::BITMAP && !mFilledOnMove)
153 mFilledOnMove =
false;
156void BucketTool::paintBitmap()
158 mBitmapBucket.
paint(getCurrentPoint(), [
this](BucketState progress,
int layerIndex,
int frameIndex)
160 if (progress == BucketState::WillFillTarget)
162 mEditor->backup(layerIndex, frameIndex, typeName());
164 else if (progress == BucketState::DidFillTarget)
166 mEditor->undoRedo()->record(mUndoSaveState, typeName());
167 mEditor->setModified(layerIndex, frameIndex);
172void BucketTool::paintVector(
Layer* layer)
174 mScribbleArea->clearDrawingBuffer();
176 VectorImage* vectorImage =
static_cast<LayerVector*
>(layer)->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
177 if (vectorImage ==
nullptr) {
return; }
190 mEditor->setModified(mEditor->layers()->currentLayerIndex(), mEditor->currentFrame());
193void BucketTool::applyChanges()
195 mScribbleArea->applyTransformedSelection();
198void BucketTool::setStrokeThickness(qreal width)
200 toolProperties().setBaseValue(BucketToolProperties::FILLTHICKNESS_VALUE, width);
201 emit strokeThicknessChanged(width);
204void BucketTool::setColorTolerance(
int tolerance)
206 toolProperties().setBaseValue(BucketToolProperties::COLORTOLERANCE_VALUE, tolerance);
207 emit toleranceChanged(tolerance);
210void BucketTool::setColorToleranceEnabled(
bool enabled)
212 toolProperties().setBaseValue(BucketToolProperties::COLORTOLERANCE_ENABLED, enabled);
213 emit toleranceEnabledChanged(enabled);
216void BucketTool::setFillExpand(
int fillExpandValue)
218 toolProperties().setBaseValue(BucketToolProperties::FILLEXPAND_VALUE, fillExpandValue);
219 emit fillExpandChanged(fillExpandValue);
222void BucketTool::setFillExpandEnabled(
bool enabled)
224 toolProperties().setBaseValue(BucketToolProperties::FILLEXPAND_ENABLED, enabled);
225 emit fillExpandEnabledChanged(enabled);
228void BucketTool::setFillReferenceMode(
int referenceMode)
230 toolProperties().setBaseValue(BucketToolProperties::FILLLAYERREFERENCEMODE_VALUE, referenceMode);
231 emit fillReferenceModeChanged(referenceMode);
234void BucketTool::setFillMode(
int mode)
236 toolProperties().setBaseValue(BucketToolProperties::FILLMODE_VALUE, mode);
237 emit fillModeChanged(mode);
240QPointF BucketTool::getCurrentPoint()
const
242 return mEditor->view()->mapScreenToCanvas(getCurrentPixel());
245QPointF BucketTool::getCurrentPixel()
const
247 return mInterpolator.getCurrentPixel();
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.
const UndoSaveState * state(UndoRedoRecordType recordType) const
Prepares and returns a save state with the given scope.
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)
void remove(const QString &key)
QVariant value(const QString &key, const QVariant &defaultValue) const const
bool toBool() const const
int toInt(bool *ok) const const
qreal toReal(bool *ok) const const