diff --git a/src/board/UBBoardController.cpp b/src/board/UBBoardController.cpp index 0b640e07..bffbf4a2 100644 --- a/src/board/UBBoardController.cpp +++ b/src/board/UBBoardController.cpp @@ -1552,60 +1552,55 @@ void UBBoardController::moveSceneToIndex(int source, int target) void UBBoardController::ClearUndoStack() { -// The code has been removed because it leads to a strange error and because the final goal has never been -// reached on tests and sound a little bit strange. -// Strange error: item->scene() crashes the application because item doesn't implement scene() method. I'm -// not able to give all the steps to reproduce this error sistematically but is quite frequent (~ twice per utilisation hours) -// strange goal: if item is on the undocommand, the item->scene() is null and the item is not on the deleted scene item list then -// then it's deleted. - - // QSet uniqueItems; -// // go through all stack command -// for(int i = 0; i < UBApplication::undoStack->count(); i++) -// { - -// UBAbstractUndoCommand *abstractCmd = (UBAbstractUndoCommand*)UBApplication::undoStack->command(i); -// if(abstractCmd->getType() != UBAbstractUndoCommand::undotype_GRAPHICITEM) -// continue; - -// UBGraphicsItemUndoCommand *cmd = (UBGraphicsItemUndoCommand*)UBApplication::undoStack->command(i); - -// // go through all added and removed objects, for create list of unique objects -// // grouped items will be deleted by groups, so we don't need do delete that items. -// QSetIterator itAdded(cmd->GetAddedList()); -// while (itAdded.hasNext()) -// { -// QGraphicsItem* item = itAdded.next(); -// if( !uniqueItems.contains(item) && !(item->parentItem() && UBGraphicsGroupContainerItem::Type == item->parentItem()->type())) -// uniqueItems.insert(item); -// } - -// QSetIterator itRemoved(cmd->GetRemovedList()); -// while (itRemoved.hasNext()) -// { -// QGraphicsItem* item = itRemoved.next(); -// if( !uniqueItems.contains(item) && !(item->parentItem() && UBGraphicsGroupContainerItem::Type == item->parentItem()->type())) -// uniqueItems.insert(item); -// } -// } - -// // go through all unique items, and check, ot on scene, or not. -// // if not on scene, than item can be deleted - -// QSetIterator itUniq(uniqueItems); -// while (itUniq.hasNext()) -// { -// QGraphicsItem* item = itUniq.next(); -// UBGraphicsScene *scene = NULL; -// if (item->scene()) { -// scene = dynamic_cast(item->scene()); -// } -// if(!scene) -// { -// if (!mActiveScene->deleteItem(item)) -// delete item; -// } -// } + QSet uniqueItems; + // go through all stack command + for(int i = 0; i < UBApplication::undoStack->count(); i++) + { + + UBAbstractUndoCommand *abstractCmd = (UBAbstractUndoCommand*)UBApplication::undoStack->command(i); + if(abstractCmd->getType() != UBAbstractUndoCommand::undotype_GRAPHICITEM) + continue; + + UBGraphicsItemUndoCommand *cmd = (UBGraphicsItemUndoCommand*)UBApplication::undoStack->command(i); + + // go through all added and removed objects, for create list of unique objects + // grouped items will be deleted by groups, so we don't need do delete that items. + QSetIterator itAdded(cmd->GetAddedList()); + while (itAdded.hasNext()) + { + QGraphicsItem* item = itAdded.next(); + if( !uniqueItems.contains(item) && !(item->parentItem() && UBGraphicsGroupContainerItem::Type == item->parentItem()->type())) + uniqueItems.insert(item); + } + + QSetIterator itRemoved(cmd->GetRemovedList()); + while (itRemoved.hasNext()) + { + QGraphicsItem* item = itRemoved.next(); + if( !uniqueItems.contains(item) && !(item->parentItem() && UBGraphicsGroupContainerItem::Type == item->parentItem()->type())) + uniqueItems.insert(item); + } + } + + // go through all unique items, and check, if they are on scene, or not. + // if not on scene, than item can be deleted + + QSetIterator itUniq(uniqueItems); + while (itUniq.hasNext()) + { + QGraphicsItem* item = itUniq.next(); + UBGraphicsScene *scene = NULL; + if (item->scene()) { + scene = dynamic_cast(item->scene()); + } + if(!scene) + { + if (!mActiveScene->deleteItem(item)){ + delete item; + item = 0; + } + } + } // clear stack, and command list UBApplication::undoStack->clear(); diff --git a/src/core/UBApplication.h b/src/core/UBApplication.h index 6f76c1db..1649d0fc 100644 --- a/src/core/UBApplication.h +++ b/src/core/UBApplication.h @@ -47,7 +47,7 @@ class UBMainWindow; class UBApplication : public QtSingleApplication { - Q_OBJECT; + Q_OBJECT public: diff --git a/src/domain/UBGraphicsItemUndoCommand.cpp b/src/domain/UBGraphicsItemUndoCommand.cpp index 1fb1bd3d..bcad7056 100644 --- a/src/domain/UBGraphicsItemUndoCommand.cpp +++ b/src/domain/UBGraphicsItemUndoCommand.cpp @@ -221,7 +221,7 @@ void UBGraphicsItemUndoCommand::redo() UBGraphicsPolygonItem *polygonItem = qgraphicsitem_cast(item); if (polygonItem) - { + { mScene->removeItem(polygonItem); mScene->removeItemFromDeletion(polygonItem); polygonItem->strokesGroup()->addToGroup(polygonItem);