void Editor::addKeyFame( int layerNumber, int frameIndex ) { Layer* layer = mObject->getLayer( layerNumber ); if ( layer == NULL ) { return; } bool isOK = false; switch ( layer->type() ) { case Layer::BITMAP: case Layer::VECTOR: case Layer::CAMERA: isOK = layer->addNewKeyAt( frameIndex ); break; default: break; } if ( isOK ) { scrubTo( frameIndex ); getScribbleArea()->updateCurrentFrame(); } else { addKeyFame( layerNumber, frameIndex + 1 ); } }
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(); }