From 22ef3494e08516140509960e9d37312693a9747d Mon Sep 17 00:00:00 2001 From: Elias Date: Thu, 28 Mar 2019 21:26:47 +0100 Subject: [PATCH] Add ability to save wallpapers Add preview Cleanup --- .../CreateWallpaperVideoImportConvert.qml | 89 +++++++++---------- .../CreateWallpaper/CreateWallpaperWizard.qml | 33 +++---- ScreenPlay/src/create.cpp | 17 +++- ScreenPlay/src/create.h | 20 ++++- ScreenPlay/src/createimportvideo.cpp | 19 ++-- ScreenPlay/src/createimportvideo.h | 1 + 6 files changed, 102 insertions(+), 77 deletions(-) diff --git a/ScreenPlay/qml/Create/Wizards/CreateWallpaper/CreateWallpaperVideoImportConvert.qml b/ScreenPlay/qml/Create/Wizards/CreateWallpaper/CreateWallpaperVideoImportConvert.qml index 0deae9ef..1cfd1e57 100644 --- a/ScreenPlay/qml/Create/Wizards/CreateWallpaper/CreateWallpaperVideoImportConvert.qml +++ b/ScreenPlay/qml/Create/Wizards/CreateWallpaper/CreateWallpaperVideoImportConvert.qml @@ -3,14 +3,16 @@ import QtGraphicalEffects 1.0 import QtQuick.Controls 2.2 import QtQuick.Controls.Material 2.3 import Qt.labs.platform 1.0 -import QtQuick.Layouts 1.3 +import QtQuick.Layouts 1.12 + import net.aimber.create 1.0 Item { id: wrapperContent - - property string customVideoPreviewPath: "" + property bool conversionFinishedSuccessful: false + property bool canSave: false + signal save Text { id: txtHeadline @@ -96,18 +98,15 @@ Item { imgPreview.source = "file:///" + screenPlayCreate.workingDir + "/preview.png" imgPreview.visible = true - txtConvert.text = qsTr( - "Converting Video preview mp4") + txtConvert.text = qsTr("Converting Video preview mp4") } if (state === CreateImportVideo.State.ConvertingPreviewVideo) { - txtConvert.text = qsTr( - "Generating preview video...") + txtConvert.text = qsTr("Generating preview video...") } if (state === CreateImportVideo.State.ConvertingPreviewGif) { - txtConvert.text = qsTr( - "Generating preview gif...") + txtConvert.text = qsTr("Generating preview gif...") } if (state === CreateImportVideo.State.ConvertingPreviewGifFinished) { @@ -124,8 +123,9 @@ Item { } if (state === CreateImportVideo.State.Finished) { - imgSuccess.source = "file:///" - + screenPlayCreate.workingDir + "/preview.gif" + txtConvert.text = "" + conversionFinishedSuccessful = true + busyIndicator.running = false } } onProgressChanged: { @@ -151,16 +151,17 @@ Item { Rectangle { height: 50 color: "#eeeeee" - Layout.fillWidth: true + Layout.preferredWidth: imgWrapper.width Text { id: txtCustomPreviewPath color: "#333333" + text: qsTr("Add custom preview image") anchors { verticalCenter: parent.verticalCenter left: parent.left - leftMargin: 10 + leftMargin: 20 } } @@ -176,10 +177,9 @@ Item { onClicked: fileDialogOpenFile.open() } - FileDialog { id: fileDialogOpenFile - nameFilters: ["*.png *.jpg"] + nameFilters: [] onAccepted: { var file = fileDialogOpenFile.file.toString() @@ -207,44 +207,44 @@ Item { right: parent.right left: parent.left margins: 30 - top:parent.top + top: parent.top topMargin: 0 bottom: column1.top bottomMargin: 50 } TextField { - id: textField + id: textFieldName placeholderText: qsTr("Name") - width:parent.width + width: parent.width Layout.fillWidth: true onTextChanged: { - if (textField.text.length >= 3) { - canNext = true + if (textFieldName.text.length >= 3) { + canSave = true } else { - canNext = false + canSave = false } } } TextField { - id: textField1 + id: textFieldDescription placeholderText: qsTr("Description") - width:parent.width + width: parent.width Layout.fillWidth: true } TextField { - id: textField2 + id: textFieldYoutubeURL placeholderText: qsTr("Youtube URL") - width:parent.width + width: parent.width Layout.fillWidth: true } TextField { - id: textField3 - width:parent.width - placeholderText: qsTr("Tags") + id: textFieldTags + width: parent.width + placeholderText: qsTr("Tags (seperate with comma)") Layout.fillWidth: true } } @@ -271,33 +271,32 @@ Item { } } - NextButton { + Button { id: btnFinish - onClicked: { - if (btnFinish.state === "enabled" && canNext) { - screenPlayCreate.createWallpaperProjectFile( - textField.text, textField1.text) - utility.setNavigationActive(true) - createNew.state = "success" + text: qsTr("Save") + Material.background: Material.Gray + Material.foreground: "white" + enabled: { + if (canSave && conversionFinishedSuccessful) { + return true + } else { + return false } } - } - } - Connections { - target: screenPlayCreate - onCreateWallpaperStateChanged: { - if (state === CreateImportVideo.State.ConvertingVideoFinished) { - btnFinish.state = "enabled" + onClicked: { + if (conversionFinishedSuccessful) { + screenPlayCreate.saveWallpaper( + textFieldName.text, textFieldDescription.text, textFieldYoutubeURL.text, textFieldTags.text) + } } } } } } - - /*##^## Designer { - D{i:0;autoSize:true;height:480;width:640} + D{i:0;autoSize:true;height:480;width:950} } ##^##*/ + diff --git a/ScreenPlay/qml/Create/Wizards/CreateWallpaper/CreateWallpaperWizard.qml b/ScreenPlay/qml/Create/Wizards/CreateWallpaper/CreateWallpaperWizard.qml index 45c443e5..dba3fe16 100644 --- a/ScreenPlay/qml/Create/Wizards/CreateWallpaper/CreateWallpaperWizard.qml +++ b/ScreenPlay/qml/Create/Wizards/CreateWallpaper/CreateWallpaperWizard.qml @@ -30,12 +30,14 @@ Item { Connections { target: screenPlayCreate onCreateWallpaperStateChanged: { - - if (state === CreateImportVideo.State.ConvertingPreviewGifError + if (state === CreateImportVideo.State.AnalyseVideoError || state === CreateImportVideo.State.ConvertingPreviewVideoError + || state === CreateImportVideo.State.ConvertingPreviewGifError || state === CreateImportVideo.State.ConvertingPreviewImageError - || state === CreateImportVideo.State.AnalyseVideoError) { - createNew.state = "error" + || state === CreateImportVideo.State.ConvertingAudioError + || state === CreateImportVideo.State.AbortCleanupError + || state === CreateImportVideo.State.ErrorUnknown) { + createNew.state = "result" } } } @@ -84,6 +86,12 @@ Item { id: loader_wrapperContent anchors.fill: parent z: 10 + Connections { + target: loader_wrapperContent.sourceComponent + onSave:{ + createNew.state = "result" + } + } } CreateWallpaperResult { @@ -275,7 +283,7 @@ Item { }, Transition { from: "in" - to: "error" + to: "result" SequentialAnimation { PropertyAnimation { target: loader_wrapperContent @@ -293,21 +301,6 @@ Item { easing.type: Easing.OutQuart } } - }, - Transition { - from: "in" - to: "success" - SequentialAnimation { - PropertyAnimation { - target: loader_wrapperContent - duration: 600 - property: "opacity" - easing.type: Easing.OutQuart - } - PauseAnimation { - duration: 50 - } - } } ] } diff --git a/ScreenPlay/src/create.cpp b/ScreenPlay/src/create.cpp index e2f9771b..d349c285 100644 --- a/ScreenPlay/src/create.cpp +++ b/ScreenPlay/src/create.cpp @@ -55,18 +55,20 @@ void Create::createWallpaperStart(QString videoPath) videoPath.remove("file:///"); QDir dir; - dir.cd(this->m_settings->localStoragePath().toLocalFile()); + dir.cd(m_settings->localStoragePath().toLocalFile()); // Create a temp dir so we can later alter it to the workshop id auto folderName = QString("_tmp_" + QTime::currentTime().toString()).replace(":", ""); if (!dir.mkdir(folderName)) { + emit createWallpaperStateChanged(CreateImportVideo::State::CreateTmpFolderError); emit abortCreateWallpaper(); return; } + setWorkingDir(dir.path() + "/" + folderName); m_createImportVideoThread = new QThread; - m_createImportVideo = new CreateImportVideo(videoPath, dir.path() + "/" + folderName); + m_createImportVideo = new CreateImportVideo(videoPath, workingDir()); connect(m_createImportVideo, &CreateImportVideo::createWallpaperStateChanged, this, &Create::createWallpaperStateChanged); connect(m_createImportVideoThread, &QThread::started, m_createImportVideo, &CreateImportVideo::process); @@ -78,8 +80,17 @@ void Create::createWallpaperStart(QString videoPath) m_createImportVideoThread->start(); } +void Create::createWallpaperProjectFile(QString name, QString description, QString youtube, QStringList tags) +{ + +} + void Create::abortAndCleanup() { + if (m_createImportVideo != nullptr || m_createImportVideoThread != nullptr) { + return; + } + // Save to export path before aborting to be able to cleanup the tmp folder QString tmpExportPath = m_createImportVideo->m_exportPath; @@ -94,6 +105,8 @@ void Create::abortAndCleanup() qDebug() << "cleanup " << tmpExportPath; } } + m_createImportVideo = nullptr; + m_createImportVideoThread = nullptr; }); m_createImportVideoThread->requestInterruption(); } diff --git a/ScreenPlay/src/create.h b/ScreenPlay/src/create.h index 1626357b..259c665f 100644 --- a/ScreenPlay/src/create.h +++ b/ScreenPlay/src/create.h @@ -31,6 +31,7 @@ class Create : public QObject { public: explicit Create(Settings* st, QMLUtilities* util, QObject* parent = nullptr); + Q_PROPERTY(QString workingDir READ workingDir WRITE setWorkingDir NOTIFY workingDirChanged) Q_PROPERTY(float progress READ progress WRITE setProgress NOTIFY progressChanged) Create() {} @@ -41,17 +42,24 @@ public: return m_progress; } + QString workingDir() const + { + return m_workingDir; + } + signals: void createWallpaperStateChanged(CreateImportVideo::State state); void processOutput(QString text); void progressChanged(float progress); void abortCreateWallpaper(); + void workingDirChanged(QString workingDir); public slots: void copyProject(QString relativeProjectPath, QString toPath); bool copyRecursively(const QString& srcFilePath, const QString& tgtFilePath); - void abortAndCleanup(); void createWallpaperStart(QString videoPath); + void saveWallpaper(QString name, QString description, QString youtube, QString tags); + void abortAndCleanup(); void setProgress(float progress) { @@ -62,6 +70,15 @@ public slots: emit progressChanged(m_progress); } + void setWorkingDir(QString workingDir) + { + if (m_workingDir == workingDir) + return; + + m_workingDir = workingDir; + emit workingDirChanged(m_workingDir); + } + private: CreateImportVideo* m_createImportVideo; Settings* m_settings; @@ -69,4 +86,5 @@ private: QMLUtilities* m_utils; float m_progress = 0.0f; + QString m_workingDir; }; diff --git a/ScreenPlay/src/createimportvideo.cpp b/ScreenPlay/src/createimportvideo.cpp index bf421055..e3c56cd4 100644 --- a/ScreenPlay/src/createimportvideo.cpp +++ b/ScreenPlay/src/createimportvideo.cpp @@ -14,11 +14,13 @@ CreateImportVideo::CreateImportVideo(QString videoPath, QString exportPath, QObj void CreateImportVideo::process() { - qDebug() << "start converting video" << QThread::currentThreadId(); + qDebug() << "start converting video in thread: " << QThread::currentThreadId(); createWallpaperInfo(); createWallpaperVideoPreview(); createWallpaperGifPreview(); extractWallpaperAudio(); + emit createWallpaperStateChanged(CreateImportVideo::State::Finished); + emit finished(); } @@ -117,20 +119,20 @@ bool CreateImportVideo::createWallpaperVideoPreview() { QStringList args; - // args.append("-loglevel"); - // args.append("error"); - // args.append("-y"); - // args.append("-stats"); + args.append("-loglevel"); + args.append("error"); + args.append("-y"); + args.append("-stats"); args.append("-i"); args.append(m_videoPath); - //args.append("-vf"); + args.append("-vf"); // We allways want to have a 5 second clip via 24fps -> 120 frames // Divided by the number of frames we can skip (timeInSeconds * Framrate) // scale & crop parameter: https://unix.stackexchange.com/a/284731 - //args.append("select='not(mod(n," + QString::number((m_length / 5)) + "))',setpts=N/FRAME_RATE/TB,crop=in_h*16/9:in_h,scale=-2:400"); + args.append("select='not(mod(n," + QString::number((m_length / 5)) + "))',setpts=N/FRAME_RATE/TB,crop=in_h*16/9:in_h,scale=-2:400"); // Disable audio - //args.append("-an"); + args.append("-an"); args.append(m_exportPath + "/preview.webm"); QScopedPointer proConvertPreviewWebM(new QProcess()); @@ -143,7 +145,6 @@ bool CreateImportVideo::createWallpaperVideoPreview() #endif emit createWallpaperStateChanged(CreateImportVideo::State::ConvertingPreviewVideo); - proConvertPreviewWebM.data()->start(); while (!proConvertPreviewWebM.data()->waitForFinished(100)) //Wake up every 100ms and check if we must exit { diff --git a/ScreenPlay/src/createimportvideo.h b/ScreenPlay/src/createimportvideo.h index 9c5cc57d..55a9633f 100644 --- a/ScreenPlay/src/createimportvideo.h +++ b/ScreenPlay/src/createimportvideo.h @@ -45,6 +45,7 @@ public: // ConvertingVideoFinished, // ConvertingVideoError, AbortCleanupError, + CreateTmpFolderError, Finished, ErrorUnknown, };