void Editor::backup(int backupLayer, int backupFrame, QString undoText) { while (mBackupList.size() - 1 > mBackupIndex && mBackupList.size() > 0) { delete mBackupList.takeLast(); } while (mBackupList.size() > 19) // we authorize only 20 levels of cancellation { delete mBackupList.takeFirst(); mBackupIndex--; } Layer* layer = mObject->getLayer(backupLayer); if (layer != nullptr) { if (layer->type() == Layer::BITMAP) { BitmapImage* bitmapImage = static_cast<LayerBitmap*>(layer)->getLastBitmapImageAtFrame(backupFrame, 0); if (currentFrame() == 1) { int previous = layer->getPreviousKeyFramePosition(backupFrame); bitmapImage = static_cast<LayerBitmap*>(layer)->getBitmapImageAtFrame(previous); } if (bitmapImage != nullptr) { BackupBitmapElement* element = new BackupBitmapElement(bitmapImage); element->layer = backupLayer; element->frame = backupFrame; element->undoText = undoText; element->somethingSelected = getScribbleArea()->isSomethingSelected(); element->mySelection = getScribbleArea()->mySelection; element->myTransformedSelection = getScribbleArea()->myTransformedSelection; element->myTempTransformedSelection = getScribbleArea()->myTempTransformedSelection; mBackupList.append(element); mBackupIndex++; } } else if (layer->type() == Layer::VECTOR) { VectorImage* vectorImage = static_cast<LayerVector*>(layer)->getLastVectorImageAtFrame(backupFrame, 0); if (vectorImage != nullptr) { BackupVectorElement* element = new BackupVectorElement(vectorImage); element->layer = backupLayer; element->frame = backupFrame; element->undoText = undoText; element->somethingSelected = getScribbleArea()->isSomethingSelected(); element->mySelection = getScribbleArea()->mySelection; element->myTransformedSelection = getScribbleArea()->myTransformedSelection; element->myTempTransformedSelection = getScribbleArea()->myTempTransformedSelection; mBackupList.append(element); mBackupIndex++; } } else if (layer->type() == Layer::SOUND) { int previous = layer->getPreviousKeyFramePosition(backupFrame); KeyFrame* key = layer->getLastKeyFrameAtPosition(backupFrame); // in case tracks overlap, get previous frame if (key == nullptr) { KeyFrame* previousKey = layer->getKeyFrameAt(previous); key = previousKey; } if (key != nullptr) { SoundClip* clip = static_cast<SoundClip*>(key); if (clip) { BackupSoundElement* element = new BackupSoundElement(clip); element->layer = backupLayer; element->frame = backupFrame; element->undoText = undoText; element->fileName = clip->fileName(); mBackupList.append(element); mBackupIndex++; } } } } updateAutoSaveCounter(); emit updateBackup(); }