18 #include "polylinetool.h"
21 #include "scribblearea.h"
23 #include "strokemanager.h"
24 #include "layermanager.h"
26 #include "layervector.h"
27 #include "layerbitmap.h"
30 PolylineTool::PolylineTool( QObject *parent ) :
35 ToolType PolylineTool::type()
40 void PolylineTool::loadSettings()
42 m_enabledProperties[WIDTH] =
true;
43 m_enabledProperties[BEZIER] =
true;
44 m_enabledProperties[ANTI_ALIASING] =
true;
46 QSettings settings( PENCIL2D, PENCIL2D );
48 properties.width = settings.value(
"polyLineWidth" ).toDouble();
49 properties.feather = -1;
50 properties.pressure = 0;
51 properties.invisibility = OFF;
52 properties.preserveAlpha = OFF;
53 properties.useAA = settings.value(
"brushAA").toBool();
54 properties.inpolLevel = -1;
57 if ( properties.width <= 0 )
63 void PolylineTool::setWidth(
const qreal width)
66 properties.width = width;
69 QSettings settings( PENCIL2D, PENCIL2D );
70 settings.setValue(
"polyLineWidth", width);
74 void PolylineTool::setFeather(
const qreal feather )
77 properties.feather = -1;
80 void PolylineTool::setAA(
const int AA )
83 properties.useAA = AA;
86 QSettings settings( PENCIL2D, PENCIL2D );
87 settings.setValue(
"brushAA", AA);
91 QCursor PolylineTool::cursor()
93 return Qt::CrossCursor;
96 void PolylineTool::clear()
101 void PolylineTool::mousePressEvent( QMouseEvent *event )
103 Layer* layer = mEditor->layers()->currentLayer();
105 if ( event->button() == Qt::LeftButton )
107 if ( layer->type() == Layer::BITMAP || layer->type() == Layer::VECTOR )
109 if ( mPoints.size() == 0 )
111 mEditor->backup( tr(
"Polyline" ) );
114 if ( layer->type() == Layer::VECTOR )
116 ( (
LayerVector * )layer )->getLastVectorImageAtFrame( mEditor->currentFrame(), 0 )->deselectAll();
117 if ( mScribbleArea->makeInvisible() && !mEditor->preference()->isOn(SETTING::INVISIBLE_LINES) )
119 mScribbleArea->toggleThinLines();
122 mPoints << getCurrentPoint();
123 mScribbleArea->setAllDirty();
128 void PolylineTool::mouseReleaseEvent( QMouseEvent *event )
133 void PolylineTool::mouseMoveEvent( QMouseEvent *event )
136 Layer* layer = mEditor->layers()->currentLayer();
138 if ( layer->type() == Layer::BITMAP || layer->type() == Layer::VECTOR )
140 drawPolyline( mPoints, getCurrentPoint() );
144 void PolylineTool::mouseDoubleClickEvent( QMouseEvent *event )
147 if ( BezierCurve::eLength( m_pStrokeManager->getLastPressPixel() -
event->pos() ) < 2.0 )
149 endPolyline( mPoints );
154 bool PolylineTool::keyPressEvent( QKeyEvent *event )
156 switch ( event->key() ) {
158 if ( mPoints.size() > 0 )
160 endPolyline( mPoints );
167 if ( mPoints.size() > 0 ) {
181 void PolylineTool::drawPolyline(
QList<QPointF> points, QPointF endPoint)
183 if ( !mScribbleArea->areLayersSane() )
188 if ( points.size() > 0 )
190 QPen pen( mEditor->color()->frontColor(),
195 Layer* layer = mEditor->layers()->currentLayer();
198 QPainterPath tempPath;
199 if ( properties.bezier_state )
205 tempPath =
BezierCurve( points ).getStraightPath();
207 tempPath.lineTo( endPoint );
210 if ( layer->type() == Layer::VECTOR )
212 if ( mEditor->layers()->currentLayer()->type() == Layer::VECTOR )
214 tempPath = mEditor->view()->mapCanvasToScreen( tempPath );
215 if ( mScribbleArea->makeInvisible() == true )
218 pen.setStyle( Qt::DotLine );
222 pen.setWidth(properties.width * mEditor->view()->scaling() );
227 mScribbleArea->drawPolyline(tempPath, pen, properties.useAA);
232 void PolylineTool::cancelPolyline()
235 mScribbleArea->clearBitmapBuffer();
236 mScribbleArea->updateCurrentFrame();
241 if ( !mScribbleArea->areLayersSane() )
246 Layer* layer = mEditor->layers()->currentLayer();
248 if ( layer->type() == Layer::VECTOR )
251 if ( mScribbleArea->makeInvisible() == true )
257 curve.setWidth( properties.width );
259 curve.setColourNumber( mEditor->color()->frontColorNumber() );
260 curve.setVariableWidth(
false );
261 curve.setInvisibility( mScribbleArea->makeInvisible() );
263 ( (
LayerVector * )layer )->getLastVectorImageAtFrame( mEditor->currentFrame(), 0 )->addCurve( curve, mEditor->view()->scaling() );
265 if ( layer->type() == Layer::BITMAP )
267 drawPolyline( points, points.last() );
268 BitmapImage *bitmapImage = ( (
LayerBitmap * )layer )->getLastBitmapImageAtFrame( mEditor->currentFrame(), 0 );
269 bitmapImage->paste( mScribbleArea->mBufferImg );
271 mScribbleArea->mBufferImg->clear();
272 mScribbleArea->setModified( mEditor->layers()->currentLayerIndex(), mEditor->currentFrame() );