1
0
mirror of https://gitlab.com/kelteseth/ScreenPlay.git synced 2024-11-25 12:13:00 +01:00

Rewrite video convert to fix threading issues

Add unit tests for video import
This commit is contained in:
Elias Steurer 2021-08-28 17:54:19 +02:00
parent 8acf666b7d
commit 122d2c7869
25 changed files with 627 additions and 511 deletions

View File

@ -35,6 +35,7 @@ set(headers
app.h
src/globalvariables.h
src/createimportvideo.h
src/createimportstates.h
src/installedlistmodel.h
src/monitorlistmodel.h
src/screenplaywallpaper.h

View File

@ -105,7 +105,7 @@ ApplicationWindow {
StackView {
id: stackView
objectName: "stackView"
property int duration: 300
anchors {

View File

@ -11,6 +11,7 @@ import ScreenPlay.QMLUtilities 1.0
Rectangle {
id: root
objectName: "createSidebar"
property bool expanded: false
property alias listView: listView
@ -87,6 +88,7 @@ Rectangle {
*/
id: listView
objectName: "wizardsListView"
anchors.fill: parent
anchors.margins: 20
@ -119,9 +121,10 @@ Rectangle {
}
ListElement {
headline: "Video import and convert (all types)"
headline: qsTr("Video import and convert (all types)")
source: "qrc:/qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaper.qml"
category: "Video Wallpaper"
objectName: "videoImportConvert"
}
ListElement {
@ -193,7 +196,7 @@ Rectangle {
delegate: Button {
id: listItem
objectName: model.objectName
width: listView.width - 40
height: 45
highlighted: ListView.isCurrentItem

View File

@ -21,12 +21,14 @@ Item {
clip: true
CreateWallpaperInit {
onNext: {
onNext: startConvert(filePath,codec);
function startConvert(filePath,codec){
root.wizardStarted();
swipeView.currentIndex = 1;
createWallpaperVideoImportConvert.codec = codec;
createWallpaperVideoImportConvert.filePath = filePath;
ScreenPlay.create.createWallpaperStart(filePath, codec, quality);
}
}

View File

@ -10,6 +10,7 @@ import "../../../Common" as Common
Item {
id: root
objectName: "createWallpaperInit"
property int quality: sliderQuality.slider.value
@ -127,6 +128,7 @@ Item {
}
Button {
objectName: "createWallpaperInitFileSelectButton"
text: qsTr("Select file")
highlighted: true
font.family: ScreenPlay.settings.font

View File

@ -5,6 +5,7 @@ import QtQuick.Controls.Material 2.3
import QtQuick.Layouts 1.12
import ScreenPlay 1.0
import ScreenPlay.Create 1.0
import ScreenPlay.Enums.ImportVideoState 1.0
import "../../../Common" as Common
Item {
@ -15,86 +16,87 @@ Item {
property var codec: Create.VP8
property string filePath
signal abort()
signal save()
signal abort
signal save
function cleanup() {
ScreenPlay.create.abortAndCleanup();
ScreenPlay.create.cancel()
}
function basename(str) {
let filenameWithExtentions = (str.slice(str.lastIndexOf("/") + 1));
let filename = filenameWithExtentions.split('.').slice(0, -1).join('.');
return filename;
let filenameWithExtentions = (str.slice(str.lastIndexOf("/") + 1))
let filename = filenameWithExtentions.split('.').slice(0, -1).join('.')
return filename
}
function checkCanSave() {
if (canSave && conversionFinishedSuccessful)
btnSave.enabled = true;
btnSave.enabled = true
else
btnSave.enabled = false;
btnSave.enabled = false
}
onCanSaveChanged: root.checkCanSave()
onFilePathChanged: {
textFieldName.text = basename(filePath);
textFieldName.text = basename(filePath)
}
Connections {
function onCreateWallpaperStateChanged(state) {
switch (state) {
case CreateImportVideo.ConvertingPreviewImage:
txtConvert.text = qsTr("Generating preview image...");
break;
case CreateImportVideo.ConvertingPreviewThumbnailImage:
txtConvert.text = qsTr("Generating preview thumbnail image...");
break;
case CreateImportVideo.ConvertingPreviewImageFinished:
imgPreview.source = "file:///" + ScreenPlay.create.workingDir + "/preview.jpg";
imgPreview.visible = true;
break;
case CreateImportVideo.ConvertingPreviewVideo:
txtConvert.text = qsTr("Generating 5 second preview video...");
break;
case CreateImportVideo.ConvertingPreviewGif:
txtConvert.text = qsTr("Generating preview gif...");
break;
case CreateImportVideo.ConvertingPreviewGifFinished:
gifPreview.source = "file:///" + ScreenPlay.create.workingDir + "/preview.gif";
imgPreview.visible = false;
gifPreview.visible = true;
gifPreview.playing = true;
break;
case CreateImportVideo.ConvertingAudio:
txtConvert.text = qsTr("Converting Audio...");
break;
case CreateImportVideo.ConvertingVideo:
txtConvert.text = qsTr("Converting Video... This can take some time!");
break;
case CreateImportVideo.ConvertingVideoError:
txtConvert.text = qsTr("Converting Video ERROR!");
break;
case CreateImportVideo.AnalyseVideoError:
txtConvert.text = qsTr("Analyse Video ERROR!");
break;
case CreateImportVideo.Finished:
txtConvert.text = "";
conversionFinishedSuccessful = true;
busyIndicator.running = false;
root.checkCanSave();
break;
case ImportVideoState.ConvertingPreviewImage:
txtConvert.text = qsTr("Generating preview image...")
break
case ImportVideoState.ConvertingPreviewThumbnailImage:
txtConvert.text = qsTr("Generating preview thumbnail image...")
break
case ImportVideoState.ConvertingPreviewImageFinished:
imgPreview.source = "file:///" + ScreenPlay.create.workingDir + "/preview.jpg"
imgPreview.visible = true
break
case ImportVideoState.ConvertingPreviewVideo:
txtConvert.text = qsTr("Generating 5 second preview video...")
break
case ImportVideoState.ConvertingPreviewGif:
txtConvert.text = qsTr("Generating preview gif...")
break
case ImportVideoState.ConvertingPreviewGifFinished:
gifPreview.source = "file:///" + ScreenPlay.create.workingDir + "/preview.gif"
imgPreview.visible = false
gifPreview.visible = true
gifPreview.playing = true
break
case ImportVideoState.ConvertingAudio:
txtConvert.text = qsTr("Converting Audio...")
break
case ImportVideoState.ConvertingVideo:
txtConvert.text = qsTr(
"Converting Video... This can take some time!")
break
case ImportVideoState.ConvertingVideoError:
txtConvert.text = qsTr("Converting Video ERROR!")
break
case ImportVideoState.AnalyseVideoError:
txtConvert.text = qsTr("Analyse Video ERROR!")
break
case ImportVideoState.Finished:
txtConvert.text = ""
conversionFinishedSuccessful = true
busyIndicator.running = false
root.checkCanSave()
break
}
}
function onProgressChanged(progress) {
var percentage = Math.floor(progress * 100);
var percentage = Math.floor(progress * 100)
if (percentage > 100 || progress > 0.95)
percentage = 100;
percentage = 100
if (percentage === NaN)
print(progress, percentage);
print(progress, percentage)
txtConvertNumber.text = percentage + "%";
txtConvertNumber.text = percentage + "%"
}
target: ScreenPlay.create
@ -116,7 +118,6 @@ Item {
margins: 40
bottomMargin: 0
}
}
Item {
@ -186,9 +187,7 @@ Item {
position: 1
color: "#00000000"
}
}
}
BusyIndicator {
@ -211,7 +210,6 @@ Item {
bottom: parent.bottom
bottomMargin: 40
}
}
Text {
@ -227,9 +225,7 @@ Item {
bottom: parent.bottom
bottomMargin: 20
}
}
}
Common.ImageSelector {
@ -243,9 +239,7 @@ Item {
left: parent.left
bottom: parent.bottom
}
}
}
Item {
@ -283,9 +277,9 @@ Item {
Layout.fillWidth: true
onTextChanged: {
if (textFieldName.text.length >= 3)
canSave = true;
canSave = true
else
canSave = false;
canSave = false
}
}
@ -311,7 +305,6 @@ Item {
width: parent.width
Layout.fillWidth: true
}
}
Row {
@ -336,14 +329,14 @@ Item {
Material.foreground: "white"
font.family: ScreenPlay.settings.font
onClicked: {
root.abort();
ScreenPlay.create.abortAndCleanup();
root.abort()
ScreenPlay.create.cancel()
}
}
Button {
id: btnSave
objectName: "btnSave"
text: qsTr("Save")
enabled: false
Material.background: Material.accent
@ -351,16 +344,18 @@ Item {
font.family: ScreenPlay.settings.font
onClicked: {
if (conversionFinishedSuccessful) {
btnSave.enabled = false;
ScreenPlay.create.saveWallpaper(textFieldName.text, textFieldDescription.text, root.filePath, previewSelector.imageSource, textFieldYoutubeURL.text, codec, textFieldTags.getTags());
savePopup.open();
ScreenPlay.installedListModel.reset();
btnSave.enabled = false
ScreenPlay.create.saveWallpaper(
textFieldName.text,
textFieldDescription.text, root.filePath,
previewSelector.imageSource,
textFieldYoutubeURL.text, codec,
textFieldTags.getTags())
savePopup.open()
}
}
}
}
}
Popup {
@ -392,12 +387,10 @@ Item {
interval: 1000 + Math.random() * 1000
onTriggered: {
savePopup.close();
ScreenPlay.util.setNavigationActive(true);
ScreenPlay.util.setNavigation("Installed");
savePopup.close()
ScreenPlay.util.setNavigationActive(true)
ScreenPlay.util.setNavigation("Installed")
}
}
}
}

View File

@ -5,6 +5,7 @@ import QtQuick.Controls.Material 2.3
import QtQuick.Layouts 1.12
import ScreenPlay 1.0
import ScreenPlay.Create 1.0
import ScreenPlay.Enums.ImportVideoState 1.0
import "../../../Common" as Common
Item {
@ -38,44 +39,44 @@ Item {
Connections {
function onCreateWallpaperStateChanged(state) {
switch (state) {
case CreateImportVideo.AnalyseVideo:
case ImportVideoState.AnalyseVideo:
txtConvert.text = qsTr("AnalyseVideo...");
break;
case CreateImportVideo.ConvertingPreviewImage:
case ImportVideoState.ConvertingPreviewImage:
txtConvert.text = qsTr("Generating preview image...");
break;
case CreateImportVideo.ConvertingPreviewThumbnailImage:
case ImportVideoState.ConvertingPreviewThumbnailImage:
txtConvert.text = qsTr("Generating preview thumbnail image...");
break;
case CreateImportVideo.ConvertingPreviewImageFinished:
case ImportVideoState.ConvertingPreviewImageFinished:
imgPreview.source = "file:///" + ScreenPlay.create.workingDir + "/preview.jpg";
imgPreview.visible = true;
break;
case CreateImportVideo.ConvertingPreviewVideo:
case ImportVideoState.ConvertingPreviewVideo:
txtConvert.text = qsTr("Generating 5 second preview video...");
break;
case CreateImportVideo.ConvertingPreviewGif:
case ImportVideoState.ConvertingPreviewGif:
txtConvert.text = qsTr("Generating preview gif...");
break;
case CreateImportVideo.ConvertingPreviewGifFinished:
case ImportVideoState.ConvertingPreviewGifFinished:
gifPreview.source = "file:///" + ScreenPlay.create.workingDir + "/preview.gif";
imgPreview.visible = false;
gifPreview.visible = true;
gifPreview.playing = true;
break;
case CreateImportVideo.ConvertingAudio:
case ImportVideoState.ConvertingAudio:
txtConvert.text = qsTr("Converting Audio...");
break;
case CreateImportVideo.ConvertingVideo:
case ImportVideoState.ConvertingVideo:
txtConvert.text = qsTr("Converting Video... This can take some time!");
break;
case CreateImportVideo.ConvertingVideoError:
case ImportVideoState.ConvertingVideoError:
txtConvert.text = qsTr("Converting Video ERROR!");
break;
case CreateImportVideo.AnalyseVideoError:
case ImportVideoState.AnalyseVideoError:
txtConvert.text = qsTr("Analyse Video ERROR!");
break;
case CreateImportVideo.Finished:
case ImportVideoState.Finished:
txtConvert.text = "";
conversionFinishedSuccessful = true;
busyIndicator.running = false;
@ -330,13 +331,13 @@ Item {
font.family: ScreenPlay.settings.font
onClicked: {
root.exit();
ScreenPlay.create.abortAndCleanup();
ScreenPlay.create.cancel();
}
}
Button {
id: btnSave
objectName: "btnSave"
text: qsTr("Save")
enabled: false
Material.background: Material.accent
@ -347,7 +348,6 @@ Item {
btnSave.enabled = false;
ScreenPlay.create.saveWallpaper(textFieldName.text, textFieldDescription.text, root.filePath, previewSelector.imageSource, textFieldYoutubeURL.text, Create.VP9, textFieldTags.getTags());
savePopup.open();
ScreenPlay.installedListModel.reset();
}
}
}

View File

@ -65,7 +65,7 @@ FocusScope {
Button {
id: btnSave
objectName: "btnSave"
text: qsTr("Save")
enabled: root.ready
Material.background: Material.accent

View File

@ -5,6 +5,7 @@ import ScreenPlay 1.0
Item {
id: navigationItem
objectName: txt.text
property string iconSource: "qrc:/assets/icons/icon_installed.svg"
property alias name: txt.text

View File

@ -10,23 +10,16 @@ namespace ScreenPlay {
As for this writing (April 2019) it is solely used to import webm wallpaper
and create the gif/web 5 second previews.
*/
/*!
Constructor.
*/
Create::Create(const std::shared_ptr<GlobalVariables>& globalVariables, QObject* parent)
: QObject(parent)
Create::Create(const std::shared_ptr<GlobalVariables>& globalVariables)
: QObject(nullptr)
, m_globalVariables(globalVariables)
{
qRegisterMetaType<CreateImportVideo::ImportVideoState>("CreateImportVideo::ImportVideoState");
qRegisterMetaType<Create::VideoCodec>("Create::VideoCodec");
qmlRegisterUncreatableType<CreateImportVideo>("ScreenPlay.Create", 1, 0, "CreateImportVideo", "Error only for enums");
qmlRegisterUncreatableType<Create>("ScreenPlay.Create", 1, 0, "VideoCodec", "Error only for enums");
qmlRegisterType<Create>("ScreenPlay.Create", 1, 0, "Create");
init();
}
/*!
@ -35,19 +28,36 @@ Create::Create(const std::shared_ptr<GlobalVariables>& globalVariables, QObject*
Create::Create()
: QObject(nullptr)
{
qRegisterMetaType<CreateImportVideo::ImportVideoState>("CreateImportVideo::ImportVideoState");
qRegisterMetaType<Create::VideoCodec>("Create::VideoCodec");
qmlRegisterUncreatableType<ScreenPlay::CreateImportVideo>("ScreenPlay.Create", 1, 0, "CreateImportVideo", "Error only for enums");
qmlRegisterUncreatableType<Create>("ScreenPlay.Create", 1, 0, "VideoCodec", "Error only for enums");
qmlRegisterType<Create>("ScreenPlay.Create", 1, 0, "Create");
init();
}
void Create::init()
{
qRegisterMetaType<Create::VideoCodec>("Create::VideoCodec");
qmlRegisterUncreatableType<Create>("ScreenPlay.Create", 1, 0, "VideoCodec", "Error only for enums");
qmlRegisterType<Create>("ScreenPlay.Create", 1, 0, "Create");
qRegisterMetaType<ImportVideoState::ImportVideoState>("ImportVideoState::ImportVideoState");
qmlRegisterUncreatableMetaObject(ScreenPlay::ImportVideoState::staticMetaObject,
"ScreenPlay.Enums.ImportVideoState",
1, 0,
"ImportVideoState",
"Error: only enums");
}
void Create::reset()
{
clearFfmpegOutput();
m_interrupt = false;
setProgress(0.);
setWorkingDir({});
}
/*!
\brief Starts the process.
*/
void Create::createWallpaperStart(QString videoPath, Create::VideoCodec codec, const int quality)
{
clearFfmpegOutput();
reset();
videoPath = ScreenPlayUtil::toLocal(videoPath);
const QDir dir(m_globalVariables->localStoragePath().toLocalFile());
@ -56,10 +66,11 @@ void Create::createWallpaperStart(QString videoPath, Create::VideoCodec codec, c
const auto folderName = QString("_tmp_" + QTime::currentTime().toString()).replace(":", "");
if (!dir.mkdir(folderName)) {
emit createWallpaperStateChanged(CreateImportVideo::ImportVideoState::CreateTmpFolderError);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::CreateTmpFolderError);
emit abortCreateWallpaper();
return;
}
setWorkingDir(dir.path() + "/" + folderName);
QString target_codec;
@ -75,34 +86,100 @@ void Create::createWallpaperStart(QString videoPath, Create::VideoCodec codec, c
break;
}
m_createImportVideoThread = std::make_unique<QThread>();
m_createImportVideo = std::make_unique<CreateImportVideo>(videoPath, workingDir(), target_codec, quality);
connect(m_createImportVideo.get(), &CreateImportVideo::processOutput, this, [this](QString text) {
appendFfmpegOutput(text + "\n");
m_createImportFuture = QtConcurrent::run(QThreadPool::globalInstance(), [videoPath, target_codec, quality, this]() {
CreateImportVideo import(videoPath, workingDir(), target_codec, quality, m_interrupt);
QObject::connect(&import, &CreateImportVideo::createWallpaperStateChanged, this, &Create::createWallpaperStateChanged, Qt::ConnectionType::QueuedConnection);
QObject::connect(&import, &CreateImportVideo::abortAndCleanup, this, &Create::abortAndCleanup, Qt::ConnectionType::QueuedConnection);
QObject::connect(
&import, &CreateImportVideo::processOutput, this, [this](const QString text) {
appendFfmpegOutput(text + "\n");
},
Qt::ConnectionType::QueuedConnection);
if (!import.createWallpaperInfo() || m_interrupt) {
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::Failed);
emit import.abortAndCleanup();
return;
}
qInfo() << "createWallpaperImageThumbnailPreview()";
if (!import.createWallpaperImageThumbnailPreview() || m_interrupt) {
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::Failed);
emit import.abortAndCleanup();
return;
}
qInfo() << "createWallpaperImagePreview()";
if (!import.createWallpaperImagePreview() || m_interrupt) {
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::Failed);
emit import.abortAndCleanup();
return;
}
qInfo() << "createWallpaperVideoPreview()";
if (!import.createWallpaperVideoPreview() || m_interrupt) {
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::Failed);
emit import.abortAndCleanup();
return;
}
qInfo() << "createWallpaperGifPreview()";
if (!import.createWallpaperGifPreview() || m_interrupt) {
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::Failed);
emit import.abortAndCleanup();
return;
}
// If the video has no audio we can skip the extraction
if (!import.m_skipAudio) {
qInfo() << "extractWallpaperAudio()";
if (!import.extractWallpaperAudio() || m_interrupt) {
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::Failed);
emit import.abortAndCleanup();
return;
}
}
// Skip convert for webm
if (import.m_isWebm) {
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::Finished);
return;
}
qInfo() << "createWallpaperVideo()";
if (!import.createWallpaperVideo() || m_interrupt) {
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::Failed);
emit import.abortAndCleanup();
return;
}
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::Finished);
});
connect(m_createImportVideo.get(), &CreateImportVideo::createWallpaperStateChanged, this, &Create::createWallpaperStateChanged);
connect(m_createImportVideo.get(), &CreateImportVideo::progressChanged, this, &Create::setProgress);
connect(m_createImportVideoThread.get(), &QThread::started, m_createImportVideo.get(), &CreateImportVideo::process);
connect(m_createImportVideo.get(), &CreateImportVideo::abortAndCleanup, this, &Create::abortAndCleanup);
QObject::connect(&m_createImportFutureWatcher, &QFutureWatcherBase::finished, this, [this]() {
if (m_interrupt)
abortAndCleanup();
});
connect(m_createImportVideo.get(), &CreateImportVideo::finished, m_createImportVideoThread.get(), &QThread::quit);
connect(m_createImportVideo.get(), &CreateImportVideo::finished, m_createImportVideo.get(), &QObject::deleteLater);
connect(m_createImportVideoThread.get(), &QThread::finished, m_createImportVideoThread.get(), &QObject::deleteLater);
m_createImportVideo->moveToThread(m_createImportVideoThread.get());
m_createImportVideoThread->start();
m_createImportFutureWatcher.setFuture(m_createImportFuture);
}
/*!
\brief When converting of the wallpaper steps where successful.
*/
void Create::saveWallpaper(QString title, QString description, QString filePath, QString previewImagePath, QString youtube, Create::VideoCodec codec, QVector<QString> tags)
void Create::saveWallpaper(
const QString title,
const QString description,
QString filePath,
QString previewImagePath,
const QString youtube,
const Create::VideoCodec codec,
const QVector<QString> tags)
{
filePath = ScreenPlayUtil::toLocal(filePath);
previewImagePath = ScreenPlayUtil::toLocal(previewImagePath);
emit createWallpaperStateChanged(CreateImportVideo::ImportVideoState::CopyFiles);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::CopyFiles);
// Case when the selected users preview image has the same name as
// our default "preview.jpg" name. QFile::copy does no override exsisting files
@ -111,7 +188,7 @@ void Create::saveWallpaper(QString title, QString description, QString filePath,
if (userSelectedPreviewImage.fileName() == "preview.jpg") {
if (!userSelectedPreviewImage.remove()) {
qDebug() << "Could remove" << previewImagePath;
emit createWallpaperStateChanged(CreateImportVideo::ImportVideoState::CopyFilesError);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::CopyFilesError);
}
}
@ -119,7 +196,7 @@ void Create::saveWallpaper(QString title, QString description, QString filePath,
if (previewImageFile.exists()) {
if (!QFile::copy(previewImagePath, m_workingDir + "/" + previewImageFile.fileName())) {
qDebug() << "Could not copy" << previewImagePath << " to " << m_workingDir + "/" + previewImageFile.fileName();
emit createWallpaperStateChanged(CreateImportVideo::ImportVideoState::CopyFilesError);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::CopyFilesError);
return;
}
}
@ -128,12 +205,12 @@ void Create::saveWallpaper(QString title, QString description, QString filePath,
if (filePath.endsWith(".webm")) {
if (!QFile::copy(filePath, m_workingDir + "/" + filePathFile.fileName())) {
qDebug() << "Could not copy" << filePath << " to " << m_workingDir + "/" + filePathFile.fileName();
emit createWallpaperStateChanged(CreateImportVideo::ImportVideoState::CopyFilesError);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::CopyFilesError);
return;
}
}
emit createWallpaperStateChanged(CreateImportVideo::ImportVideoState::CopyFilesFinished);
emit createWallpaperStateChanged(CreateImportVideo::ImportVideoState::CreateProjectFile);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::CopyFilesFinished);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::CreateProjectFile);
QJsonObject obj;
obj.insert("description", description);
@ -155,14 +232,20 @@ void Create::saveWallpaper(QString title, QString description, QString filePath,
}
if (!Util::writeSettings(std::move(obj), m_workingDir + "/project.json")) {
emit createWallpaperStateChanged(CreateImportVideo::ImportVideoState::CreateProjectFileError);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::CreateProjectFileError);
return;
}
emit createWallpaperStateChanged(CreateImportVideo::ImportVideoState::CreateProjectFileFinished);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::CreateProjectFileFinished);
}
m_createImportVideoThread->quit();
m_createImportVideoThread->wait();
/*!
\brief This method is called from qml.
*/
void Create::cancel()
{
qInfo() << "cancel()";
m_interrupt = true;
}
/*!
@ -170,35 +253,15 @@ void Create::saveWallpaper(QString title, QString description, QString filePath,
*/
void Create::abortAndCleanup()
{
qWarning() << "Abort and Cleanup!";
if (m_createImportVideo == nullptr || m_createImportVideoThread == nullptr) {
qDebug() << "Invalid thread pointer. Cancel abort!";
return;
}
// Save to export path before aborting to be able to cleanup the tmp folder
QString tmpExportPath = m_createImportVideo->m_exportPath;
connect(m_createImportVideoThread.get(), &QThread::finished, this, [=]() {
QDir exportPath(tmpExportPath);
qWarning() << "Abort and Cleanup!" << exportPath;
if (exportPath.exists()) {
if (!exportPath.removeRecursively()) {
emit createWallpaperStateChanged(CreateImportVideo::ImportVideoState::AbortCleanupError);
qWarning() << "Could not delete temp exportPath: " << exportPath;
} else {
qDebug() << "cleanup " << tmpExportPath;
}
} else {
qDebug() << "Could not cleanup and delete: " << exportPath;
QDir exportPath(m_workingDir);
if (exportPath.exists()) {
if (!exportPath.removeRecursively()) {
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::AbortCleanupError);
qWarning() << "Could not delete temp exportPath: " << exportPath;
}
m_createImportVideo.reset();
m_createImportVideoThread.reset();
});
m_createImportVideoThread->quit();
m_createImportVideoThread->wait();
} else {
qWarning() << "Could not cleanup video import. Export path does not exist: " << exportPath;
}
}
}

View File

@ -71,9 +71,7 @@ class Create : public QObject {
Q_PROPERTY(QString ffmpegOutput READ ffmpegOutput WRITE appendFfmpegOutput NOTIFY ffmpegOutputChanged)
public:
explicit Create(
const std::shared_ptr<GlobalVariables>& globalVariables,
QObject* parent = nullptr);
explicit Create(const std::shared_ptr<GlobalVariables>& globalVariables);
Create();
@ -84,14 +82,13 @@ public:
};
Q_ENUM(VideoCodec)
float progress() const { return m_progress; }
QString workingDir() const { return m_workingDir; }
QString ffmpegOutput() const { return m_ffmpegOutput; }
signals:
void createWallpaperStateChanged(CreateImportVideo::ImportVideoState state);
void createWallpaperStateChanged(ImportVideoState::ImportVideoState state);
void progressChanged(float progress);
void abortCreateWallpaper();
void workingDirChanged(QString workingDir);
@ -100,17 +97,17 @@ signals:
void htmlWallpaperCreatedSuccessful(QString path);
public slots:
void cancel();
void createWallpaperStart(QString videoPath, Create::VideoCodec codec, const int quality = 50);
void saveWallpaper(
QString title,
QString description,
void saveWallpaper(const QString title,
const QString description,
QString filePath,
QString previewImagePath,
QString youtube,
ScreenPlay::Create::VideoCodec codec,
QVector<QString> tags);
const QString youtube,
const ScreenPlay::Create::VideoCodec codec,
const QVector<QString> tags);
void abortAndCleanup();
@ -145,13 +142,18 @@ public slots:
}
private:
std::unique_ptr<CreateImportVideo> m_createImportVideo;
std::unique_ptr<QThread> m_createImportVideoThread;
void init();
void reset();
private:
const std::shared_ptr<GlobalVariables> m_globalVariables;
float m_progress { 0.0F };
QString m_workingDir;
QString m_ffmpegOutput;
std::atomic<bool> m_interrupt;
QFuture<void> m_createImportFuture;
QFutureWatcher<void> m_createImportFutureWatcher;
};
}

View File

@ -0,0 +1,52 @@
#pragma once
#include <QObject>
namespace ScreenPlay {
/*!
\namespace ScreenPlay::ImportVideoState
\inmodule ScreenPlay
\brief Global enum for ImportVideoState.
*/
namespace ImportVideoState {
Q_NAMESPACE
enum class ImportVideoState {
Idle,
Started,
AnalyseVideo,
AnalyseVideoFinished,
AnalyseVideoError,
AnalyseVideoHasNoVideoStreamError,
ConvertingPreviewVideo,
ConvertingPreviewVideoFinished,
ConvertingPreviewVideoError,
ConvertingPreviewGif,
ConvertingPreviewGifFinished, //10
ConvertingPreviewGifError,
ConvertingPreviewImage,
ConvertingPreviewImageFinished,
ConvertingPreviewImageError,
ConvertingPreviewImageThumbnail,
ConvertingPreviewImageThumbnailFinished,
ConvertingPreviewImageThumbnailError,
ConvertingAudio,
ConvertingAudioFinished,
ConvertingAudioError, //20
ConvertingVideo,
ConvertingVideoFinished,
ConvertingVideoError,
CopyFiles,
CopyFilesFinished,
CopyFilesError,
CreateProjectFile,
CreateProjectFileFinished,
CreateProjectFileError,
AbortCleanupError, //30
CreateTmpFolderError,
Finished,
Failed,
};
Q_ENUM_NS(ImportVideoState)
}
}

View File

@ -17,21 +17,23 @@ namespace ScreenPlay {
/*!
\brief This constructor is only needed for calling qRegisterMetaType on CreateImportVideo to register the enums.
\code
qRegisterMetaType<CreateImportVideo::ImportVideoState>("CreateImportVideo::ImportVideoState");
qRegisterMetaType<ImportVideoState::ImportVideoState>("ImportVideoState::ImportVideoState");
\endcode
*/
CreateImportVideo::CreateImportVideo(QObject* parent)
: QObject(parent)
{
}
/*!
\brief Creates a CreateImportVideo object to be used in a different thread. A \a videoPath and a \a exportPath are
needed for convertion.
*/
CreateImportVideo::CreateImportVideo(const QString& videoPath, const QString& exportPath, const QString& codec, const int quality, QObject* parent)
: QObject(parent)
CreateImportVideo::CreateImportVideo(
const QString& videoPath,
const QString& exportPath,
const QString& codec,
const int quality,
std::atomic<bool>& interrupt)
: QObject(nullptr)
, m_quality(quality)
, m_interrupt(interrupt)
{
m_videoPath = videoPath;
m_exportPath = exportPath;
@ -48,90 +50,6 @@ CreateImportVideo::CreateImportVideo(const QString& videoPath, const QString& ex
}
}
/*!
\brief Processes the multiple steps of creating a wallpaper.
\list 1
\li createWallpaperInfo()
\li createWallpaperImagePreview()
\li createWallpaperVideoPreview()
\li createWallpaperGifPreview()
\li createWallpaperVideo() - skiped if already a webm
\li extractWallpaperAudio() - skiped if no audio
\li emit createWallpaperStateChanged(ImportVideoState::Finished);
\endlist
*/
void CreateImportVideo::process()
{
qInfo() << "createWallpaperInfo()" << m_videoPath << m_exportPath << m_codec << m_ffmpegExecutable << m_ffprobeExecutable;
if (!createWallpaperInfo() || QThread::currentThread()->isInterruptionRequested()) {
emit abortAndCleanup();
return;
}
qInfo() << "createWallpaperImageThumbnailPreview()";
if (!createWallpaperImageThumbnailPreview() || QThread::currentThread()->isInterruptionRequested()) {
emit abortAndCleanup();
return;
}
qInfo() << "createWallpaperImagePreview()";
if (!createWallpaperImagePreview() || QThread::currentThread()->isInterruptionRequested()) {
emit abortAndCleanup();
return;
}
qInfo() << "createWallpaperVideoPreview()";
if (!createWallpaperVideoPreview() || QThread::currentThread()->isInterruptionRequested()) {
emit abortAndCleanup();
return;
}
qInfo() << "createWallpaperGifPreview()";
if (!createWallpaperGifPreview() || QThread::currentThread()->isInterruptionRequested()) {
emit abortAndCleanup();
return;
}
// If the video has no audio we can skip the extraction
if (!m_skipAudio) {
qInfo() << "extractWallpaperAudio()";
if (!extractWallpaperAudio() || QThread::currentThread()->isInterruptionRequested()) {
emit abortAndCleanup();
return;
}
}
if (m_isWebm) {
emit createWallpaperStateChanged(ImportVideoState::Finished);
return;
}
qInfo() << "createWallpaperVideo()";
if (!createWallpaperVideo() || QThread::currentThread()->isInterruptionRequested()) {
emit abortAndCleanup();
return;
}
emit createWallpaperStateChanged(ImportVideoState::Finished);
}
void CreateImportVideo::processGif()
{
qInfo() << "createWallpaperImageThumbnailPreview()";
if (!createWallpaperImageThumbnailPreview() || QThread::currentThread()->isInterruptionRequested()) {
emit abortAndCleanup();
return;
}
qInfo() << "createWallpaperImagePreview()";
if (!createWallpaperImagePreview() || QThread::currentThread()->isInterruptionRequested()) {
emit abortAndCleanup();
return;
}
emit createWallpaperStateChanged(ImportVideoState::Finished);
}
/*!
\brief Starts ffprobe and tries to parse the resulting json. If the video
is a container that not contains the video length like webm or mkv
@ -173,12 +91,12 @@ bool CreateImportVideo::createWallpaperInfo()
emit processOutput("ffprobe " + ScreenPlayUtil::toString(args));
emit createWallpaperStateChanged(ImportVideoState::AnalyseVideo);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::AnalyseVideo);
const QString ffmpegOut = waitForFinished(args, QProcess::SeparateChannels, Executable::FFPROBE);
qInfo() << ffmpegOut;
emit createWallpaperStateChanged(ImportVideoState::AnalyseVideoFinished);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::AnalyseVideoFinished);
auto obj = ScreenPlayUtil::parseQByteArrayToQJsonObject(QByteArray::fromStdString(ffmpegOut.toStdString()));
@ -188,14 +106,14 @@ bool CreateImportVideo::createWallpaperInfo()
emit processOutput(ffmpegOut);
emit processOutput("Error parsing FFPROBE json output");
emit createWallpaperStateChanged(ImportVideoState::AnalyseVideoError);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::AnalyseVideoError);
return false;
}
if (obj->empty()) {
qWarning() << "Error! File could not be parsed.";
emit processOutput("Error! File could not be parsed.");
emit createWallpaperStateChanged(ImportVideoState::AnalyseVideoError);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::AnalyseVideoError);
return false;
}
@ -214,7 +132,7 @@ bool CreateImportVideo::createWallpaperInfo()
bool CreateImportVideo::analyzeWebmReadFrames(const QJsonObject& obj)
{
emit createWallpaperStateChanged(ImportVideoState::AnalyseVideo);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::AnalyseVideo);
// Number of frames is a string for some reason...
if (!obj.value("streams").isArray()) {
@ -283,7 +201,7 @@ bool CreateImportVideo::analyzeVideo(const QJsonObject& obj)
if (!hasVideoStream) {
qDebug() << "Error! File has no video Stream!";
emit processOutput("Error! File has no video Stream!");
emit createWallpaperStateChanged(ImportVideoState::AnalyseVideoHasNoVideoStreamError);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::AnalyseVideoHasNoVideoStreamError);
return false;
}
@ -299,7 +217,7 @@ bool CreateImportVideo::analyzeVideo(const QJsonObject& obj)
emit processOutput("Error parsing number of frames. Is this really a valid video File?");
QJsonDocument tmpVideoStreamDoc(videoStream);
emit processOutput(tmpVideoStreamDoc.toJson());
emit createWallpaperStateChanged(ImportVideoState::AnalyseVideoError);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::AnalyseVideoError);
return false;
}
@ -312,7 +230,7 @@ bool CreateImportVideo::analyzeVideo(const QJsonObject& obj)
if (!okParseDuration) {
qDebug() << "Error parsing video length. Is this really a valid video File?";
emit processOutput("Error parsing video length. Is this really a valid video File?");
emit createWallpaperStateChanged(ImportVideoState::AnalyseVideoError);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::AnalyseVideoError);
return false;
}
@ -373,7 +291,7 @@ bool CreateImportVideo::analyzeVideo(const QJsonObject& obj)
bool CreateImportVideo::createWallpaperVideoPreview()
{
emit createWallpaperStateChanged(ImportVideoState::ConvertingPreviewVideo);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::ConvertingPreviewVideo);
QStringList args;
args.append("-y");
@ -397,13 +315,13 @@ bool CreateImportVideo::createWallpaperVideoPreview()
const QString ffmpegOut = waitForFinished(args);
const QFile previewVideo(m_exportPath + "/preview.webm");
if (!previewVideo.exists() || !(previewVideo.size() > 0)) {
emit createWallpaperStateChanged(ImportVideoState::ConvertingPreviewVideoError);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::ConvertingPreviewVideoError);
return false;
}
emit processOutput(ffmpegOut);
emit createWallpaperStateChanged(ImportVideoState::ConvertingPreviewVideoFinished);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::ConvertingPreviewVideoFinished);
return true;
}
@ -425,7 +343,7 @@ bool CreateImportVideo::createWallpaperVideoPreview()
bool CreateImportVideo::createWallpaperGifPreview()
{
emit createWallpaperStateChanged(ImportVideoState::ConvertingPreviewGif);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::ConvertingPreviewGif);
QStringList args;
args.append("-y");
@ -442,13 +360,13 @@ bool CreateImportVideo::createWallpaperGifPreview()
if (!ffmpegOut.isEmpty()) {
const QFile previewGif(m_exportPath + "/preview.gif");
if (!previewGif.exists() || !(previewGif.size() > 0)) {
emit createWallpaperStateChanged(ImportVideoState::ConvertingPreviewGifError);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::ConvertingPreviewGifError);
return false;
}
}
emit processOutput(ffmpegOut);
emit createWallpaperStateChanged(ImportVideoState::ConvertingPreviewGifFinished);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::ConvertingPreviewGifFinished);
return true;
}
@ -464,7 +382,7 @@ bool CreateImportVideo::createWallpaperGifPreview()
bool CreateImportVideo::createWallpaperImageThumbnailPreview()
{
emit createWallpaperStateChanged(ImportVideoState::ConvertingPreviewImageThumbnail);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::ConvertingPreviewImageThumbnail);
QStringList args;
args.clear();
@ -500,13 +418,13 @@ bool CreateImportVideo::createWallpaperImageThumbnailPreview()
if (!ffmpegOut.isEmpty()) {
const QFile previewImg(m_exportPath + "/previewThumbnail.jpg");
if (!previewImg.exists() || !(previewImg.size() > 0)) {
emit createWallpaperStateChanged(ImportVideoState::ConvertingPreviewImageThumbnailError);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::ConvertingPreviewImageThumbnailError);
return false;
}
}
emit processOutput(ffmpegOut);
emit createWallpaperStateChanged(ImportVideoState::ConvertingPreviewImageThumbnailFinished);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::ConvertingPreviewImageThumbnailFinished);
return true;
}
@ -517,7 +435,7 @@ bool CreateImportVideo::createWallpaperImageThumbnailPreview()
bool CreateImportVideo::createWallpaperImagePreview()
{
emit createWallpaperStateChanged(ImportVideoState::ConvertingPreviewImage);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::ConvertingPreviewImage);
QStringList args;
args.clear();
@ -544,13 +462,13 @@ bool CreateImportVideo::createWallpaperImagePreview()
if (!ffmpegOut.isEmpty()) {
const QFile previewImg(m_exportPath + "/preview.jpg");
if (!previewImg.exists() || !(previewImg.size() > 0)) {
emit createWallpaperStateChanged(ImportVideoState::ConvertingPreviewImageError);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::ConvertingPreviewImageError);
return false;
}
}
emit processOutput(ffmpegOut);
emit createWallpaperStateChanged(ImportVideoState::ConvertingPreviewImageFinished);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::ConvertingPreviewImageFinished);
return true;
}
@ -576,13 +494,13 @@ bool CreateImportVideo::createWallpaperImagePreview()
*/
bool CreateImportVideo::createWallpaperVideo()
{
emit createWallpaperStateChanged(ImportVideoState::ConvertingVideo);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::ConvertingVideo);
connect(m_process.get(), &QProcess::readyReadStandardOutput, this, [&]() {
QString tmpOut = m_process->readAllStandardOutput();
qInfo() << tmpOut;
if (tmpOut.contains("Conversion failed!")) {
emit createWallpaperStateChanged(ImportVideoState::ConvertingVideoError);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::ConvertingVideoError);
}
const auto tmpList = tmpOut.split(QRegExp("\\s+"), Qt::SplitBehaviorFlags::SkipEmptyParts);
@ -683,11 +601,11 @@ bool CreateImportVideo::createWallpaperVideo()
QFile video(convertedFileAbsolutePath);
if (!video.exists() || !(video.size() > 0)) {
qDebug() << convertedFileAbsolutePath << ffmpegOutput << video.exists() << video.size();
emit createWallpaperStateChanged(ImportVideoState::ConvertingVideoError);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::ConvertingVideoError);
return false;
}
emit createWallpaperStateChanged(ImportVideoState::ConvertingVideoFinished);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::ConvertingVideoFinished);
return true;
}
@ -710,7 +628,7 @@ bool CreateImportVideo::createWallpaperVideo()
bool CreateImportVideo::extractWallpaperAudio()
{
emit createWallpaperStateChanged(ImportVideoState::ConvertingAudio);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::ConvertingAudio);
QStringList args;
args.append("-y");
@ -731,13 +649,13 @@ bool CreateImportVideo::extractWallpaperAudio()
if (!previewImg.exists() || !(previewImg.size() > 0)) {
qDebug() << args;
qDebug() << tmpErrImg;
emit createWallpaperStateChanged(ImportVideoState::ConvertingAudioError);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::ConvertingAudioError);
return false;
}
}
emit processOutput(tmpErrImg);
emit createWallpaperStateChanged(ImportVideoState::ConvertingAudioFinished);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::ConvertingAudioFinished);
return true;
}
@ -755,12 +673,20 @@ QString CreateImportVideo::waitForFinished(
m_process = std::make_unique<QProcess>();
QObject::connect(m_process.get(), &QProcess::errorOccurred, [=](QProcess::ProcessError error) {
qDebug() << "error enum val = " << error << m_process->errorString();
emit createWallpaperStateChanged(ImportVideoState::AnalyseVideoError);
emit createWallpaperStateChanged(ImportVideoState::ImportVideoState::AnalyseVideoError);
m_process->terminate();
if (!m_process->waitForFinished(1000)) {
m_process->kill();
}
});
QObject::connect(m_process.get(), QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
[=](int exitCode, QProcess::ExitStatus exitStatus) {
qInfo() << "Process finished with exit code: " << exitCode;
if (exitCode != 0)
qWarning() << "Process finished with exit code: " << exitCode << " exitStatus:" << exitStatus;
});
if (executable == Executable::FFMPEG) {
m_process->setProgram(m_ffmpegExecutable);
} else {
@ -786,7 +712,7 @@ QString CreateImportVideo::waitForFinished(
while (!m_process->waitForFinished(10)) //Wake up every 10ms and check if we must exit
{
if (QThread::currentThread()->isInterruptionRequested()) {
if (m_interrupt) {
qInfo() << "Interrupt thread";
m_process->terminate();
if (!m_process->waitForFinished(1000)) {
@ -802,7 +728,10 @@ QString CreateImportVideo::waitForFinished(
} else {
processOutput = m_process->readAll();
}
qInfo() << "ProcessOutput:" << processOutput;
if (!processOutput.isEmpty())
qInfo() << "ProcessOutput:" << processOutput;
m_process->close();
return processOutput;

View File

@ -47,9 +47,9 @@
#include <QProcess>
#include <QScopeGuard>
#include <QString>
#include <QThread>
#include <QtMath>
#include "createimportstates.h"
#include "util.h"
namespace ScreenPlay {
@ -59,46 +59,7 @@ class CreateImportVideo : public QObject {
Q_PROPERTY(float progress READ progress WRITE setProgress NOTIFY progressChanged)
public:
CreateImportVideo() { }
CreateImportVideo(QObject* parent = nullptr);
explicit CreateImportVideo(const QString& videoPath, const QString& exportPath, const QString& codec, const int quality, QObject* parent = nullptr);
enum class ImportVideoState {
Idle,
Started,
AnalyseVideo,
AnalyseVideoFinished,
AnalyseVideoError,
AnalyseVideoHasNoVideoStreamError,
ConvertingPreviewVideo,
ConvertingPreviewVideoFinished,
ConvertingPreviewVideoError,
ConvertingPreviewGif,
ConvertingPreviewGifFinished, //10
ConvertingPreviewGifError,
ConvertingPreviewImage,
ConvertingPreviewImageFinished,
ConvertingPreviewImageError,
ConvertingPreviewImageThumbnail,
ConvertingPreviewImageThumbnailFinished,
ConvertingPreviewImageThumbnailError,
ConvertingAudio,
ConvertingAudioFinished,
ConvertingAudioError, //20
ConvertingVideo,
ConvertingVideoFinished,
ConvertingVideoError,
CopyFiles,
CopyFilesFinished,
CopyFilesError,
CreateProjectFile,
CreateProjectFileFinished,
CreateProjectFileError,
AbortCleanupError, //30
CreateTmpFolderError,
Finished,
};
Q_ENUM(ImportVideoState)
explicit CreateImportVideo(const QString& videoPath, const QString& exportPath, const QString& codec, const int quality, std::atomic<bool>& interrupt);
float progress() const { return m_progress; }
@ -128,16 +89,13 @@ public:
};
signals:
void createWallpaperStateChanged(CreateImportVideo::ImportVideoState state);
void createWallpaperStateChanged(ImportVideoState::ImportVideoState state);
void processOutput(QString text);
void finished();
void abortAndCleanup();
void progressChanged(float progress);
public slots:
void process();
void processGif();
bool createWallpaperInfo();
bool createWallpaperVideoPreview();
bool createWallpaperGifPreview();
@ -170,6 +128,7 @@ private:
QString m_ffprobeExecutable;
QString m_ffmpegExecutable;
std::unique_ptr<QProcess> m_process;
std::atomic<bool>& m_interrupt;
};
}
Q_DECLARE_METATYPE(ScreenPlay::CreateImportVideo::ImportVideoState)
Q_DECLARE_METATYPE(ScreenPlay::ImportVideoState::ImportVideoState)

View File

@ -33,6 +33,7 @@
****************************************************************************/
#include "app.h"
#include "create.h"
#include <QApplication>
#include <QCommandLineParser>
#include <QCoreApplication>
@ -49,25 +50,128 @@ class ScreenPlayTest : public QObject {
Q_OBJECT
private slots:
void main_test();
void initTestCase()
{
Q_INIT_RESOURCE(ScreenPlayQML);
Q_INIT_RESOURCE(ScreenPlayAssets);
app.init();
m_window = qobject_cast<QQuickWindow*>(app.mainWindowEngine()->rootObjects().first());
QVERIFY(m_window);
QVERIFY(QTest::qWaitForWindowExposed(m_window));
QTest::qWait(1000);
}
void import_convert_video();
private:
QQuickWindow* m_window = nullptr;
ScreenPlay::App app;
};
void ScreenPlayTest::main_test()
/*!
* For some reason a direct findChild does not work for item
* delegates.
* https://stackoverflow.com/questions/36767512/how-to-access-qml-listview-delegate-items-from-c
*
*/
QQuickItem* findItemDelegate(QQuickItem* listView)
{
Q_INIT_RESOURCE(ScreenPlayQML);
Q_INIT_RESOURCE(ScreenPlayAssets);
if (!listView->property("contentItem").isValid())
return {};
// QtWebEngine::initialize();
// QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
// QApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
auto contentItem = listView->property("contentItem").value<QQuickItem*>();
auto contentItemChildren = contentItem->childItems();
QQuickItem* videoImportConvertButton {};
for (auto childItem : contentItemChildren) {
if (childItem->objectName() == "videoImportConvert")
return childItem;
}
return {};
}
ScreenPlay::App app;
app.init();
void clickItem(QQuickItem* item)
{
QQuickWindow* itemWindow = item->window();
QVERIFY(itemWindow);
auto centre = item->mapToScene(QPoint(item->width() / 2, item->height() / 2)).toPoint();
qInfo() << "click_:" << centre;
QTest::mouseClick(itemWindow, Qt::LeftButton, Qt::NoModifier, centre);
}
QTest::qWait(10000);
void ScreenPlayTest::import_convert_video()
{
using namespace ScreenPlay;
auto* createTab = m_window->findChild<QQuickItem*>("Create");
QVERIFY(createTab);
clickItem(createTab);
QTest::qWait(300);
auto* stackView = m_window->findChild<QQuickItem*>("stackView");
QVERIFY(stackView);
QVERIFY(stackView->property("currentItem").isValid());
auto* createView = qvariant_cast<QQuickItem*>(stackView->property("currentItem"));
QVERIFY(createView);
QTest::qWait(300);
auto* wizardsListView = m_window->findChild<QQuickItem*>("wizardsListView");
QVERIFY(wizardsListView);
QQuickItem* videoImportConvertButton = findItemDelegate(wizardsListView);
QVERIFY(videoImportConvertButton);
clickItem(videoImportConvertButton);
QTest::qWait(300);
auto* createWallpaperInit = m_window->findChild<QQuickItem*>("createWallpaperInit");
QVERIFY(createWallpaperInit);
QVERIFY(QMetaObject::invokeMethod(createWallpaperInit,
QString("startConvert").toLatin1().constData(),
Qt::ConnectionType::AutoConnection,
Q_ARG(QVariant, "file:///D:/Video Loop/bbb.mp4"),
Q_ARG(QVariant, 1))); // VideoCodec::VP9
QTest::qWait(1000);
// Wait for Create::createWallpaperStart
{
ImportVideoState::ImportVideoState status = ImportVideoState::ImportVideoState::Idle;
QObject::connect(app.create(), &Create::createWallpaperStateChanged, this, [&status](ImportVideoState::ImportVideoState state) {
status = state;
});
while (true) {
QSignalSpy videoConvertFinishSpy(app.create(), &Create::createWallpaperStateChanged);
if (status == ImportVideoState::ImportVideoState::Finished || status == ImportVideoState::ImportVideoState::Failed) {
QVERIFY(status == ImportVideoState::ImportVideoState::Finished);
QTest::qWait(1000); // Wait for the ui to process the event
break;
}
videoConvertFinishSpy.wait();
}
}
QTest::qWait(1000);
auto* btnSave = m_window->findChild<QQuickItem*>("btnSave");
QVERIFY(btnSave);
clickItem(btnSave);
// Wait for Create::saveWallpaper
{
ImportVideoState::ImportVideoState status = ImportVideoState::ImportVideoState::Idle;
QObject::connect(app.create(), &Create::createWallpaperStateChanged, this, [&status](ImportVideoState::ImportVideoState state) {
status = state;
});
while (true) {
QSignalSpy videoConvertFinishSpy(app.create(), &Create::createWallpaperStateChanged);
if (status == ImportVideoState::ImportVideoState::CreateProjectFileFinished || status == ImportVideoState::ImportVideoState::CreateProjectFileError || status == ImportVideoState::ImportVideoState::CopyFilesError) {
QVERIFY(status == ImportVideoState::ImportVideoState::CreateProjectFileFinished);
QTest::qWait(1000); // Wait for the ui to process the event
break;
}
videoConvertFinishSpy.wait();
}
}
QTest::qWait(1000);
}
QTEST_MAIN(ScreenPlayTest)

View File

@ -129,12 +129,12 @@
<context>
<name>CreateWallpaperInit</name>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="31"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="32"/>
<source>Import any video type</source>
<translation type="unfinished">Importiere jedes Video</translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="37"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="38"/>
<source>Depending on your PC configuration it is better to convert your wallpaper to a specific video codec. If both have bad performance you can also try a QML wallpaper! Supported video formats are:
*.mp4 *.mpg *.mp2 *.mpeg *.ogv *.avi *.wmv *.m4v *.3gp *.flv</source>
@ -142,22 +142,22 @@
*.mp4 *.mpg *.mp2 *.mpeg *.ogv *.avi *.wmv *.m4v *.3gp *.flv</translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="52"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="53"/>
<source>Set your preffered video codec:</source>
<translation type="unfinished">Bevorzugte Video-Kodierung Festlegen</translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="97"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="98"/>
<source>Quality slider. Lower value means better quality.</source>
<translation type="unfinished">Qualitäts-Regler. Niedriger wert heißt niedrige Qualität</translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="112"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="113"/>
<source>Open Documentation</source>
<translation type="unfinished">Öffne Documentation</translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="130"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="132"/>
<source>Select file</source>
<translation type="unfinished">Datei auswählen</translation>
</message>
@ -263,7 +263,7 @@
<translation type="unfinished">Speichern</translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperVideoImportConvert.qml" line="382"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperVideoImportConvert.qml" line="381"/>
<source>Save Wallpaper...</source>
<translation type="unfinished">Speicher Wallpaper...</translation>
</message>
@ -560,7 +560,7 @@
<translation type="unfinished">Speichern</translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportWebm/ImportWebmConvert.qml" line="375"/>
<location filename="../qml/Create/Wizards/ImportWebm/ImportWebmConvert.qml" line="374"/>
<source>Save Wallpaper...</source>
<translation type="unfinished">Speicher Wallpaper...</translation>
</message>
@ -1299,47 +1299,47 @@ Bitte Konfiguriere deine Wallpaper noch erneut</translation>
<translation type="unfinished">Abonniere</translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="116"/>
<location filename="../qml/Create/Sidebar.qml" line="119"/>
<source>Tools Overview</source>
<translation type="unfinished">Werkzeugeübersicht</translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="123"/>
<location filename="../qml/Create/Sidebar.qml" line="126"/>
<source>Video import and convert (all types)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="130"/>
<location filename="../qml/Create/Sidebar.qml" line="133"/>
<source>Video Import (.webm)</source>
<translation type="unfinished">Importiere Video (.webm)</translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="137"/>
<location filename="../qml/Create/Sidebar.qml" line="140"/>
<source>GIF Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="144"/>
<location filename="../qml/Create/Sidebar.qml" line="147"/>
<source>QML Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="151"/>
<location filename="../qml/Create/Sidebar.qml" line="154"/>
<source>HTML5 Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="158"/>
<location filename="../qml/Create/Sidebar.qml" line="161"/>
<source>Website Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="165"/>
<location filename="../qml/Create/Sidebar.qml" line="168"/>
<source>QML Widget</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="172"/>
<location filename="../qml/Create/Sidebar.qml" line="175"/>
<source>HTML Widget</source>
<translation type="unfinished"></translation>
</message>

View File

@ -113,34 +113,34 @@
<context>
<name>CreateWallpaperInit</name>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="31"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="32"/>
<source>Import any video type</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="37"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="38"/>
<source>Depending on your PC configuration it is better to convert your wallpaper to a specific video codec. If both have bad performance you can also try a QML wallpaper! Supported video formats are:
*.mp4 *.mpg *.mp2 *.mpeg *.ogv *.avi *.wmv *.m4v *.3gp *.flv</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="52"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="53"/>
<source>Set your preffered video codec:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="97"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="98"/>
<source>Quality slider. Lower value means better quality.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="112"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="113"/>
<source>Open Documentation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="130"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="132"/>
<source>Select file</source>
<translation type="unfinished"></translation>
</message>
@ -246,7 +246,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperVideoImportConvert.qml" line="382"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperVideoImportConvert.qml" line="381"/>
<source>Save Wallpaper...</source>
<translation type="unfinished"></translation>
</message>
@ -543,7 +543,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportWebm/ImportWebmConvert.qml" line="375"/>
<location filename="../qml/Create/Wizards/ImportWebm/ImportWebmConvert.qml" line="374"/>
<source>Save Wallpaper...</source>
<translation type="unfinished"></translation>
</message>
@ -1181,47 +1181,47 @@
<context>
<name>Sidebar</name>
<message>
<location filename="../qml/Create/Sidebar.qml" line="116"/>
<location filename="../qml/Create/Sidebar.qml" line="119"/>
<source>Tools Overview</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="123"/>
<location filename="../qml/Create/Sidebar.qml" line="126"/>
<source>Video import and convert (all types)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="130"/>
<location filename="../qml/Create/Sidebar.qml" line="133"/>
<source>Video Import (.webm)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="137"/>
<location filename="../qml/Create/Sidebar.qml" line="140"/>
<source>GIF Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="144"/>
<location filename="../qml/Create/Sidebar.qml" line="147"/>
<source>QML Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="151"/>
<location filename="../qml/Create/Sidebar.qml" line="154"/>
<source>HTML5 Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="158"/>
<location filename="../qml/Create/Sidebar.qml" line="161"/>
<source>Website Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="165"/>
<location filename="../qml/Create/Sidebar.qml" line="168"/>
<source>QML Widget</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="172"/>
<location filename="../qml/Create/Sidebar.qml" line="175"/>
<source>HTML Widget</source>
<translation type="unfinished"></translation>
</message>

View File

@ -129,34 +129,34 @@
<context>
<name>CreateWallpaperInit</name>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="31"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="32"/>
<source>Import any video type</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="37"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="38"/>
<source>Depending on your PC configuration it is better to convert your wallpaper to a specific video codec. If both have bad performance you can also try a QML wallpaper! Supported video formats are:
*.mp4 *.mpg *.mp2 *.mpeg *.ogv *.avi *.wmv *.m4v *.3gp *.flv</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="52"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="53"/>
<source>Set your preffered video codec:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="97"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="98"/>
<source>Quality slider. Lower value means better quality.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="112"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="113"/>
<source>Open Documentation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="130"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="132"/>
<source>Select file</source>
<translation type="unfinished"></translation>
</message>
@ -262,7 +262,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperVideoImportConvert.qml" line="382"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperVideoImportConvert.qml" line="381"/>
<source>Save Wallpaper...</source>
<translation type="unfinished"></translation>
</message>
@ -559,7 +559,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportWebm/ImportWebmConvert.qml" line="375"/>
<location filename="../qml/Create/Wizards/ImportWebm/ImportWebmConvert.qml" line="374"/>
<source>Save Wallpaper...</source>
<translation type="unfinished"></translation>
</message>
@ -1197,47 +1197,47 @@
<context>
<name>Sidebar</name>
<message>
<location filename="../qml/Create/Sidebar.qml" line="116"/>
<location filename="../qml/Create/Sidebar.qml" line="119"/>
<source>Tools Overview</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="123"/>
<location filename="../qml/Create/Sidebar.qml" line="126"/>
<source>Video import and convert (all types)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="130"/>
<location filename="../qml/Create/Sidebar.qml" line="133"/>
<source>Video Import (.webm)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="137"/>
<location filename="../qml/Create/Sidebar.qml" line="140"/>
<source>GIF Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="144"/>
<location filename="../qml/Create/Sidebar.qml" line="147"/>
<source>QML Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="151"/>
<location filename="../qml/Create/Sidebar.qml" line="154"/>
<source>HTML5 Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="158"/>
<location filename="../qml/Create/Sidebar.qml" line="161"/>
<source>Website Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="165"/>
<location filename="../qml/Create/Sidebar.qml" line="168"/>
<source>QML Widget</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="172"/>
<location filename="../qml/Create/Sidebar.qml" line="175"/>
<source>HTML Widget</source>
<translation type="unfinished"></translation>
</message>

View File

@ -113,34 +113,34 @@
<context>
<name>CreateWallpaperInit</name>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="31"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="32"/>
<source>Import any video type</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="37"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="38"/>
<source>Depending on your PC configuration it is better to convert your wallpaper to a specific video codec. If both have bad performance you can also try a QML wallpaper! Supported video formats are:
*.mp4 *.mpg *.mp2 *.mpeg *.ogv *.avi *.wmv *.m4v *.3gp *.flv</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="52"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="53"/>
<source>Set your preffered video codec:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="97"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="98"/>
<source>Quality slider. Lower value means better quality.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="112"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="113"/>
<source>Open Documentation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="130"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="132"/>
<source>Select file</source>
<translation type="unfinished"></translation>
</message>
@ -246,7 +246,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperVideoImportConvert.qml" line="382"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperVideoImportConvert.qml" line="381"/>
<source>Save Wallpaper...</source>
<translation type="unfinished"></translation>
</message>
@ -543,7 +543,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportWebm/ImportWebmConvert.qml" line="375"/>
<location filename="../qml/Create/Wizards/ImportWebm/ImportWebmConvert.qml" line="374"/>
<source>Save Wallpaper...</source>
<translation type="unfinished"></translation>
</message>
@ -1181,47 +1181,47 @@
<context>
<name>Sidebar</name>
<message>
<location filename="../qml/Create/Sidebar.qml" line="116"/>
<location filename="../qml/Create/Sidebar.qml" line="119"/>
<source>Tools Overview</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="123"/>
<location filename="../qml/Create/Sidebar.qml" line="126"/>
<source>Video import and convert (all types)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="130"/>
<location filename="../qml/Create/Sidebar.qml" line="133"/>
<source>Video Import (.webm)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="137"/>
<location filename="../qml/Create/Sidebar.qml" line="140"/>
<source>GIF Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="144"/>
<location filename="../qml/Create/Sidebar.qml" line="147"/>
<source>QML Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="151"/>
<location filename="../qml/Create/Sidebar.qml" line="154"/>
<source>HTML5 Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="158"/>
<location filename="../qml/Create/Sidebar.qml" line="161"/>
<source>Website Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="165"/>
<location filename="../qml/Create/Sidebar.qml" line="168"/>
<source>QML Widget</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="172"/>
<location filename="../qml/Create/Sidebar.qml" line="175"/>
<source>HTML Widget</source>
<translation type="unfinished"></translation>
</message>

View File

@ -129,34 +129,34 @@
<context>
<name>CreateWallpaperInit</name>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="31"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="32"/>
<source>Import any video type</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="37"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="38"/>
<source>Depending on your PC configuration it is better to convert your wallpaper to a specific video codec. If both have bad performance you can also try a QML wallpaper! Supported video formats are:
*.mp4 *.mpg *.mp2 *.mpeg *.ogv *.avi *.wmv *.m4v *.3gp *.flv</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="52"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="53"/>
<source>Set your preffered video codec:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="97"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="98"/>
<source>Quality slider. Lower value means better quality.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="112"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="113"/>
<source>Open Documentation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="130"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="132"/>
<source>Select file</source>
<translation type="unfinished"></translation>
</message>
@ -262,7 +262,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperVideoImportConvert.qml" line="382"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperVideoImportConvert.qml" line="381"/>
<source>Save Wallpaper...</source>
<translation type="unfinished"></translation>
</message>
@ -559,7 +559,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportWebm/ImportWebmConvert.qml" line="375"/>
<location filename="../qml/Create/Wizards/ImportWebm/ImportWebmConvert.qml" line="374"/>
<source>Save Wallpaper...</source>
<translation type="unfinished"></translation>
</message>
@ -1197,47 +1197,47 @@
<context>
<name>Sidebar</name>
<message>
<location filename="../qml/Create/Sidebar.qml" line="116"/>
<location filename="../qml/Create/Sidebar.qml" line="119"/>
<source>Tools Overview</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="123"/>
<location filename="../qml/Create/Sidebar.qml" line="126"/>
<source>Video import and convert (all types)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="130"/>
<location filename="../qml/Create/Sidebar.qml" line="133"/>
<source>Video Import (.webm)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="137"/>
<location filename="../qml/Create/Sidebar.qml" line="140"/>
<source>GIF Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="144"/>
<location filename="../qml/Create/Sidebar.qml" line="147"/>
<source>QML Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="151"/>
<location filename="../qml/Create/Sidebar.qml" line="154"/>
<source>HTML5 Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="158"/>
<location filename="../qml/Create/Sidebar.qml" line="161"/>
<source>Website Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="165"/>
<location filename="../qml/Create/Sidebar.qml" line="168"/>
<source>QML Widget</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="172"/>
<location filename="../qml/Create/Sidebar.qml" line="175"/>
<source>HTML Widget</source>
<translation type="unfinished"></translation>
</message>

View File

@ -129,34 +129,34 @@
<context>
<name>CreateWallpaperInit</name>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="31"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="32"/>
<source>Import any video type</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="37"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="38"/>
<source>Depending on your PC configuration it is better to convert your wallpaper to a specific video codec. If both have bad performance you can also try a QML wallpaper! Supported video formats are:
*.mp4 *.mpg *.mp2 *.mpeg *.ogv *.avi *.wmv *.m4v *.3gp *.flv</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="52"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="53"/>
<source>Set your preffered video codec:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="97"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="98"/>
<source>Quality slider. Lower value means better quality.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="112"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="113"/>
<source>Open Documentation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="130"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="132"/>
<source>Select file</source>
<translation type="unfinished"></translation>
</message>
@ -262,7 +262,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperVideoImportConvert.qml" line="382"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperVideoImportConvert.qml" line="381"/>
<source>Save Wallpaper...</source>
<translation type="unfinished"></translation>
</message>
@ -559,7 +559,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportWebm/ImportWebmConvert.qml" line="375"/>
<location filename="../qml/Create/Wizards/ImportWebm/ImportWebmConvert.qml" line="374"/>
<source>Save Wallpaper...</source>
<translation type="unfinished"></translation>
</message>
@ -1197,47 +1197,47 @@
<context>
<name>Sidebar</name>
<message>
<location filename="../qml/Create/Sidebar.qml" line="116"/>
<location filename="../qml/Create/Sidebar.qml" line="119"/>
<source>Tools Overview</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="123"/>
<location filename="../qml/Create/Sidebar.qml" line="126"/>
<source>Video import and convert (all types)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="130"/>
<location filename="../qml/Create/Sidebar.qml" line="133"/>
<source>Video Import (.webm)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="137"/>
<location filename="../qml/Create/Sidebar.qml" line="140"/>
<source>GIF Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="144"/>
<location filename="../qml/Create/Sidebar.qml" line="147"/>
<source>QML Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="151"/>
<location filename="../qml/Create/Sidebar.qml" line="154"/>
<source>HTML5 Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="158"/>
<location filename="../qml/Create/Sidebar.qml" line="161"/>
<source>Website Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="165"/>
<location filename="../qml/Create/Sidebar.qml" line="168"/>
<source>QML Widget</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="172"/>
<location filename="../qml/Create/Sidebar.qml" line="175"/>
<source>HTML Widget</source>
<translation type="unfinished"></translation>
</message>

View File

@ -129,34 +129,34 @@
<context>
<name>CreateWallpaperInit</name>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="31"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="32"/>
<source>Import any video type</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="37"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="38"/>
<source>Depending on your PC configuration it is better to convert your wallpaper to a specific video codec. If both have bad performance you can also try a QML wallpaper! Supported video formats are:
*.mp4 *.mpg *.mp2 *.mpeg *.ogv *.avi *.wmv *.m4v *.3gp *.flv</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="52"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="53"/>
<source>Set your preffered video codec:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="97"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="98"/>
<source>Quality slider. Lower value means better quality.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="112"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="113"/>
<source>Open Documentation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="130"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="132"/>
<source>Select file</source>
<translation type="unfinished"></translation>
</message>
@ -262,7 +262,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperVideoImportConvert.qml" line="382"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperVideoImportConvert.qml" line="381"/>
<source>Save Wallpaper...</source>
<translation type="unfinished"></translation>
</message>
@ -559,7 +559,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportWebm/ImportWebmConvert.qml" line="375"/>
<location filename="../qml/Create/Wizards/ImportWebm/ImportWebmConvert.qml" line="374"/>
<source>Save Wallpaper...</source>
<translation type="unfinished"></translation>
</message>
@ -1197,47 +1197,47 @@
<context>
<name>Sidebar</name>
<message>
<location filename="../qml/Create/Sidebar.qml" line="116"/>
<location filename="../qml/Create/Sidebar.qml" line="119"/>
<source>Tools Overview</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="123"/>
<location filename="../qml/Create/Sidebar.qml" line="126"/>
<source>Video import and convert (all types)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="130"/>
<location filename="../qml/Create/Sidebar.qml" line="133"/>
<source>Video Import (.webm)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="137"/>
<location filename="../qml/Create/Sidebar.qml" line="140"/>
<source>GIF Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="144"/>
<location filename="../qml/Create/Sidebar.qml" line="147"/>
<source>QML Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="151"/>
<location filename="../qml/Create/Sidebar.qml" line="154"/>
<source>HTML5 Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="158"/>
<location filename="../qml/Create/Sidebar.qml" line="161"/>
<source>Website Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="165"/>
<location filename="../qml/Create/Sidebar.qml" line="168"/>
<source>QML Widget</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="172"/>
<location filename="../qml/Create/Sidebar.qml" line="175"/>
<source>HTML Widget</source>
<translation type="unfinished"></translation>
</message>

View File

@ -113,34 +113,34 @@
<context>
<name>CreateWallpaperInit</name>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="31"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="32"/>
<source>Import any video type</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="37"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="38"/>
<source>Depending on your PC configuration it is better to convert your wallpaper to a specific video codec. If both have bad performance you can also try a QML wallpaper! Supported video formats are:
*.mp4 *.mpg *.mp2 *.mpeg *.ogv *.avi *.wmv *.m4v *.3gp *.flv</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="52"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="53"/>
<source>Set your preffered video codec:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="97"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="98"/>
<source>Quality slider. Lower value means better quality.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="112"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="113"/>
<source>Open Documentation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="130"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="132"/>
<source>Select file</source>
<translation type="unfinished"></translation>
</message>
@ -246,7 +246,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperVideoImportConvert.qml" line="382"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperVideoImportConvert.qml" line="381"/>
<source>Save Wallpaper...</source>
<translation type="unfinished"></translation>
</message>
@ -543,7 +543,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportWebm/ImportWebmConvert.qml" line="375"/>
<location filename="../qml/Create/Wizards/ImportWebm/ImportWebmConvert.qml" line="374"/>
<source>Save Wallpaper...</source>
<translation type="unfinished"></translation>
</message>
@ -1181,47 +1181,47 @@
<context>
<name>Sidebar</name>
<message>
<location filename="../qml/Create/Sidebar.qml" line="116"/>
<location filename="../qml/Create/Sidebar.qml" line="119"/>
<source>Tools Overview</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="123"/>
<location filename="../qml/Create/Sidebar.qml" line="126"/>
<source>Video import and convert (all types)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="130"/>
<location filename="../qml/Create/Sidebar.qml" line="133"/>
<source>Video Import (.webm)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="137"/>
<location filename="../qml/Create/Sidebar.qml" line="140"/>
<source>GIF Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="144"/>
<location filename="../qml/Create/Sidebar.qml" line="147"/>
<source>QML Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="151"/>
<location filename="../qml/Create/Sidebar.qml" line="154"/>
<source>HTML5 Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="158"/>
<location filename="../qml/Create/Sidebar.qml" line="161"/>
<source>Website Wallpaper</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="165"/>
<location filename="../qml/Create/Sidebar.qml" line="168"/>
<source>QML Widget</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="172"/>
<location filename="../qml/Create/Sidebar.qml" line="175"/>
<source>HTML Widget</source>
<translation type="unfinished"></translation>
</message>

View File

@ -113,12 +113,12 @@
<context>
<name>CreateWallpaperInit</name>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="31"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="32"/>
<source>Import any video type</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="37"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="38"/>
<source>Depending on your PC configuration it is better to convert your wallpaper to a specific video codec. If both have bad performance you can also try a QML wallpaper! Supported video formats are:
*.mp4 *.mpg *.mp2 *.mpeg *.ogv *.avi *.wmv *.m4v *.3gp *.flv</source>
@ -127,22 +127,22 @@
*.mp4 *.mpg *.mp2 *.mpeg *.ogv *.avi *.wmv *.m4v *.3gp *.flv</translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="52"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="53"/>
<source>Set your preffered video codec:</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="97"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="98"/>
<source>Quality slider. Lower value means better quality.</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="112"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="113"/>
<source>Open Documentation</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="130"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperInit.qml" line="132"/>
<source>Select file</source>
<translation></translation>
</message>
@ -248,7 +248,7 @@
<translation></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperVideoImportConvert.qml" line="382"/>
<location filename="../qml/Create/Wizards/ImportVideoAndConvert/CreateWallpaperVideoImportConvert.qml" line="381"/>
<source>Save Wallpaper...</source>
<translation>...</translation>
</message>
@ -545,7 +545,7 @@
<translation></translation>
</message>
<message>
<location filename="../qml/Create/Wizards/ImportWebm/ImportWebmConvert.qml" line="375"/>
<location filename="../qml/Create/Wizards/ImportWebm/ImportWebmConvert.qml" line="374"/>
<source>Save Wallpaper...</source>
<translation>...</translation>
</message>
@ -1279,42 +1279,47 @@
<translation></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="116"/>
<location filename="../qml/Create/Sidebar.qml" line="119"/>
<source>Tools Overview</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="128"/>
<location filename="../qml/Create/Sidebar.qml" line="126"/>
<source>Video import and convert (all types)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="133"/>
<source>Video Import (.webm)</source>
<translation> (.webm)</translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="134"/>
<location filename="../qml/Create/Sidebar.qml" line="140"/>
<source>GIF Wallpaper</source>
<translation>GIF </translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="140"/>
<location filename="../qml/Create/Sidebar.qml" line="147"/>
<source>QML Wallpaper</source>
<translation>QML </translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="146"/>
<location filename="../qml/Create/Sidebar.qml" line="154"/>
<source>HTML5 Wallpaper</source>
<translation>HTML5 </translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="152"/>
<location filename="../qml/Create/Sidebar.qml" line="161"/>
<source>Website Wallpaper</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="158"/>
<location filename="../qml/Create/Sidebar.qml" line="168"/>
<source>QML Widget</source>
<translation>QML </translation>
</message>
<message>
<location filename="../qml/Create/Sidebar.qml" line="164"/>
<location filename="../qml/Create/Sidebar.qml" line="175"/>
<source>HTML Widget</source>
<translation>HTML </translation>
</message>