18#include "polylinetool.h"
22#include "scribblearea.h"
24#include "layermanager.h"
25#include "colormanager.h"
26#include "viewmanager.h"
27#include "undoredomanager.h"
28#include "pointerevent.h"
29#include "layervector.h"
30#include "layerbitmap.h"
31#include "vectorimage.h"
38ToolType PolylineTool::type()
43void PolylineTool::loadSettings()
47 mPropertyEnabled[WIDTH] =
true;
48 mPropertyEnabled[BEZIER] =
true;
49 mPropertyEnabled[CLOSEDPATH] =
true;
50 mPropertyEnabled[ANTI_ALIASING] =
true;
54 properties.width = settings.value(
"polyLineWidth", 8.0).toDouble();
55 properties.feather = -1;
56 properties.pressure =
false;
57 properties.invisibility = OFF;
58 properties.preserveAlpha = OFF;
59 properties.closedPolylinePath = settings.value(
"closedPolylinePath").toBool();
60 properties.useAA = settings.value(
"brushAA").toBool();
61 properties.stabilizerLevel = -1;
66void PolylineTool::saveSettings()
70 settings.setValue(
"polyLineWidth", properties.width);
71 settings.setValue(
"brushAA", properties.useAA);
72 settings.setValue(
"closedPolylinePath", properties.closedPolylinePath);
77void PolylineTool::resetToDefault()
84void PolylineTool::setWidth(
const qreal width)
87 properties.width = width;
90void PolylineTool::setFeather(
const qreal feather)
93 properties.feather = -1;
96void PolylineTool::setAA(
const int AA)
99 properties.useAA = AA;
102void PolylineTool::setClosedPath(
const bool closed)
104 BaseTool::setClosedPath(closed);
110 if (mPoints.
size() > 0)
127void PolylineTool::clearToolData()
129 if (mPoints.
empty()) {
134 emit isActiveChanged(POLYLINE,
false);
137 mScribbleArea->clearDrawingBuffer();
141void PolylineTool::pointerPressEvent(
PointerEvent* event)
143 mInterpolator.pointerPressEvent(
event);
144 if (handleQuickSizing(
event)) {
148 Layer* layer = mEditor->layers()->currentLayer();
152 if (layer->type() == Layer::BITMAP || layer->type() == Layer::VECTOR)
156 if (layer->type() == Layer::VECTOR)
158 VectorImage* vectorImage =
static_cast<LayerVector*
>(layer)->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
159 Q_CHECK_PTR(vectorImage);
161 if (mScribbleArea->makeInvisible() && !mEditor->preference()->isOn(SETTING::INVISIBLE_LINES))
163 mScribbleArea->toggleThinLines();
166 mPoints << getCurrentPoint();
167 emit isActiveChanged(POLYLINE,
true);
171 StrokeTool::pointerPressEvent(
event);
176 mInterpolator.pointerMoveEvent(
event);
177 if (handleQuickSizing(
event)) {
181 Layer* layer = mEditor->layers()->currentLayer();
182 if (layer->type() == Layer::BITMAP || layer->type() == Layer::VECTOR)
184 drawPolyline(mPoints, getCurrentPoint());
187 StrokeTool::pointerMoveEvent(
event);
190void PolylineTool::pointerReleaseEvent(
PointerEvent* event)
192 mInterpolator.pointerReleaseEvent(
event);
193 if (handleQuickSizing(
event)) {
197 StrokeTool::pointerReleaseEvent(
event);
200void PolylineTool::pointerDoubleClickEvent(
PointerEvent* event)
202 mInterpolator.pointerPressEvent(
event);
204 mPoints << getCurrentPoint();
206 const UndoSaveState* saveState = mEditor->undoRedo()->
state(UndoRedoRecordType::KEYFRAME_MODIFY);
207 mEditor->backup(typeName());
209 endPolyline(mPoints);
210 mEditor->undoRedo()->
record(saveState, typeName());
213void PolylineTool::removeLastPolylineSegment()
215 if (mPoints.
size() > 1)
218 drawPolyline(mPoints, getCurrentPoint());
220 else if (mPoints.
size() == 1)
227bool PolylineTool::keyPressEvent(
QKeyEvent* event)
229 switch (
event->key())
232 mClosedPathOverrideEnabled =
true;
233 drawPolyline(mPoints, getCurrentPoint());
238 if (mPoints.
size() > 0)
240 const UndoSaveState* saveState = mEditor->undoRedo()->
state(UndoRedoRecordType::KEYFRAME_MODIFY);
241 endPolyline(mPoints);
242 mEditor->undoRedo()->
record(saveState, typeName());
247 if (mPoints.
size() > 0)
249 removeLastPolylineSegment();
253 if (mPoints.
size() > 0)
264 return BaseTool::keyPressEvent(
event);
267bool PolylineTool::keyReleaseEvent(
QKeyEvent* event)
269 switch (
event->key())
272 mClosedPathOverrideEnabled =
false;
273 drawPolyline(mPoints, getCurrentPoint());
281 return BaseTool::keyReleaseEvent(
event);
286 if (points.
size() > 0)
293 Layer* layer = mEditor->layers()->currentLayer();
297 if (properties.bezier_state)
305 tempPath.
lineTo(endPoint);
308 if ((properties.closedPolylinePath == !mClosedPathOverrideEnabled) && points.
size() > 1)
314 if (layer->type() == Layer::VECTOR)
316 if (mEditor->layers()->currentLayer()->type() == Layer::VECTOR)
318 if (mScribbleArea->makeInvisible() ==
true)
325 pen.setWidth(properties.width);
330 mScribbleArea->drawPolyline(tempPath, pen, properties.useAA);
335void PolylineTool::cancelPolyline()
342 Layer* layer = mEditor->layers()->currentLayer();
344 if (layer->type() == Layer::VECTOR)
347 if (mScribbleArea->makeInvisible() ==
true)
353 curve.setWidth(properties.width);
355 curve.setColorNumber(mEditor->color()->frontColorNumber());
356 curve.setVariableWidth(
false);
357 curve.setInvisibility(mScribbleArea->makeInvisible());
359 VectorImage* vectorImage =
static_cast<LayerVector*
>(layer)->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
360 if (vectorImage ==
nullptr) {
return; }
361 vectorImage->
addCurve(curve, mEditor->view()->scaling());
363 if (layer->type() == Layer::BITMAP)
365 drawPolyline(points, points.
last());
368 mScribbleArea->endStroke();
369 mEditor->setModified(mEditor->layers()->currentLayerIndex(), mEditor->currentFrame());
QColor frontColor(bool useIndexedColor=true)
frontColor
void updateFrame()
Update frame.
void handleDrawingOnEmptyFrame()
Call this when starting to use a paint tool.
void record(const UndoSaveState *&undoState, const QString &description)
Records the given save state.
const UndoSaveState * state(UndoRedoRecordType recordType) const
Prepares and returns a save state with the given scope.
void deselectAll()
VectorImage::deselectAll.
void addCurve(BezierCurve &newCurve, qreal factor, bool interacts=true)
VectorImage::addCurve.
QHash::iterator insert(const Key &key, const T &value)
bool isEmpty() const const
virtual bool event(QEvent *e)
void lineTo(const QPointF &endPoint)
This is the main undo/redo state structure which is meant to populate whatever states that needs to b...