19 #include "toolmanager.h"
20 #include "scribblearea.h"
21 #include "layervector.h"
22 #include "layermanager.h"
26 MoveTool::MoveTool(QObject *parent) :
31 ToolType MoveTool::type()
36 void MoveTool::loadSettings()
38 properties.width = -1;
39 properties.feather = -1;
40 properties.useFeather =
false;
41 properties.inpolLevel = -1;
42 properties.useAA = -1;
45 QCursor MoveTool::cursor()
47 return Qt::ArrowCursor;
50 void MoveTool::mousePressEvent( QMouseEvent *event )
52 Layer *layer = mEditor->layers()->currentLayer();
53 if ( layer == NULL ) {
return; }
55 if ( event->button() == Qt::LeftButton )
57 pressOperation(event, layer);
61 void MoveTool::mouseReleaseEvent( QMouseEvent* )
64 mScribbleArea->myTransformedSelection = mScribbleArea->myTempTransformedSelection;
67 mScribbleArea->calculateSelectionTransformation();
70 paintTransformedSelection();
74 mScribbleArea->setSelection( mScribbleArea->myTransformedSelection,
true );
75 resetSelectionProperties();
78 void MoveTool::mouseMoveEvent( QMouseEvent *event )
80 Layer* layer = mEditor->layers()->currentLayer();
81 if ( layer == NULL ) {
85 if ( layer->type() != Layer::BITMAP && layer->type() != Layer::VECTOR )
90 if ( event->buttons() & Qt::LeftButton )
92 if( mScribbleArea->somethingSelected )
94 QPointF offset = QPointF(mScribbleArea->mOffset.x(),
95 mScribbleArea->mOffset.y());
97 if ( event->modifiers() == Qt::ShiftModifier )
99 offset = maintainAspectRatio(offset.x(), offset.y());
102 transformSelection(offset.x(), offset.y());
104 mScribbleArea->calculateSelectionTransformation();
105 paintTransformedSelection();
109 mScribbleArea->deselectAll();
110 mScribbleArea->mMoveMode = ScribbleArea::NONE;
115 if ( layer->type() == Layer::VECTOR )
117 onHoverOutlineStroke(layer);
119 mScribbleArea->update();
124 void MoveTool::pressOperation(QMouseEvent* event,
Layer* layer)
126 if ( (layer->type() == Layer::BITMAP || layer->type() == Layer::VECTOR) )
128 mEditor->backup( tr(
"Move" ) );
129 mScribbleArea->setMoveMode( ScribbleArea::MIDDLE );
131 if ( mScribbleArea->somethingSelected )
133 whichTransformationPoint();
136 mScribbleArea->calculateSelectionTransformation();
138 paintTransformedSelection();
141 mScribbleArea->setSelection( mScribbleArea->myTransformedSelection,
true );
142 resetSelectionProperties();
145 if ( mScribbleArea->getMoveMode() == ScribbleArea::MIDDLE )
148 if ( event->modifiers() == Qt::ControlModifier )
150 mScribbleArea->setMoveMode( ScribbleArea::ROTATION );
152 else if (event->modifiers() == Qt::AltModifier )
154 mScribbleArea->setMoveMode(ScribbleArea::SYMMETRY );
157 if ( layer->type() == Layer::VECTOR )
159 actionOnVector(event, layer);
161 if ( !(mScribbleArea->myTransformedSelection.contains( getLastPoint() )) )
169 void MoveTool::actionOnVector(QMouseEvent* event,
Layer* layer)
171 VectorImage *vectorImage = ((
LayerVector *)layer)->getLastVectorImageAtFrame( mEditor->currentFrame(), 0 );
172 if ( mScribbleArea->mClosestCurves.size() > 0 )
175 if ( !vectorImage->isSelected( mScribbleArea->mClosestCurves ) )
177 if ( event->modifiers() != Qt::ShiftModifier )
181 vectorImage->setSelected( mScribbleArea->mClosestCurves,
true );
182 mScribbleArea->setSelection( vectorImage->getSelectionRect(), true );
183 mScribbleArea->update();
188 int areaNumber = vectorImage->getLastAreaNumber( getLastPoint() );
189 if ( areaNumber != -1 )
191 if ( !vectorImage->isAreaSelected( areaNumber ) )
193 if ( event->modifiers() != Qt::ShiftModifier )
197 vectorImage->setAreaSelected( areaNumber,
true );
198 mScribbleArea->setSelection( QRectF( 0, 0, 0, 0 ),
true );
199 mScribbleArea->update();
205 void MoveTool::whichTransformationPoint()
207 QRectF transformPoint = mScribbleArea->myTransformedSelection;
209 if ( QLineF( getLastPoint(), transformPoint.topLeft() ).length() < 10 )
211 mScribbleArea->setMoveMode( ScribbleArea::TOPLEFT );
213 if ( QLineF( getLastPoint(), transformPoint.topRight() ).length() < 10 )
215 mScribbleArea->setMoveMode( ScribbleArea::TOPRIGHT );
217 if ( QLineF( getLastPoint(), transformPoint.bottomLeft() ).length() < 10 )
219 mScribbleArea->setMoveMode( ScribbleArea::BOTTOMLEFT );
221 if ( QLineF( getLastPoint(), transformPoint.bottomRight() ).length() < 10 )
223 mScribbleArea->setMoveMode( ScribbleArea::BOTTOMRIGHT );
227 void MoveTool::transformSelection(qreal offsetX, qreal offsetY)
229 switch ( mScribbleArea->mMoveMode )
231 case ScribbleArea::MIDDLE:
232 if ( QLineF( getLastPressPixel(), getCurrentPixel() ).length() > 4 )
234 mScribbleArea->myTempTransformedSelection =
235 mScribbleArea->myTransformedSelection.translated( QPointF(offsetX, offsetY) );
239 case ScribbleArea::TOPRIGHT:
240 mScribbleArea->myTempTransformedSelection =
241 mScribbleArea->myTransformedSelection.adjusted( 0, offsetY, offsetX, 0 );
244 case ScribbleArea::TOPLEFT:
245 mScribbleArea->myTempTransformedSelection =
246 mScribbleArea->myTransformedSelection.adjusted( offsetX, offsetY, 0, 0 );
249 case ScribbleArea::BOTTOMLEFT:
250 mScribbleArea->myTempTransformedSelection =
251 mScribbleArea->myTransformedSelection.adjusted( offsetX, 0, 0, offsetY );
254 case ScribbleArea::BOTTOMRIGHT:
255 mScribbleArea->myTempTransformedSelection =
256 mScribbleArea->myTransformedSelection.adjusted( 0, 0, offsetX, offsetY );
259 case ScribbleArea::ROTATION:
260 mScribbleArea->myTempTransformedSelection =
261 mScribbleArea->myTransformedSelection;
262 mScribbleArea->myRotatedAngle = getCurrentPixel().x() - getLastPressPixel().x();
267 mScribbleArea->update();
271 QPointF MoveTool::maintainAspectRatio(qreal offsetX, qreal offsetY)
273 qreal factor = mScribbleArea->mySelection.width() / mScribbleArea->mySelection.height();
275 if (mScribbleArea->mMoveMode == ScribbleArea::TOPLEFT || mScribbleArea->mMoveMode == ScribbleArea::BOTTOMRIGHT) {
276 offsetY = offsetX / factor;
278 else if (mScribbleArea->mMoveMode == ScribbleArea::TOPRIGHT || mScribbleArea->mMoveMode == ScribbleArea::BOTTOMLEFT) {
279 offsetY = -(offsetX / factor);
281 else if (mScribbleArea->mMoveMode == ScribbleArea::MIDDLE) {
283 qreal absX = offsetX;
284 if (absX < 0) {absX = -absX;}
286 qreal absY = offsetY;
287 if (absY < 0) {absY = -absY;}
296 return QPointF(offsetX,offsetY);
299 void MoveTool::onHoverOutlineStroke(
Layer* layer)
301 auto layerVector =
static_cast< LayerVector*
>( layer );
302 VectorImage* pVecImg = layerVector->getLastVectorImageAtFrame( mEditor->currentFrame(), 0 );
303 mScribbleArea->mClosestCurves = pVecImg->getCurvesCloseTo( getCurrentPoint(), mScribbleArea->tol / mEditor->view()->scaling() );
306 void MoveTool::cancelChanges()
308 mScribbleArea->cancelTransformedSelection();
311 void MoveTool::applyChanges()
313 mScribbleArea->applyTransformedSelection();
316 void MoveTool::paintTransformedSelection()
318 mScribbleArea->paintTransformedSelection();
321 void MoveTool::leavingThisTool()
325 mScribbleArea->calculateSelectionTransformation();
329 void MoveTool::switchingLayers(){
333 void MoveTool::resetSelectionProperties()
void resetSelectionProperties()
ScribbleArea::resetSelectionProperties should be used whenever translate, rotate, transform...