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()
const
43void PolylineTool::loadSettings()
47 mPropertyUsed[StrokeToolProperties::WIDTH_VALUE] = { Layer::BITMAP, Layer::VECTOR };
48 mPropertyUsed[PolylineToolProperties::CLOSEDPATH_ENABLED] = { Layer::BITMAP, Layer::VECTOR };
49 mPropertyUsed[PolylineToolProperties::BEZIERPATH_ENABLED] = { Layer::BITMAP };
50 mPropertyUsed[StrokeToolProperties::ANTI_ALIASING_ENABLED] = { Layer::BITMAP };
52 QSettings pencilSettings(PENCIL2D, PENCIL2D);
56 info[StrokeToolProperties::WIDTH_VALUE] = { WIDTH_MIN, WIDTH_MAX, 8.0 };
57 info[PolylineToolProperties::CLOSEDPATH_ENABLED] =
false;
58 info[PolylineToolProperties::BEZIERPATH_ENABLED] =
false;
59 info[StrokeToolProperties::ANTI_ALIASING_ENABLED] =
true;
61 toolProperties().insertProperties(info);
62 toolProperties().loadFrom(typeName(), pencilSettings);
64 if (toolProperties().requireMigration(pencilSettings, ToolProperties::VERSION_1)) {
65 toolProperties().setBaseValue(StrokeToolProperties::WIDTH_VALUE, pencilSettings.
value(
"polylineWidth", 8.0).
toReal());
66 toolProperties().setBaseValue(StrokeToolProperties::ANTI_ALIASING_ENABLED, pencilSettings.
value(
"brushAA",
true).
toBool());
67 toolProperties().setBaseValue(PolylineToolProperties::CLOSEDPATH_ENABLED, pencilSettings.
value(
"closedPolylinePath",
false).
toBool());
69 pencilSettings.
remove(
"polylineWidth");
70 pencilSettings.
remove(
"brushAA");
71 pencilSettings.
remove(
"closedPolylinePath");
80 if (mPoints.
size() > 0)
97void PolylineTool::clearToolData()
99 if (mPoints.
empty()) {
104 emit isActiveChanged(POLYLINE,
false);
107 mScribbleArea->clearDrawingBuffer();
111void PolylineTool::pointerPressEvent(
PointerEvent* event)
113 mInterpolator.pointerPressEvent(
event);
114 if (handleQuickSizing(
event)) {
118 Layer* layer = mEditor->layers()->currentLayer();
122 if (layer->type() == Layer::BITMAP || layer->type() == Layer::VECTOR)
126 if (layer->type() == Layer::VECTOR)
128 VectorImage* vectorImage =
static_cast<LayerVector*
>(layer)->getLastVectorImageAtFrame(mEditor->currentFrame());
129 Q_CHECK_PTR(vectorImage);
131 if (mScribbleArea->makeInvisible() && !mEditor->preference()->isOn(SETTING::INVISIBLE_LINES))
133 mScribbleArea->toggleThinLines();
136 mPoints << getCurrentPoint();
137 emit isActiveChanged(POLYLINE,
true);
141 StrokeTool::pointerPressEvent(
event);
146 mInterpolator.pointerMoveEvent(
event);
147 if (handleQuickSizing(
event)) {
151 Layer* layer = mEditor->layers()->currentLayer();
152 if (layer->type() == Layer::BITMAP || layer->type() == Layer::VECTOR)
154 drawPolyline(mPoints, getCurrentPoint());
157 StrokeTool::pointerMoveEvent(
event);
160void PolylineTool::pointerReleaseEvent(
PointerEvent* event)
162 mInterpolator.pointerReleaseEvent(
event);
163 if (handleQuickSizing(
event)) {
167 StrokeTool::pointerReleaseEvent(
event);
170void PolylineTool::pointerDoubleClickEvent(
PointerEvent* event)
172 mInterpolator.pointerPressEvent(
event);
175 if (mPoints.
size() > 0) {
176 if (mPoints.
last() != getCurrentPoint()) {
178 mPoints << getCurrentPoint();
180 SAVESTATE_ID saveStateId = mEditor->undoRedo()->
createState(UndoRedoRecordType::KEYFRAME_MODIFY);
181 mEditor->backup(typeName());
182 endPolyline(mPoints);
183 mEditor->undoRedo()->
record(saveStateId, typeName());
187void PolylineTool::removeLastPolylineSegment()
189 if (mPoints.
size() > 1)
192 drawPolyline(mPoints, getCurrentPoint());
194 else if (mPoints.
size() == 1)
201bool PolylineTool::keyPressEvent(
QKeyEvent* event)
203 switch (
event->key())
206 mClosedPathOverrideEnabled =
true;
207 drawPolyline(mPoints, getCurrentPoint());
212 if (mPoints.
size() > 0)
215 mPoints << getCurrentPoint();
216 SAVESTATE_ID saveStateId = mEditor->undoRedo()->
createState(UndoRedoRecordType::KEYFRAME_MODIFY);
217 endPolyline(mPoints);
218 mEditor->undoRedo()->
record(saveStateId, typeName());
223 if (mPoints.
size() > 0)
225 removeLastPolylineSegment();
229 if (mPoints.
size() > 0)
240 return BaseTool::keyPressEvent(
event);
243bool PolylineTool::keyReleaseEvent(
QKeyEvent* event)
245 switch (
event->key())
248 mClosedPathOverrideEnabled =
false;
249 drawPolyline(mPoints, getCurrentPoint());
257 return BaseTool::keyReleaseEvent(
event);
262 if (points.
size() > 0)
269 Layer* layer = mEditor->layers()->currentLayer();
273 if (mSettings.bezierPathEnabled())
281 tempPath.
lineTo(endPoint);
284 if ((mSettings.closedPathEnabled() == !mClosedPathOverrideEnabled) && points.
size() > 1)
290 if (layer->type() == Layer::VECTOR)
292 if (mEditor->layers()->currentLayer()->type() == Layer::VECTOR)
294 if (mScribbleArea->makeInvisible() ==
true)
301 pen.setWidth(mSettings.width());
306 mScribbleArea->drawPolyline(tempPath, pen, mSettings.AntiAliasingEnabled());
311void PolylineTool::cancelPolyline()
318 Layer* layer = mEditor->layers()->currentLayer();
320 if (layer->type() == Layer::VECTOR)
323 if (mScribbleArea->makeInvisible() ==
true)
329 curve.setWidth(mSettings.width());
331 curve.setColorNumber(mEditor->color()->frontColorNumber());
332 curve.setVariableWidth(
false);
333 curve.setInvisibility(mScribbleArea->makeInvisible());
335 VectorImage* vectorImage =
static_cast<LayerVector*
>(layer)->getLastVectorImageAtFrame(mEditor->currentFrame());
336 if (vectorImage ==
nullptr) {
return; }
337 vectorImage->
addCurve(curve, mEditor->view()->scaling());
339 if (layer->type() == Layer::BITMAP)
341 drawPolyline(points, points.
last());
344 mScribbleArea->endStroke();
345 mEditor->setModified(mEditor->layers()->currentLayerIndex(), mEditor->currentFrame());
350void PolylineTool::setUseBezier(
bool useBezier)
352 toolProperties().setBaseValue(PolylineToolProperties::BEZIERPATH_ENABLED, useBezier);
353 emit bezierPathEnabledChanged(useBezier);
356void PolylineTool::setClosePath(
bool closePath)
358 toolProperties().setBaseValue(PolylineToolProperties::CLOSEDPATH_ENABLED, closePath);
359 emit closePathChanged(closePath);
QColor frontColor(bool useIndexedColor=true)
frontColor
void updateFrame()
Update frame.
void handleDrawingOnEmptyFrame()
Call this when starting to use a paint tool.
void record(SAVESTATE_ID SaveStateId, const QString &description)
Records the given save state.
SAVESTATE_ID createState(UndoRedoRecordType recordType)
Prepares and returns an save state with common data.
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)
void remove(const QString &key)
QVariant value(const QString &key, const QVariant &defaultValue) const const
bool toBool() const const
qreal toReal(bool *ok) const const