21 #include <QApplication>
26 #include <QSvgGenerator>
27 #include <QMessageBox>
28 #include <QImageReader>
31 #include <QFileDialog>
32 #include <QInputDialog>
34 #include <QDialogButtonBox>
35 #include <QDragEnterEvent>
39 #include "objectdata.h"
40 #include "vectorimage.h"
41 #include "bitmapimage.h"
42 #include "layerbitmap.h"
43 #include "layervector.h"
44 #include "layersound.h"
45 #include "layercamera.h"
46 #include "keyframefactory.h"
48 #include "colormanager.h"
49 #include "toolmanager.h"
50 #include "layermanager.h"
51 #include "playbackmanager.h"
52 #include "viewmanager.h"
53 #include "preferencemanager.h"
54 #include "soundmanager.h"
56 #include "scribblearea.h"
60 #define MIN(a,b) ((a)>(b)?(b):(a))
67 Editor::Editor( QObject* parent ) : QObject( parent )
70 clipboardBitmapOk =
false;
71 clipboardVectorOk =
false;
104 pManager->setEditor(
this );
111 mIsAutosave = mPreferenceManager->isOn(SETTING::AUTO_SAVE);
112 autosaveNumber = mPreferenceManager->getInt(SETTING::AUTO_SAVE_NUMBER);
120 int Editor::currentFrame()
127 return mPlaybackManager->fps();
130 void Editor::makeConnections()
132 connect( mPreferenceManager, &PreferenceManager::optionChanged,
this, &Editor::settingUpdated );
133 connect( QApplication::clipboard(), &QClipboard::dataChanged,
this, &Editor::clipboardChanged );
136 void Editor::dragEnterEvent( QDragEnterEvent* event )
138 event->acceptProposedAction();
141 void Editor::dropEvent( QDropEvent* event )
143 if ( event->mimeData()->hasUrls() )
145 for (
int i = 0; i <
event->mimeData()->urls().size(); i++ )
147 if ( i > 0 ) scrubForward();
148 QUrl url =
event->mimeData()->urls()[ i ];
149 QString filePath = url.toLocalFile();
150 if ( filePath.endsWith(
".png" ) || filePath.endsWith(
".jpg" ) || filePath.endsWith(
".jpeg" ) )
151 importImage( filePath );
158 void Editor::settingUpdated(SETTING setting)
162 case SETTING::AUTO_SAVE:
163 mIsAutosave = mPreferenceManager->isOn( SETTING::AUTO_SAVE );
165 case SETTING::AUTO_SAVE_NUMBER:
166 autosaveNumber = mPreferenceManager->getInt( SETTING::AUTO_SAVE_NUMBER );
168 case SETTING::ONION_TYPE:
169 mScribbleArea->updateAllFrames();
170 emit updateTimeLine();
179 if ( mBackupIndex >= 0 )
181 return mBackupList[ mBackupIndex ];
189 void Editor::backup( QString undoText )
191 if ( lastModifiedLayer > -1 && lastModifiedFrame > 0 )
193 backup( lastModifiedLayer, lastModifiedFrame, undoText );
195 if ( lastModifiedLayer != layers()->currentLayerIndex() || lastModifiedFrame != currentFrame() )
197 backup( layers()->currentLayerIndex(), currentFrame(), undoText );
201 void Editor::backup(
int backupLayer,
int backupFrame, QString undoText )
203 while ( mBackupList.size() - 1 > mBackupIndex && mBackupList.size() > 0 )
205 delete mBackupList.takeLast();
207 while ( mBackupList.size() > 19 )
209 delete mBackupList.takeFirst();
212 Layer* layer = mObject->getLayer( backupLayer );
215 if ( layer->type() == Layer::BITMAP )
218 if ( bitmapImage != NULL )
221 element->layer = backupLayer;
222 element->frame = backupFrame;
223 element->undoText = undoText;
224 element->somethingSelected = this->getScribbleArea()->somethingSelected;
225 element->mySelection = this->getScribbleArea()->mySelection;
226 element->myTransformedSelection = this->getScribbleArea()->myTransformedSelection;
227 element->myTempTransformedSelection = this->getScribbleArea()->myTempTransformedSelection;
228 mBackupList.append( element );
232 else if ( layer->type() == Layer::VECTOR )
235 if ( vectorImage != NULL )
238 element->layer = backupLayer;
239 element->frame = backupFrame;
240 element->undoText = undoText;
241 element->somethingSelected = this->getScribbleArea()->somethingSelected;
242 element->mySelection = this->getScribbleArea()->mySelection;
243 element->myTransformedSelection = this->getScribbleArea()->myTransformedSelection;
244 element->myTempTransformedSelection = this->getScribbleArea()->myTempTransformedSelection;
245 mBackupList.append( element );
253 void BackupBitmapElement::restore(
Editor* editor )
255 Layer* layer = editor->object()->getLayer( this->layer );
258 if ( layer->type() == Layer::BITMAP )
260 *( ( (
LayerBitmap*)layer )->getLastBitmapImageAtFrame( this->frame, 0 ) ) = this->bitmapImage;
263 editor->getScribbleArea()->somethingSelected = this->somethingSelected;
264 editor->getScribbleArea()->mySelection = this->mySelection;
265 editor->getScribbleArea()->myTransformedSelection = this->myTransformedSelection;
266 editor->getScribbleArea()->myTempTransformedSelection = this->myTempTransformedSelection;
268 editor->updateFrame( this->frame );
269 editor->scrubTo( this->frame );
272 void BackupVectorElement::restore(
Editor* editor )
274 Layer* layer = editor->object()->getLayer( this->layer );
277 if ( layer->type() == Layer::VECTOR )
279 *( ( (
LayerVector*)layer )->getLastVectorImageAtFrame( this->frame, 0 ) ) = this->vectorImage;
284 editor->getScribbleArea()->somethingSelected = this->somethingSelected;
285 editor->getScribbleArea()->mySelection = this->mySelection;
286 editor->getScribbleArea()->myTransformedSelection = this->myTransformedSelection;
287 editor->getScribbleArea()->myTempTransformedSelection = this->myTempTransformedSelection;
289 editor->updateFrameAndVector( this->frame );
290 editor->scrubTo( this->frame );
295 if ( mBackupList.size() > 0 && mBackupIndex > -1 )
297 if ( mBackupIndex == mBackupList.size() - 1 )
299 BackupElement* lastBackupElement = mBackupList[ mBackupIndex ];
300 if ( lastBackupElement->type() == BackupElement::BITMAP_MODIF )
303 backup( lastBackupBitmapElement->layer, lastBackupBitmapElement->frame,
"NoOp" );
306 if ( lastBackupElement->type() == BackupElement::VECTOR_MODIF )
309 backup( lastBackupVectorElement->layer, lastBackupVectorElement->frame,
"NoOp" );
314 mBackupList[ mBackupIndex ]->restore(
this );
316 mScribbleArea->cancelTransformedSelection();
317 mScribbleArea->calculateSelectionRect();
324 if ( mBackupList.size() > 0 && mBackupIndex < mBackupList.size() - 2 )
327 mBackupList[ mBackupIndex + 1 ]->restore(
this );
332 void Editor::clearUndoStack()
335 while ( !mBackupList.isEmpty() )
337 delete mBackupList.takeLast();
339 lastModifiedLayer = -1;
340 lastModifiedFrame = -1;
346 mScribbleArea->deleteSelection();
347 mScribbleArea->deselectAll();
352 Layer* layer = mObject->getLayer( layers()->currentLayerIndex() );
355 if ( layer->type() == Layer::BITMAP )
357 if ( mScribbleArea->somethingSelected )
359 g_clipboardBitmapImage = ( (
LayerBitmap*)layer )->getLastBitmapImageAtFrame( currentFrame(), 0 )->copy( mScribbleArea->getSelection().toRect() );
363 g_clipboardBitmapImage = ( (
LayerBitmap*)layer )->getLastBitmapImageAtFrame( currentFrame(), 0 )->copy();
365 clipboardBitmapOk =
true;
366 if ( g_clipboardBitmapImage.image() != NULL ) QApplication::clipboard()->setImage( *g_clipboardBitmapImage.image() );
368 if ( layer->type() == Layer::VECTOR )
370 clipboardVectorOk =
true;
371 g_clipboardVectorImage = *( ( (
LayerVector*)layer )->getLastVectorImageAtFrame( currentFrame(), 0 ) );
378 Layer* layer = mObject->getLayer( layers()->currentLayerIndex() );
381 if ( layer->type() == Layer::BITMAP && g_clipboardBitmapImage.image() != NULL )
383 backup( tr(
"Paste" ) );
384 BitmapImage tobePasted = g_clipboardBitmapImage.copy();
385 qDebug() <<
"to be pasted --->" << tobePasted.image()->size();
386 if ( mScribbleArea->somethingSelected )
388 QRectF selection = mScribbleArea->getSelection();
389 if ( g_clipboardBitmapImage.width() <= selection.width() && g_clipboardBitmapImage.height() <= selection.height() )
391 tobePasted.moveTopLeft( selection.topLeft() );
395 tobePasted.transform( selection,
true );
398 auto pLayerBitmap =
static_cast<LayerBitmap*
>( layer );
399 pLayerBitmap->getLastBitmapImageAtFrame( currentFrame(), 0 )->paste( &tobePasted );
401 else if ( layer->type() == Layer::VECTOR && clipboardVectorOk )
403 backup( tr(
"Paste" ) );
404 mScribbleArea->deselectAll();
406 vectorImage->paste( g_clipboardVectorImage );
407 mScribbleArea->setSelection( vectorImage->getSelectionRect(), true );
411 mScribbleArea->updateCurrentFrame();
414 void Editor::flipSelection(
bool flipVertical)
419 void Editor::deselectAll()
421 mScribbleArea->deselectAll();
424 void Editor::clipboardChanged()
426 if ( clipboardBitmapOk ==
false )
428 g_clipboardBitmapImage.setImage(
new QImage( QApplication::clipboard()->image() ) );
429 g_clipboardBitmapImage.bounds() = QRect( g_clipboardBitmapImage.topLeft(), g_clipboardBitmapImage.image()->size() );
430 qDebug() <<
"New clipboard image" << g_clipboardBitmapImage.image()->size();
434 clipboardBitmapOk =
false;
435 qDebug() <<
"The image has been saved in the clipboard";
439 int Editor::allLayers()
441 return mScribbleArea->showAllLayers();
444 void Editor::toggleMirror()
446 bool flipX = view()->isFlipHorizontal();
447 view()->flipHorizontal( !flipX );
450 void Editor::toggleMirrorV()
452 bool flipY = view()->isFlipVertical();
453 view()->flipVertical( !flipY );
456 void Editor::toggleShowAllLayers()
458 mScribbleArea->toggleShowAllLayers();
459 emit updateTimeLine();
462 void Editor::toogleOnionSkinType()
464 QString onionSkinState = mPreferenceManager->getString(SETTING::ONION_TYPE);
466 if (onionSkinState ==
"relative")
468 newState =
"absolute";
472 newState =
"relative";
475 mPreferenceManager->set(SETTING::ONION_TYPE, newState);
480 if ( newObject ==
nullptr )
483 return Status::INVALID_ARGUMENT;
486 if ( newObject == mObject.get() )
491 mObject.reset( newObject );
496 m->load( mObject.get() );
499 g_clipboardVectorImage.setObject( newObject );
508 void Editor::updateObject()
510 scrubTo( mObject->data()->getCurrentFrame() );
511 if (layers() != NULL)
513 layers()->setCurrentLayer( mObject->data()->getCurrentLayer() );
520 mScribbleArea->updateAllFrames();
523 emit updateLayerCount();
526 bool Editor::exportSeqCLI( QString filePath, QString format,
int width,
int height,
bool transparency,
bool antialias )
529 int cameraLayerId = mLayerManager->getLastCameraLayer();
534 width = cameraLayer->getViewRect().width();
538 height = cameraLayer->getViewRect().height();
541 QSize exportSize = QSize( width, height );
542 QByteArray exportFormat( format.toLatin1() );
547 int projectLength = mLayerManager->projectLength();
549 mObject->exportFrames( 1,
564 QString Editor::workingDir()
const
566 return mObject->workingDir();
569 bool Editor::importBitmapImage( QString filePath )
571 backup( tr(
"Import Image" ) );
573 QImageReader reader( filePath );
575 Q_ASSERT( layers()->currentLayer()->type() == Layer::BITMAP );
576 auto layer =
static_cast<LayerBitmap*
>( layers()->currentLayer() );
578 QImage img( reader.size(), QImage::Format_ARGB32_Premultiplied );
584 while ( reader.read( &img ) )
586 if ( !layer->keyExists( currentFrame() ) )
590 BitmapImage* bitmapImage = layer->getBitmapImageAtFrame( currentFrame() );
592 QRect boundaries = img.rect();
593 boundaries.moveTopLeft( mScribbleArea->getCentralPoint().toPoint() - QPoint( boundaries.width() / 2, boundaries.height() / 2 ) );
596 bitmapImage->paste(&importedBitmapImage);
598 scrubTo( currentFrame() + 1 );
604 bool Editor::importVectorImage( QString filePath )
606 Q_ASSERT( layers()->currentLayer()->type() == Layer::VECTOR );
608 backup( tr(
"Import Image" ) );
610 auto layer =
static_cast<LayerVector*
>( layers()->currentLayer() );
613 if ( vectorImage == NULL )
616 vectorImage = ( (
LayerVector*)layer )->getVectorImageAtFrame( currentFrame() );
619 bool ok = importedVectorImage.read( filePath );
622 importedVectorImage.selectAll();
623 vectorImage->paste(importedVectorImage);
638 bool Editor::importImage( QString filePath )
640 Layer* layer = layers()->currentLayer();
642 switch ( layer->type() )
645 return importBitmapImage( filePath );
648 return importVectorImage( filePath );
658 void Editor::updateFrame(
int frameNumber )
660 mScribbleArea->updateFrame( frameNumber );
663 void Editor::updateFrameAndVector(
int frameNumber )
665 mScribbleArea->updateAllVectorLayersAt( frameNumber );
668 void Editor::updateCurrentFrame()
670 mScribbleArea->updateCurrentFrame();
673 void Editor::scrubTo(
int frame )
679 int oldFrame = mFrame;
682 Q_EMIT currentFrameChanged( frame );
683 Q_EMIT currentFrameChanged( oldFrame );
688 if ( mPlaybackManager && !mPlaybackManager->isPlaying() )
690 emit updateTimeLine();
694 void Editor::scrubForward()
696 scrubTo( currentFrame() + 1 );
699 void Editor::scrubBackward()
701 if ( currentFrame() > 1 )
703 scrubTo( currentFrame() - 1 );
707 void Editor::moveFrameForward()
709 Layer* layer = layers()->currentLayer();
712 if ( layer->moveKeyFrameForward( currentFrame() ) )
714 mScribbleArea->updateAllFrames();
720 void Editor::moveFrameBackward()
722 Layer* layer = layers()->currentLayer();
725 if ( layer->moveKeyFrameBackward( currentFrame() ) )
727 mScribbleArea->updateAllFrames();
735 return addKeyFame( layers()->currentLayerIndex(), currentFrame() );
738 void Editor::duplicateKey()
740 Layer* layer = mObject->getLayer( layers()->currentLayerIndex() );
743 if ( layer->type() == Layer::VECTOR || layer->type() == Layer::BITMAP )
747 if(!mScribbleArea->somethingSelected) {
748 mScribbleArea->selectAll();
755 mScribbleArea->setModified( layers()->currentLayerIndex(), currentFrame() );
756 mScribbleArea->update();
761 KeyFrame* Editor::addKeyFame(
int layerNumber,
int frameIndex )
763 Layer* layer = mObject->getLayer( layerNumber );
772 while ( layer->keyExists( frameIndex ) )
777 KeyFrame* keyFrame = KeyFrameFactory::create( layer->type(), mObject.get() );
778 if ( keyFrame !=
nullptr )
780 isOK = layer->addKeyFrame( frameIndex, keyFrame );
789 scrubTo( frameIndex );
796 void Editor::removeKey()
798 Layer* layer = layers()->currentLayer();
801 layer->removeKeyFrame( currentFrame() );
804 mScribbleArea->updateCurrentFrame();
806 Q_EMIT layers()->currentLayerChanged( layers()->currentLayerIndex() );
809 void Editor::scrubNextKeyFrame()
811 Layer* layer = layers()->currentLayer();
814 int nextPosition = layer->getNextKeyFramePosition( currentFrame() );
815 scrubTo( nextPosition );
818 void Editor::scrubPreviousKeyFrame()
820 Layer* layer = mObject->getLayer( layers()->currentLayerIndex() );
823 int prevPosition = layer->getPreviousKeyFramePosition( currentFrame() );
824 scrubTo( prevPosition );
827 void Editor::setCurrentLayer(
int layerNumber )
829 layers()->setCurrentLayer( layerNumber );
830 mScribbleArea->updateAllFrames();
833 void Editor::switchVisibilityOfLayer(
int layerNumber )
835 Layer* layer = mObject->getLayer( layerNumber );
836 if ( layer != NULL ) layer->switchVisibility();
837 mScribbleArea->updateAllFrames();
839 emit updateTimeLine();
842 void Editor::moveLayer(
int i,
int j )
844 mObject->moveLayer( i, j );
847 layers()->setCurrentLayer( j );
851 layers()->setCurrentLayer( j - 1 );
853 emit updateTimeLine();
854 mScribbleArea->updateAllFrames();
857 void Editor::prepareSave()
859 for (
auto mgr : mAllManagers )
861 mgr->save( mObject.get() );
865 void Editor::clearCurrentFrame()
867 mScribbleArea->clearImage();
void flipSelection(bool flipVertical)
ScribbleArea::flipSelection flip selection along the X or Y axis.