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.useFeather =
false;
57 properties.pressure =
false;
58 properties.invisibility = OFF;
59 properties.preserveAlpha = OFF;
60 properties.closedPolylinePath = settings.value(
"closedPolylinePath").toBool();
61 properties.useAA = settings.value(
"brushAA").toBool();
62 properties.stabilizerLevel = -1;
67void PolylineTool::saveSettings()
71 settings.setValue(
"polyLineWidth", properties.width);
72 settings.setValue(
"brushAA", properties.useAA);
73 settings.setValue(
"closedPolylinePath", properties.closedPolylinePath);
78void PolylineTool::resetToDefault()
85void PolylineTool::setWidth(
const qreal width)
88 properties.width = width;
91void PolylineTool::setFeather(
const qreal feather)
94 properties.feather = -1;
97void PolylineTool::setAA(
const int AA)
100 properties.useAA = AA;
103void PolylineTool::setClosedPath(
const bool closed)
105 BaseTool::setClosedPath(closed);
111 if (mPoints.
size() > 0)
128void PolylineTool::clearToolData()
130 if (mPoints.
empty()) {
135 emit isActiveChanged(POLYLINE,
false);
138 mScribbleArea->clearDrawingBuffer();
142void PolylineTool::pointerPressEvent(
PointerEvent* event)
144 mInterpolator.pointerPressEvent(
event);
145 if (handleQuickSizing(
event)) {
149 Layer* layer = mEditor->layers()->currentLayer();
153 if (layer->type() == Layer::BITMAP || layer->type() == Layer::VECTOR)
157 if (layer->type() == Layer::VECTOR)
159 VectorImage* vectorImage =
static_cast<LayerVector*
>(layer)->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
160 Q_CHECK_PTR(vectorImage);
162 if (mScribbleArea->makeInvisible() && !mEditor->preference()->isOn(SETTING::INVISIBLE_LINES))
164 mScribbleArea->toggleThinLines();
167 mPoints << getCurrentPoint();
168 emit isActiveChanged(POLYLINE,
true);
172 StrokeTool::pointerPressEvent(
event);
177 mInterpolator.pointerMoveEvent(
event);
178 if (handleQuickSizing(
event)) {
182 Layer* layer = mEditor->layers()->currentLayer();
183 if (layer->type() == Layer::BITMAP || layer->type() == Layer::VECTOR)
185 drawPolyline(mPoints, getCurrentPoint());
188 StrokeTool::pointerMoveEvent(
event);
191void PolylineTool::pointerReleaseEvent(
PointerEvent* event)
193 mInterpolator.pointerReleaseEvent(
event);
194 if (handleQuickSizing(
event)) {
198 StrokeTool::pointerReleaseEvent(
event);
201void PolylineTool::pointerDoubleClickEvent(
PointerEvent* event)
203 mInterpolator.pointerPressEvent(
event);
205 mPoints << getCurrentPoint();
207 const UndoSaveState* saveState = mEditor->undoRedo()->
state(UndoRedoRecordType::KEYFRAME_MODIFY);
208 mEditor->backup(typeName());
210 endPolyline(mPoints);
211 mEditor->undoRedo()->
record(saveState, typeName());
214void PolylineTool::removeLastPolylineSegment()
216 if (mPoints.
size() > 1)
219 drawPolyline(mPoints, getCurrentPoint());
221 else if (mPoints.
size() == 1)
228bool PolylineTool::keyPressEvent(
QKeyEvent* event)
230 switch (
event->key())
233 mClosedPathOverrideEnabled =
true;
234 drawPolyline(mPoints, getCurrentPoint());
239 if (mPoints.
size() > 0)
241 const UndoSaveState* saveState = mEditor->undoRedo()->
state(UndoRedoRecordType::KEYFRAME_MODIFY);
242 endPolyline(mPoints);
243 mEditor->undoRedo()->
record(saveState, typeName());
248 if (mPoints.
size() > 0)
250 removeLastPolylineSegment();
254 if (mPoints.
size() > 0)
265 return BaseTool::keyPressEvent(
event);
268bool PolylineTool::keyReleaseEvent(
QKeyEvent* event)
270 switch (
event->key())
273 mClosedPathOverrideEnabled =
false;
274 drawPolyline(mPoints, getCurrentPoint());
282 return BaseTool::keyReleaseEvent(
event);
287 if (points.
size() > 0)
294 Layer* layer = mEditor->layers()->currentLayer();
298 if (properties.bezier_state)
306 tempPath.
lineTo(endPoint);
309 if ((properties.closedPolylinePath == !mClosedPathOverrideEnabled) && points.
size() > 1)
315 if (layer->type() == Layer::VECTOR)
317 if (mEditor->layers()->currentLayer()->type() == Layer::VECTOR)
319 if (mScribbleArea->makeInvisible() ==
true)
326 pen.setWidth(properties.width);
331 mScribbleArea->drawPolyline(tempPath, pen, properties.useAA);
336void PolylineTool::cancelPolyline()
343 Layer* layer = mEditor->layers()->currentLayer();
345 if (layer->type() == Layer::VECTOR)
348 if (mScribbleArea->makeInvisible() ==
true)
354 curve.setWidth(properties.width);
356 curve.setColorNumber(mEditor->color()->frontColorNumber());
357 curve.setVariableWidth(
false);
358 curve.setInvisibility(mScribbleArea->makeInvisible());
360 VectorImage* vectorImage =
static_cast<LayerVector*
>(layer)->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
361 if (vectorImage ==
nullptr) {
return; }
362 vectorImage->
addCurve(curve, mEditor->view()->scaling());
364 if (layer->type() == Layer::BITMAP)
366 drawPolyline(points, points.
last());
369 mScribbleArea->endStroke();
370 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...