From 1b09dd08d80d43e3747680d5db221dccb3fb8cd1 Mon Sep 17 00:00:00 2001 From: baydam Date: Fri, 15 Apr 2016 13:05:34 +0000 Subject: [PATCH] Can undo or redo Add/Remove paint --- Commands.cpp | 72 +++++++++++++++++++++++++++++++++++++++++++------- Commands.h | 30 +++++++++++++++++++++ MainWindow.cpp | 8 +++--- MainWindow.h | 2 +- 4 files changed, 97 insertions(+), 15 deletions(-) diff --git a/Commands.cpp b/Commands.cpp index c3867db..86a1a26 100644 --- a/Commands.cpp +++ b/Commands.cpp @@ -26,6 +26,34 @@ MM_BEGIN_NAMESPACE +AddPaintCommand::AddPaintCommand(MainWindow *mainWindow, uid paintId, const QIcon &icon, const QString &name, QUndoCommand *parent) : + QUndoCommand(parent), + _mainWindow(mainWindow), + _paintId(paintId), + _icon(icon), + _name(name) +{ + setText(QObject::tr("Add paint")); +} + +void AddPaintCommand::undo() +{ + _paint = _mainWindow->getMappingManager().getPaintById(_paintId); + _mainWindow->removePaintItem(_paintId); +} + +void AddPaintCommand::redo() +{ + if (!_paint.isNull()) + { + uid lastId = _mainWindow->getMappingManager().addPaint(_paint); + _mainWindow->addPaintItem(lastId, _icon, _name); + } + else { + _mainWindow->addPaintItem(_paintId, _icon, _name); + } +} + AddShapesCommand::AddShapesCommand(MainWindow *mainWindow, uid mappingId, QUndoCommand *parent): QUndoCommand(parent), _mainWindow(mainWindow), @@ -42,11 +70,11 @@ void AddShapesCommand::undo() void AddShapesCommand::redo() { - if(!_mapping.isNull()) - { - uid storedId = _mainWindow->getMappingManager().addMapping(_mapping); - _mainWindow->addMappingItem(storedId); - } + if (!_mapping.isNull()) + { + uid storedId = _mainWindow->getMappingManager().addMapping(_mapping); + _mainWindow->addMappingItem(storedId); + } else { _mainWindow->addMappingItem(_mappingId); @@ -163,6 +191,30 @@ void TranslateShapeCommand::_doTransform(MShape::ptr shape) shape->translate(_translation); } +RemovePaintCommand::RemovePaintCommand(MainWindow *mainWindow, uid paintId, QUndoCommand *parent): + QUndoCommand(parent), + _mainWindow(mainWindow), + _paintId(paintId) +{ + setText(QObject::tr("Remove paint")); +} + +void RemovePaintCommand::undo() +{ + if (!_paint.isNull()) + { + uid lastId = _mainWindow->getMappingManager().addPaint(_paint); + _mainWindow->addPaintItem(lastId, _paint->getIcon(), _paint->getName()); + } +} + +void RemovePaintCommand::redo() +{ + _paint = _mainWindow->getMappingManager().getPaintById(_paintId); + _mainWindow->deletePaint(_paintId); +} + + DeleteMappingCommand::DeleteMappingCommand(MainWindow *mainWindow, uid mappingId, QUndoCommand *parent) : QUndoCommand(parent), @@ -174,11 +226,11 @@ DeleteMappingCommand::DeleteMappingCommand(MainWindow *mainWindow, uid mappingId void DeleteMappingCommand::undo() { - if(!_mapping.isNull()) - { - uid storedId = _mainWindow->getMappingManager().addMapping(_mapping); - _mainWindow->addMappingItem(storedId); - } + if (!_mapping.isNull()) + { + uid storedId = _mainWindow->getMappingManager().addMapping(_mapping); + _mainWindow->addMappingItem(storedId); + } } void DeleteMappingCommand::redo() diff --git a/Commands.h b/Commands.h index baae96d..5051d31 100644 --- a/Commands.h +++ b/Commands.h @@ -37,6 +37,22 @@ enum CommandId { class MainWindow; class MapperGLCanvas; +class AddPaintCommand : public QUndoCommand +{ +public: + explicit AddPaintCommand(MainWindow *mainWindow, uid paintId, const QIcon &icon, const QString &name, QUndoCommand *parent = 0); + + void undo() Q_DECL_OVERRIDE; + void redo() Q_DECL_OVERRIDE; + +private: + MainWindow *_mainWindow; + Paint::ptr _paint; + uid _paintId; + QIcon _icon; + QString _name; +}; + class AddShapesCommand : public QUndoCommand { public: @@ -113,6 +129,20 @@ private: QPointF _translation; }; +class RemovePaintCommand : public QUndoCommand +{ +public: + explicit RemovePaintCommand(MainWindow *mainWindow, uid paintId, QUndoCommand *parent = 0); + + void undo() Q_DECL_OVERRIDE; + void redo() Q_DECL_OVERRIDE; + +private: + MainWindow *_mainWindow; + Paint::ptr _paint; + uid _paintId; +}; + class DeleteMappingCommand : public QUndoCommand { public: diff --git a/MainWindow.cpp b/MainWindow.cpp index 986d8ac..eb5aea4 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -649,7 +649,7 @@ void MainWindow::deleteItem() else if (isPaintTabSelected) //currentSelectedItem->listWidget() == paintList) { // Delete paint. - deletePaint( getItemId(*paintList->currentItem()), false ); + undoStack->push(new RemovePaintCommand(this, getItemId(*paintList->currentItem()))); //currentSelectedItem = NULL; } else @@ -730,7 +730,7 @@ void MainWindow::deletePaintItem() { if(currentSelectedItem) { - deletePaint(getItemId(*paintList->currentItem()), false); + undoStack->push(new RemovePaintCommand(this, getItemId(*paintList->currentItem()))); } else { @@ -851,7 +851,7 @@ uid MainWindow::createMediaPaint(uid paintId, QString uri, float x, float y, uid id = mappingManager->addPaint(paint); // Add paint widget item. - addPaintItem(id, paint->getIcon(), paint->getName()); + undoStack->push(new AddPaintCommand(this, id, paint->getIcon(), paint->getName())); return id; } } @@ -874,7 +874,7 @@ uid MainWindow::createColorPaint(uid paintId, QColor color) uid id = mappingManager->addPaint(paint); // Add paint widget item. - addPaintItem(id, paint->getIcon(), paint->getName()); + undoStack->push(new AddPaintCommand(this, id, paint->getIcon(), paint->getName())); return id; } diff --git a/MainWindow.h b/MainWindow.h index 8bec101..600e3ce 100644 --- a/MainWindow.h +++ b/MainWindow.h @@ -192,7 +192,7 @@ public slots: void duplicateMapping(uid mappingId); /// Deletes/removes a paint and all associated mappigns. - void deletePaint(uid paintId, bool replace); + void deletePaint(uid paintId, bool replace = false); /// Updates all canvases. void updateCanvases();