/* * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "UBGraphicsItemUndoCommand.h" #include #include "UBGraphicsScene.h" #include "core/memcheck.h" #include "core/UBApplication.h" #include "board/UBBoardController.h" UBGraphicsItemUndoCommand::UBGraphicsItemUndoCommand(UBGraphicsScene* pScene, const QSet& pRemovedItems, const QSet& pAddedItems) : mScene(pScene) , mRemovedItems(pRemovedItems - pAddedItems) , mAddedItems(pAddedItems - pRemovedItems) { mFirstRedo = true; QSetIterator itAdded(mAddedItems); while (itAdded.hasNext()) { UBApplication::boardController->freezeW3CWidget(itAdded.next(), true); } QSetIterator itRemoved(mRemovedItems); while (itRemoved.hasNext()) { UBApplication::boardController->freezeW3CWidget(itRemoved.next(), false); } } UBGraphicsItemUndoCommand::UBGraphicsItemUndoCommand(UBGraphicsScene* pScene, QGraphicsItem* pRemovedItem, QGraphicsItem* pAddedItem) : mScene(pScene) { if (pRemovedItem) { mRemovedItems.insert(pRemovedItem); UBApplication::boardController->freezeW3CWidget(pRemovedItem, true); } if (pAddedItem) { mAddedItems.insert(pAddedItem); UBApplication::boardController->freezeW3CWidget(pAddedItem, false); } mFirstRedo = true; } UBGraphicsItemUndoCommand::~UBGraphicsItemUndoCommand() { //NOOP } void UBGraphicsItemUndoCommand::undo() { if (!mScene){ return; } QSetIterator itAdded(mAddedItems); while (itAdded.hasNext()) { QGraphicsItem* item = itAdded.next(); item->setSelected(false); mScene->removeItem(item); UBApplication::boardController->freezeW3CWidget(item, true); } QSetIterator itRemoved(mRemovedItems); while (itRemoved.hasNext()) { QGraphicsItem* item = itRemoved.next(); mScene->addItem(item); UBApplication::boardController->freezeW3CWidget(item, false); } // force refresh, QT is a bit lazy and take a lot of time (nb item ^2 ?) to trigger repaint mScene->update(mScene->sceneRect()); } void UBGraphicsItemUndoCommand::redo() { // the Undo framework calls a redo while appending the undo command. // as we have already plotted the elements, we do not want to do it twice if (!mFirstRedo) { if (!mScene){ return; } QSetIterator itRemoved(mRemovedItems); while (itRemoved.hasNext()) { QGraphicsItem* item = itRemoved.next(); item->setSelected(false); mScene->removeItem(item); UBApplication::boardController->freezeW3CWidget(item, true); } QSetIterator itAdded(mAddedItems); while (itAdded.hasNext()) { QGraphicsItem* item = itAdded.next(); mScene->addItem(item); UBApplication::boardController->freezeW3CWidget(item, false); } // force refresh, QT is a bit lazy and take a lot of time (nb item ^2) to trigger repaint mScene->update(mScene->sceneRect()); } else { mFirstRedo = false; } }