diff --git a/app/src/importimageseqdialog.cpp b/app/src/importimageseqdialog.cpp index 86c4515913..b9fda5d1f3 100644 --- a/app/src/importimageseqdialog.cpp +++ b/app/src/importimageseqdialog.cpp @@ -170,7 +170,7 @@ void ImportImageSeqDialog::setSpace(int number) uiOptionsBox->spaceSpinBox->setValue(number); } -void ImportImageSeqDialog::importArbitrarySequence() +void ImportImageSeqDialog::importArbitrarySequence(const ImportImageConfig importImageConfig) { QStringList files = getFilePaths(); int number = getSpace(); @@ -189,7 +189,7 @@ void ImportImageSeqDialog::importArbitrarySequence() { QString strImgFileLower = strImgFile.toLower(); - Status st = mEditor->importImage(strImgFile); + Status st = mEditor->importImage(strImgFile, importImageConfig); if (!st.ok()) { ErrorDialog errorDialog(st.title(), st.description(), st.details().html()); @@ -288,7 +288,7 @@ const PredefinedKeySetParams ImportImageSeqDialog::predefinedKeySetParams() cons return setParams; } -void ImportImageSeqDialog::importPredefinedSet() +void ImportImageSeqDialog::importPredefinedSet(const ImportImageConfig importImageConfig) { PredefinedKeySet keySet = generatePredefinedKeySet(); @@ -310,7 +310,7 @@ void ImportImageSeqDialog::importPredefinedSet() const QString& filePath = keySet.filePathAt(i); mEditor->scrubTo(frameIndex); - Status st = mEditor->importImage(filePath); + Status st = mEditor->importImage(filePath, importImageConfig); if (!st.ok()) { ErrorDialog errorDialog(st.title(), st.description(), st.details().html()); diff --git a/app/src/importimageseqdialog.h b/app/src/importimageseqdialog.h index 544ad9d943..3107bbc106 100644 --- a/app/src/importimageseqdialog.h +++ b/app/src/importimageseqdialog.h @@ -21,6 +21,7 @@ GNU General Public License for more details. #include "importexportdialog.h" #include "pencilerror.h" #include "predefinedsetmodel.h" +#include "importimageconfig.h" class Editor; @@ -52,8 +53,8 @@ class ImportImageSeqDialog : public ImportExportDialog ImportCriteria importCriteria = ImportCriteria::Arbitrary); ~ImportImageSeqDialog() override; - void importArbitrarySequence(); - void importPredefinedSet(); + void importArbitrarySequence(const ImportImageConfig importImageConfig); + void importPredefinedSet(const ImportImageConfig importImageConfig); int getSpace(); void setCore(Editor* editor) { mEditor = editor; } diff --git a/app/src/importpositiondialog.cpp b/app/src/importpositiondialog.cpp index e0b67291ab..8b97019127 100644 --- a/app/src/importpositiondialog.cpp +++ b/app/src/importpositiondialog.cpp @@ -20,10 +20,7 @@ GNU General Public License for more details. #include #include #include "editor.h" -#include "layercamera.h" -#include "viewmanager.h" #include "layermanager.h" -#include "scribblearea.h" ImportPositionDialog::ImportPositionDialog(Editor* editor, QWidget *parent) : QDialog(parent), @@ -59,44 +56,15 @@ ImportPositionDialog::~ImportPositionDialog() void ImportPositionDialog::didChangeComboBoxIndex(const int index) { - mImportOption = ImportPosition::getTypeFromIndex(index); + mImportConfig.positionType = getTypeFromIndex(index); } void ImportPositionDialog::changeImportView() { - mEditor->view()->setImportFollowsCamera(false); - QTransform transform; - if (mImportOption == ImportPosition::Type::CenterOfView) - { - QPointF centralPoint = mEditor->getScribbleArea()->getCentralPoint(); - transform = transform.fromTranslate(centralPoint.x(), centralPoint.y()); - mEditor->view()->setImportView(transform); - QSettings settings(PENCIL2D, PENCIL2D); - settings.setValue(IMPORT_REPOSITION_TYPE, ui->cbImagePosition->currentIndex()); - return; - } - else if (mImportOption == ImportPosition::Type::CenterOfCanvas) - { - transform = transform.fromTranslate(0, 0); - mEditor->view()->setImportView(transform); - QSettings settings(PENCIL2D, PENCIL2D); - settings.setValue(IMPORT_REPOSITION_TYPE, ui->cbImagePosition->currentIndex()); - return; - } - else if (mImportOption == ImportPosition::Type::CenterOfCamera) - { - LayerCamera* layerCam = static_cast(mEditor->layers()->getCameraLayerBelow(mEditor->currentLayerIndex())); - Q_ASSERT(layerCam); - QRectF cameraRect = layerCam->getViewRect(); - transform = transform.fromTranslate(cameraRect.center().x(), cameraRect.center().y()); - mEditor->view()->setImportView(transform); - QSettings settings(PENCIL2D, PENCIL2D); - settings.setValue(IMPORT_REPOSITION_TYPE, ui->cbImagePosition->currentIndex()); - return; + if (mImportConfig.positionType == ImportImageConfig::CenterOfCamera) { + mImportConfig.importFrame = mEditor->currentFrame(); } - Q_ASSERT(mImportOption == ImportPosition::Type::CenterOfCameraFollowed); - mEditor->view()->setImportFollowsCamera(true); QSettings settings(PENCIL2D, PENCIL2D); settings.setValue(IMPORT_REPOSITION_TYPE, ui->cbImagePosition->currentIndex()); } diff --git a/app/src/importpositiondialog.h b/app/src/importpositiondialog.h index d77871a4aa..be363d8ec0 100644 --- a/app/src/importpositiondialog.h +++ b/app/src/importpositiondialog.h @@ -19,6 +19,8 @@ GNU General Public License for more details. #include +#include "importimageconfig.h" + namespace Ui { class ImportPositionDialog; } @@ -29,44 +31,35 @@ class ImportPositionDialog : public QDialog { Q_OBJECT - struct ImportPosition { - - enum Type { - CenterOfView, - CenterOfCanvas, - CenterOfCamera, - CenterOfCameraFollowed, - None - }; - - static Type getTypeFromIndex(int index) { - switch (index) { - case 0: - return CenterOfView; - case 1: - return CenterOfCanvas; - case 2: - return CenterOfCamera; - case 3: - return CenterOfCameraFollowed; - default: - return None; - } - } - }; - public: explicit ImportPositionDialog(Editor* editor, QWidget *parent = nullptr); ~ImportPositionDialog(); + ImportImageConfig importConfig() const { return mImportConfig; } + private slots: void didChangeComboBoxIndex(const int index); void changeImportView(); private: + static ImportImageConfig::PositionType getTypeFromIndex(int index) { + switch (index) { + case 0: + return ImportImageConfig::CenterOfView; + case 1: + return ImportImageConfig::CenterOfCanvas; + case 2: + return ImportImageConfig::CenterOfCamera; + case 3: + return ImportImageConfig::CenterOfCameraFollowed; + default: + return ImportImageConfig::None; + } + } + Ui::ImportPositionDialog *ui; - ImportPosition::Type mImportOption = ImportPosition::None; + ImportImageConfig mImportConfig; Editor* mEditor = nullptr; }; diff --git a/app/src/mainwindow2.cpp b/app/src/mainwindow2.cpp index b4d78b4c74..7a886641d3 100644 --- a/app/src/mainwindow2.cpp +++ b/app/src/mainwindow2.cpp @@ -871,7 +871,8 @@ void MainWindow2::importImage() return; } - Status st = mEditor->importImage(strFilePath); + ImportImageConfig importImageConfig = positionDialog->importConfig(); + Status st = mEditor->importImage(strFilePath, importImageConfig); if (!st.ok()) { ErrorDialog errorDialog(st.title(), st.description(), st.details().html()); @@ -908,7 +909,7 @@ void MainWindow2::importImageSequence() return; } - imageSeqDialog->importArbitrarySequence(); + imageSeqDialog->importArbitrarySequence(positionDialog->importConfig()); mSuppressAutoSaveDialog = false; } @@ -937,7 +938,7 @@ void MainWindow2::importPredefinedImageSet() return; } - imageSeqDialog->importPredefinedSet(); + imageSeqDialog->importPredefinedSet(positionDialog->importConfig()); mSuppressAutoSaveDialog = false; } diff --git a/core_lib/core_lib.pro b/core_lib/core_lib.pro index 54e396635c..f76545784e 100644 --- a/core_lib/core_lib.pro +++ b/core_lib/core_lib.pro @@ -92,6 +92,7 @@ HEADERS += \ src/util/colordictionary.h \ src/util/fileformat.h \ src/util/filetype.h \ + src/util/importimageconfig.h \ src/util/mathutils.h \ src/util/onionskinpainteroptions.h \ src/util/onionskinpaintstate.h \ diff --git a/core_lib/src/interface/editor.cpp b/core_lib/src/interface/editor.cpp index cedc248ab2..51916c3f42 100644 --- a/core_lib/src/interface/editor.cpp +++ b/core_lib/src/interface/editor.cpp @@ -26,6 +26,7 @@ GNU General Public License for more details. #include "vectorimage.h" #include "bitmapimage.h" #include "soundclip.h" +#include "camera.h" #include "layerbitmap.h" #include "layervector.h" #include "layercamera.h" @@ -911,7 +912,7 @@ void Editor::updateObject() emit updateLayerCount(); } -Status Editor::importBitmapImage(const QString& filePath) +Status Editor::importBitmapImage(const QString& filePath, const QTransform& importTransform) { QImageReader reader(filePath); @@ -954,8 +955,8 @@ Status Editor::importBitmapImage(const QString& filePath) status = Status(Status::FAIL, dd, tr("Import failed"), errorDesc); } - const QPoint pos(view()->getImportView().dx() - (img.width() / 2), - view()->getImportView().dy() - (img.height() / 2)); + const QPoint pos = importTransform.map(QPoint(-img.width() / 2, + -img.height() / 2)); if (!layer->keyExists(mFrame)) { @@ -1008,24 +1009,44 @@ Status Editor::importVectorImage(const QString& filePath) return status; } -Status Editor::importImage(const QString& filePath) +Status Editor::importImage(const QString& filePath, const ImportImageConfig importConfig) { Layer* layer = layers()->currentLayer(); DebugDetails dd; dd << QString("Raw file path: %1").arg(filePath); - if (view()->getImportFollowsCamera()) + QTransform transform; + switch (importConfig.positionType) { - LayerCamera* camera = static_cast(layers()->getLastCameraLayer()); - Q_ASSERT(camera); - QTransform transform = camera->getViewAtFrame(currentFrame()); - view()->setImportView(transform); + case ImportImageConfig::CenterOfCamera: { + LayerCamera* layerCam = static_cast(layers()->getCameraLayerBelow(currentLayerIndex())); + Q_ASSERT(layerCam); + transform = layerCam->getViewAtFrame(importConfig.importFrame).inverted(); + break; + } + case ImportImageConfig::CenterOfCameraFollowed: { + LayerCamera* camera = static_cast(layers()->getCameraLayerBelow(currentLayerIndex())); + Q_ASSERT(camera); + transform = camera->getViewAtFrame(currentFrame()).inverted(); + break; + } + case ImportImageConfig::CenterOfView: { + QPointF centralPoint = mScribbleArea->getCentralPoint(); + transform = QTransform::fromTranslate(centralPoint.x(), centralPoint.y()); + break; + } + case ImportImageConfig::CenterOfCanvas: + case ImportImageConfig::None: { + transform = QTransform(); + break; + } } + switch (layer->type()) { case Layer::BITMAP: - return importBitmapImage(filePath); + return importBitmapImage(filePath, transform); case Layer::VECTOR: return importVectorImage(filePath); @@ -1058,8 +1079,8 @@ Status Editor::importAnimatedImage(const QString& filePath, int frameSpacing, co } QImage img(reader.size(), QImage::Format_ARGB32_Premultiplied); - const QPoint pos(view()->getImportView().dx() - (img.width() / 2), - view()->getImportView().dy() - (img.height() / 2)); + const QPoint pos(view()->getView().dx() - (img.width() / 2), + view()->getView().dy() - (img.height() / 2)); int totalFrames = reader.imageCount(); while (reader.read(&img)) { diff --git a/core_lib/src/interface/editor.h b/core_lib/src/interface/editor.h index 61bd2a81d8..8ccd0b49be 100644 --- a/core_lib/src/interface/editor.h +++ b/core_lib/src/interface/editor.h @@ -23,6 +23,7 @@ GNU General Public License for more details. #include #include "pencilerror.h" #include "pencildef.h" +#include "importimageconfig.h" #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) Q_MOC_INCLUDE("colormanager.h") @@ -173,7 +174,7 @@ class Editor : public QObject void clearCurrentFrame(); - Status importImage(const QString& filePath); + Status importImage(const QString& filePath, ImportImageConfig importConfig); Status importAnimatedImage(const QString& filePath, int frameSpacing, const std::function& progressChanged, const std::function& wasCanceled); void restoreKey(); @@ -236,7 +237,7 @@ class Editor : public QObject void resetAutoSaveCounter(); private: - Status importBitmapImage(const QString&); + Status importBitmapImage(const QString&, const QTransform& importTransform); Status importVectorImage(const QString&); void pasteToCanvas(BitmapImage* bitmapImage, int frameNumber); diff --git a/core_lib/src/managers/viewmanager.cpp b/core_lib/src/managers/viewmanager.cpp index d4b7834e5a..29fd4bfda0 100644 --- a/core_lib/src/managers/viewmanager.cpp +++ b/core_lib/src/managers/viewmanager.cpp @@ -311,46 +311,6 @@ void ViewManager::flipVertical(bool b) } } -void ViewManager::setOverlayCenter(bool b) -{ - if (b != mOverlayCenter) - { - mOverlayCenter = b; - updateViewTransforms(); - emit viewChanged(); - } -} - -void ViewManager::setOverlayThirds(bool b) -{ - if (b != mOverlayThirds) - { - mOverlayThirds = b; - updateViewTransforms(); - emit viewChanged(); - } -} - -void ViewManager::setOverlayGoldenRatio(bool b) -{ - if (b != mOverlayGoldenRatio) - { - mOverlayGoldenRatio = b; - updateViewTransforms(); - emit viewChanged(); - } -} - -void ViewManager::setOverlaySafeAreas(bool b) -{ - if (b != mOverlaySafeAreas) - { - mOverlaySafeAreas = b; - updateViewTransforms(); - emit viewChanged(); - } -} - void ViewManager::setCanvasSize(QSize size) { mCanvasSize = size; diff --git a/core_lib/src/managers/viewmanager.h b/core_lib/src/managers/viewmanager.h index 7b7b8ff8e2..8a286e682d 100644 --- a/core_lib/src/managers/viewmanager.h +++ b/core_lib/src/managers/viewmanager.h @@ -80,26 +80,10 @@ class ViewManager : public BaseManager void flipHorizontal(bool b); void flipVertical(bool b); - void setOverlayCenter(bool b); - void setOverlayThirds(bool b); - void setOverlayGoldenRatio(bool b); - void setOverlaySafeAreas(bool b); - bool isFlipHorizontal() const { return mIsFlipHorizontal; } bool isFlipVertical() const { return mIsFlipVertical; } - bool getOverlayCenter() const { return mOverlayCenter; } - bool getOverlayThirds() const { return mOverlayThirds; } - bool getOverlayGoldenRatio() const { return mOverlayGoldenRatio; } - bool getOverlaySafeAreas() const { return mOverlaySafeAreas; } - void setCanvasSize(QSize size); - QTransform getImportView() { return mImportView; } - void setImportView(const QTransform& newView) { mImportView = newView; } - - void setImportFollowsCamera(bool b) { mImportFollowsCamera = b; } - bool getImportFollowsCamera() { return mImportFollowsCamera; } - void forceUpdateViewTransform(); signals: @@ -115,7 +99,6 @@ class ViewManager : public BaseManager QTransform mViewCanvas; QTransform mViewCanvasInverse; QTransform mCentre; - QTransform mImportView; QPointF mTranslation = QPointF(); qreal mScaling = 1.0; @@ -125,12 +108,6 @@ class ViewManager : public BaseManager bool mIsFlipHorizontal = false; bool mIsFlipVertical = false; - bool mOverlayCenter = false; - bool mOverlayThirds = false; - bool mOverlayGoldenRatio = false; - bool mOverlaySafeAreas = false; - - bool mImportFollowsCamera = false; }; #endif // VIEWMANAGER_H diff --git a/core_lib/src/movieimporter.cpp b/core_lib/src/movieimporter.cpp index d9389bf5ae..b3c6b5f371 100644 --- a/core_lib/src/movieimporter.cpp +++ b/core_lib/src/movieimporter.cpp @@ -274,33 +274,22 @@ Status MovieImporter::importMovieVideo(const QString &filePath, int fps, int fra Status MovieImporter::generateFrames(std::function progress) { - Layer* layer = mEditor->layers()->currentLayer(); Status status = Status::OK; int i = 1; QDir tempDir(mTempDir->path()); auto amountOfFrames = tempDir.count(); QString currentFile(tempDir.filePath(QString("%1.png").arg(i, 5, 10, QChar('0')))); - QPoint imgTopLeft; - - ViewManager* viewMan = mEditor->view(); + ImportImageConfig importImageConfig; + importImageConfig.positionType = ImportImageConfig::CenterOfCameraFollowed; while (QFileInfo::exists(currentFile)) { - int currentFrame = mEditor->currentFrame(); - if(layer->keyExists(mEditor->currentFrame())) { - mEditor->importImage(currentFile); - } - else { - BitmapImage* bitmapImage = new BitmapImage(imgTopLeft, currentFile); - if(imgTopLeft.isNull()) { - imgTopLeft.setX(static_cast(viewMan->getImportView().dx()) - bitmapImage->image()->width() / 2); - imgTopLeft.setY(static_cast(viewMan->getImportView().dy()) - bitmapImage->image()->height() / 2); - bitmapImage->moveTopLeft(imgTopLeft); - } - layer->addKeyFrame(currentFrame, bitmapImage); - mEditor->layers()->notifyAnimationLengthChanged(); - mEditor->scrubTo(currentFrame + 1); + status = mEditor->importImage(currentFile, importImageConfig); + + if (!status.ok()) { + break; } + if (mCanceled) return Status::CANCELED; progress(qFloor(50 + i / static_cast(amountOfFrames) * 50)); i++; diff --git a/core_lib/src/util/importimageconfig.h b/core_lib/src/util/importimageconfig.h new file mode 100644 index 0000000000..a7d4e59cd6 --- /dev/null +++ b/core_lib/src/util/importimageconfig.h @@ -0,0 +1,35 @@ +/* + +Pencil2D - Traditional Animation Software +Copyright (C) 2005-2007 Patrick Corrieri & Pascal Naidon +Copyright (C) 2012-2020 Matthew Chiawen Chang + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +*/ + +#ifndef IMPORTIMAGECONFIG_H +#define IMPORTIMAGECONFIG_H + +struct ImportImageConfig +{ + enum PositionType { + CenterOfView, + CenterOfCanvas, + CenterOfCamera, + CenterOfCameraFollowed, + None + }; + + int importFrame = 1; + PositionType positionType = None; +}; + +#endif // IMPORTIMAGECONFIG_H