diff --git a/Commands.cpp b/Commands.cpp index c0b8cb0..a6fa151 100644 --- a/Commands.cpp +++ b/Commands.cpp @@ -106,31 +106,32 @@ bool MoveVertexCommand::mergeWith(const QUndoCommand* other) } -MoveShapesCommand::MoveShapesCommand(MapperGLCanvas *mapperGLCanvas, QMouseEvent *event, const QPointF &point, QUndoCommand *parent) : - QUndoCommand(parent) +TranslateShapeCommand::TranslateShapeCommand(MapperGLCanvas *canvas, TransformShapeOption option, const QPointF &translation, QUndoCommand *parent) + : TransformShapeCommand(canvas, option, parent), + _translation(translation) { setText(QObject::tr("Move shape")); - m_mapperGLCanvas = mapperGLCanvas; - m_shape = m_mapperGLCanvas->getCurrentShape().data(); - m_event = event; - newPosition = point; } -void MoveShapesCommand::undo() +int TranslateShapeCommand::id() const { return (_option == STEP ? CMD_KEY_TRANSLATE_SHAPE : CMD_MOUSE_TRANSLATE_SHAPE); } + +bool TranslateShapeCommand::mergeWith(const QUndoCommand* other) { - m_shape->translate(oldPosition.x(), oldPosition.y()); - m_mapperGLCanvas->update(); -// emit m_mapperGLCanvas->shapeChanged(m_mapperGLCanvas->getCurrentShape()); + if (!TransformShapeCommand::mergeWith(other)) + return false; + + const TranslateShapeCommand* cmd = static_cast(other); + + // Update translation. + _translation += cmd->_translation; + _option = cmd->_option; + return true; } -void MoveShapesCommand::redo() +void TranslateShapeCommand::_doTransform(MShape::ptr shape) { - m_shape->translate(m_event->x() - newPosition.x(), m_event->y() - newPosition.y()); - m_mapperGLCanvas->update(); -// emit m_mapperGLCanvas->shapeChanged(m_mapperGLCanvas->getCurrentShape()); - - oldPosition.setX(newPosition.x() - m_event->x()); - oldPosition.setY(newPosition.y() - m_event->y()); + // Apply translation. + shape->translate(_translation); } @@ -156,3 +157,4 @@ void DeleteMappingCommand::redo() m_mappingPtr = m_mainWindow->getMappingManager().getMappingById(m_mappingId); m_mainWindow->deleteMapping(m_mappingId); } + diff --git a/Commands.h b/Commands.h index 37cc32f..106a0b7 100644 --- a/Commands.h +++ b/Commands.h @@ -29,6 +29,8 @@ enum CommandId { CMD_KEY_MOVE_VERTEX, CMD_MOUSE_MOVE_VERTEX, + CMD_KEY_TRANSLATE_SHAPE, + CMD_MOUSE_TRANSLATE_SHAPE, }; class AddShapesCommand : public QUndoCommand @@ -91,12 +93,20 @@ protected: QPointF _vertexPosition; }; +class TranslateShapeCommand : public TransformShapeCommand +{ +public: + TranslateShapeCommand(MapperGLCanvas *canvas, TransformShapeOption option, const QPointF &translation, QUndoCommand *parent = 0); + + int id() const; + bool mergeWith(const QUndoCommand* other); + +protected: + // Perform the actual transformation on the shape. + virtual void _doTransform(MShape::ptr shape); private: - MapperGLCanvas *m_mapperGLCanvas; - MShape *m_shape; - QMouseEvent *m_event; - QPointF newPosition, oldPosition; + QPointF _translation; }; class DeleteMappingCommand : public QUndoCommand diff --git a/MainWindow.cpp b/MainWindow.cpp index 114b437..244dade 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -1109,9 +1109,9 @@ void MainWindow::cloneMappingItem(uid mappingId) // Scaling of duplicated mapping if (shapeType == "quad" || shapeType == "mesh") - shapePtr->translate(20, 20); + shapePtr->translate(QPointF(20, 20)); else - shapePtr->translate(0, 20); + shapePtr->translate(QPointF(0, 20)); // Create new duplicated mapping item Mapping::ptr clonedMapping(mapping); diff --git a/MapperGLCanvas.cpp b/MapperGLCanvas.cpp index d14d9bb..b48eaa5 100644 --- a/MapperGLCanvas.cpp +++ b/MapperGLCanvas.cpp @@ -235,7 +235,7 @@ void MapperGLCanvas::mouseReleaseEvent(QMouseEvent* event) } else if (_shapeGrabbed) { - + undoStack->push(new TranslateShapeCommand(this, TransformShapeCommand::RELEASE, QPointF())); } _vertexGrabbed = false; _shapeGrabbed = false; @@ -287,7 +287,7 @@ void MapperGLCanvas::mouseMoveEvent(QMouseEvent* event) } QPointF diff = scenePos - mapToScene(lastMousePos); - shape->translate(diff.x(), diff.y()); + undoStack->push(new TranslateShapeCommand(this, TransformShapeCommand::FREE, diff)); } // Window translation action diff --git a/Shape.cpp b/Shape.cpp index 137d72f..21b1306 100644 --- a/Shape.cpp +++ b/Shape.cpp @@ -31,14 +31,10 @@ MShape* MShape::clone() const { return copyShape; } -void MShape::translate(int x, int y) +void MShape::translate(const QPointF& offset) { - for (QVector::iterator it = vertices.begin() ; - it != vertices.end(); ++it) - { - it->setX(it->x() + x); - it->setY(it->y() + y); - } + for (int i=0; i