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(), 0);
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);
174 mPoints << getCurrentPoint();
176 const UndoSaveState* saveState = mEditor->undoRedo()->
state(UndoRedoRecordType::KEYFRAME_MODIFY);
177 mEditor->backup(typeName());
179 endPolyline(mPoints);
180 mEditor->undoRedo()->
record(saveState, typeName());
183void PolylineTool::removeLastPolylineSegment()
185 if (mPoints.
size() > 1)
188 drawPolyline(mPoints, getCurrentPoint());
190 else if (mPoints.
size() == 1)
197bool PolylineTool::keyPressEvent(
QKeyEvent* event)
199 switch (
event->key())
202 mClosedPathOverrideEnabled =
true;
203 drawPolyline(mPoints, getCurrentPoint());
208 if (mPoints.
size() > 0)
210 const UndoSaveState* saveState = mEditor->undoRedo()->
state(UndoRedoRecordType::KEYFRAME_MODIFY);
211 endPolyline(mPoints);
212 mEditor->undoRedo()->
record(saveState, typeName());
217 if (mPoints.
size() > 0)
219 removeLastPolylineSegment();
223 if (mPoints.
size() > 0)
234 return BaseTool::keyPressEvent(
event);
237bool PolylineTool::keyReleaseEvent(
QKeyEvent* event)
239 switch (
event->key())
242 mClosedPathOverrideEnabled =
false;
243 drawPolyline(mPoints, getCurrentPoint());
251 return BaseTool::keyReleaseEvent(
event);
256 if (points.
size() > 0)
263 Layer* layer = mEditor->layers()->currentLayer();
267 if (mSettings.bezierPathEnabled())
275 tempPath.
lineTo(endPoint);
278 if ((mSettings.closedPathEnabled() == !mClosedPathOverrideEnabled) && points.
size() > 1)
284 if (layer->type() == Layer::VECTOR)
286 if (mEditor->layers()->currentLayer()->type() == Layer::VECTOR)
288 if (mScribbleArea->makeInvisible() ==
true)
295 pen.setWidth(mSettings.width());
300 mScribbleArea->drawPolyline(tempPath, pen, mSettings.AntiAliasingEnabled());
305void PolylineTool::cancelPolyline()
312 Layer* layer = mEditor->layers()->currentLayer();
314 if (layer->type() == Layer::VECTOR)
317 if (mScribbleArea->makeInvisible() ==
true)
323 curve.setWidth(mSettings.width());
325 curve.setColorNumber(mEditor->color()->frontColorNumber());
326 curve.setVariableWidth(
false);
327 curve.setInvisibility(mScribbleArea->makeInvisible());
329 VectorImage* vectorImage =
static_cast<LayerVector*
>(layer)->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
330 if (vectorImage ==
nullptr) {
return; }
331 vectorImage->
addCurve(curve, mEditor->view()->scaling());
333 if (layer->type() == Layer::BITMAP)
335 drawPolyline(points, points.
last());
338 mScribbleArea->endStroke();
339 mEditor->setModified(mEditor->layers()->currentLayerIndex(), mEditor->currentFrame());
344void PolylineTool::setUseBezier(
bool useBezier)
346 toolProperties().setBaseValue(PolylineToolProperties::BEZIERPATH_ENABLED, useBezier);
347 emit bezierPathEnabledChanged(useBezier);
350void PolylineTool::setClosePath(
bool closePath)
352 toolProperties().setBaseValue(PolylineToolProperties::CLOSEDPATH_ENABLED, closePath);
353 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(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)
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
This is the main undo/redo state structure which is meant to populate whatever states that needs to b...