|
|
|
@ -1567,57 +1567,64 @@ void UBBoardController::moveSceneToIndex(int source, int target) |
|
|
|
|
|
|
|
|
|
void UBBoardController::ClearUndoStack() |
|
|
|
|
{ |
|
|
|
|
QSet<QGraphicsItem*> 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<QGraphicsItem*> 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<QGraphicsItem*> itRemoved(cmd->GetRemovedList()); |
|
|
|
|
while (itRemoved.hasNext()) |
|
|
|
|
{ |
|
|
|
|
QGraphicsItem* item = itRemoved.next(); |
|
|
|
|
if( !uniqueItems.contains(item) && !(item->parentItem() && UBGraphicsGroupContainerItem::Type == item->parentItem()->type())) |
|
|
|
|
uniqueItems.insert(item); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// 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<QGraphicsItem*> 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<QGraphicsItem*> 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<QGraphicsItem*> 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<QGraphicsItem*> itUniq(uniqueItems);
|
|
|
|
|
// while (itUniq.hasNext())
|
|
|
|
|
// {
|
|
|
|
|
// QGraphicsItem* item = itUniq.next();
|
|
|
|
|
// UBGraphicsScene *scene = NULL;
|
|
|
|
|
// if (item->scene()) {
|
|
|
|
|
// scene = dynamic_cast<UBGraphicsScene*>(item->scene());
|
|
|
|
|
// }
|
|
|
|
|
// if(!scene)
|
|
|
|
|
// {
|
|
|
|
|
// if (!mActiveScene->deleteItem(item))
|
|
|
|
|
// delete item;
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// clear stack, and command list
|
|
|
|
|
UBApplication::undoStack->clear(); |
|
|
|
|
|
|
|
|
|
// go through all unique items, and check, ot on scene, or not.
|
|
|
|
|
// if not on scene, than item can be deleted
|
|
|
|
|
|
|
|
|
|
QSetIterator<QGraphicsItem*> itUniq(uniqueItems); |
|
|
|
|
while (itUniq.hasNext()) |
|
|
|
|
{ |
|
|
|
|
QGraphicsItem* item = itUniq.next(); |
|
|
|
|
UBGraphicsScene *scene = NULL; |
|
|
|
|
if (item->scene()) { |
|
|
|
|
scene = dynamic_cast<UBGraphicsScene*>(item->scene()); |
|
|
|
|
} |
|
|
|
|
if(!scene) |
|
|
|
|
{ |
|
|
|
|
if (!mActiveScene->deleteItem(item)) |
|
|
|
|
delete item; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void UBBoardController::adjustDisplayViews() |
|
|
|
|