comment some code to avoid crash on page change. To be reworked

preferencesAboutTextFull
Claudio Valerio 12 years ago
parent a2a72d41ed
commit f9d482e115
  1. 101
      src/board/UBBoardController.cpp
  2. 4
      src/document/UBDocumentContainer.cpp
  3. 4
      src/gui/UBDocumentNavigator.cpp

@ -1567,57 +1567,64 @@ void UBBoardController::moveSceneToIndex(int source, int target)
void UBBoardController::ClearUndoStack() void UBBoardController::ClearUndoStack()
{ {
QSet<QGraphicsItem*> uniqueItems; // The code has been removed because it leads to a strange error and because the final goal has never been
// go through all stack command // reached on tests and sound a little bit strange.
for(int i = 0; i < UBApplication::undoStack->count(); i++) // 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
UBAbstractUndoCommand *abstractCmd = (UBAbstractUndoCommand*)UBApplication::undoStack->command(i); // then it's deleted.
if(abstractCmd->getType() != UBAbstractUndoCommand::undotype_GRAPHICITEM)
continue; // QSet<QGraphicsItem*> uniqueItems;
// // go through all stack command
UBGraphicsItemUndoCommand *cmd = (UBGraphicsItemUndoCommand*)UBApplication::undoStack->command(i); // for(int i = 0; i < UBApplication::undoStack->count(); 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. // UBAbstractUndoCommand *abstractCmd = (UBAbstractUndoCommand*)UBApplication::undoStack->command(i);
QSetIterator<QGraphicsItem*> itAdded(cmd->GetAddedList()); // if(abstractCmd->getType() != UBAbstractUndoCommand::undotype_GRAPHICITEM)
while (itAdded.hasNext()) // continue;
{
QGraphicsItem* item = itAdded.next(); // UBGraphicsItemUndoCommand *cmd = (UBGraphicsItemUndoCommand*)UBApplication::undoStack->command(i);
if( !uniqueItems.contains(item) && !(item->parentItem() && UBGraphicsGroupContainerItem::Type == item->parentItem()->type()))
uniqueItems.insert(item); // // 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());
QSetIterator<QGraphicsItem*> itRemoved(cmd->GetRemovedList()); // while (itAdded.hasNext())
while (itRemoved.hasNext()) // {
{ // QGraphicsItem* item = itAdded.next();
QGraphicsItem* item = itRemoved.next(); // if( !uniqueItems.contains(item) && !(item->parentItem() && UBGraphicsGroupContainerItem::Type == item->parentItem()->type()))
if( !uniqueItems.contains(item) && !(item->parentItem() && UBGraphicsGroupContainerItem::Type == item->parentItem()->type())) // uniqueItems.insert(item);
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 // clear stack, and command list
UBApplication::undoStack->clear(); 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() void UBBoardController::adjustDisplayViews()

@ -34,8 +34,10 @@ UBDocumentContainer::UBDocumentContainer(QObject * parent)
UBDocumentContainer::~UBDocumentContainer() UBDocumentContainer::~UBDocumentContainer()
{ {
foreach(const QPixmap* pm, mDocumentThumbs) foreach(const QPixmap* pm, mDocumentThumbs){
delete pm; delete pm;
pm = NULL;
}
} }
void UBDocumentContainer::setDocument(UBDocumentProxy* document, bool forceReload) void UBDocumentContainer::setDocument(UBDocumentProxy* document, bool forceReload)

@ -92,12 +92,13 @@ void UBDocumentNavigator::generateThumbnails(UBDocumentContainer* source)
{ {
mScene->removeItem(it); mScene->removeItem(it);
delete it; delete it;
it = NULL;
} }
for(int i = 0; i < source->selectedDocument()->pageCount(); i++) for(int i = 0; i < source->selectedDocument()->pageCount(); i++)
{ {
const QPixmap* pix = source->pageAt(i); const QPixmap* pix = source->pageAt(i);
Q_ASSERT(!pix->isNull());
int pageIndex = UBDocumentContainer::pageFromSceneIndex(i); int pageIndex = UBDocumentContainer::pageFromSceneIndex(i);
UBSceneThumbnailNavigPixmap* pixmapItem = new UBSceneThumbnailNavigPixmap(*pix, source->selectedDocument(), i); UBSceneThumbnailNavigPixmap* pixmapItem = new UBSceneThumbnailNavigPixmap(*pix, source->selectedDocument(), i);
@ -154,6 +155,7 @@ void UBDocumentNavigator::updateSpecificThumbnail(int iPage)
mScene->addItem(newItem); mScene->addItem(newItem);
mThumbsWithLabels[iPage].setThumbnail(newItem); mThumbsWithLabels[iPage].setThumbnail(newItem);
delete oldItem; delete oldItem;
oldItem = NULL;
} }
} }

Loading…
Cancel
Save