From cee1588f74b51c30b53f5a60217484751797c77f Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Tue, 13 Sep 2016 08:05:35 +0200 Subject: [PATCH] Update "Reverse Clip" Bin job to handle any speed CCBUG: 368681 --- src/CMakeLists.txt | 1 + src/mainwindow.cpp | 2 +- src/project/dialogs/CMakeLists.txt | 1 + src/project/dialogs/clipspeed.cpp | 98 +++++++++++++++ src/project/dialogs/clipspeed.h | 52 ++++++++ src/project/dialogs/slideshowclip.cpp | 2 +- src/project/jobs/filterjob.cpp | 27 ++++- src/ui/clipspeed_ui.ui | 164 ++++++++++++++++++++++++++ 8 files changed, 342 insertions(+), 5 deletions(-) create mode 100644 src/project/dialogs/clipspeed.cpp create mode 100644 src/project/dialogs/clipspeed.h create mode 100644 src/ui/clipspeed_ui.ui diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6935ee9c46..2814fa3d04 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -205,6 +205,7 @@ ki18n_wrap_ui(kdenlive_UIS ui/scenecutdialog_ui.ui ui/gradientedit_ui.ui ui/selectivecolor_ui.ui + ui/clipspeed_ui.ui ) if(BUILD_JogShuttle) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 5bf4cbe8a4..f815700c3b 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -3057,7 +3057,7 @@ void MainWindow::buildDynamicActions() delete filter; } if (KdenliveSettings::producerslist().contains(QStringLiteral("timewarp"))) { - QAction *action = new QAction(i18n("Reverse clip"), m_extraFactory->actionCollection()); + QAction *action = new QAction(i18n("Duplicate clip with speed change"), m_extraFactory->actionCollection()); QStringList stabJob; stabJob << QString::number((int) AbstractClipJob::FILTERCLIPJOB) << QStringLiteral("timewarp"); action->setData(stabJob); diff --git a/src/project/dialogs/CMakeLists.txt b/src/project/dialogs/CMakeLists.txt index 195097da7d..97e7f7c0fe 100644 --- a/src/project/dialogs/CMakeLists.txt +++ b/src/project/dialogs/CMakeLists.txt @@ -7,5 +7,6 @@ set(kdenlive_SRCS project/dialogs/slideshowclip.cpp project/dialogs/temporarydata.cpp project/dialogs/profilewidget.cpp + project/dialogs/clipspeed.cpp PARENT_SCOPE) diff --git a/src/project/dialogs/clipspeed.cpp b/src/project/dialogs/clipspeed.cpp new file mode 100644 index 0000000000..737c15415b --- /dev/null +++ b/src/project/dialogs/clipspeed.cpp @@ -0,0 +1,98 @@ +/*************************************************************************** + * Copyright (C) 2016 by Jean-Baptiste Mardelle (jb@kdenlive.org) * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + +#include "clipspeed.h" +#include "kdenlivesettings.h" +#include "utils/KoIconUtils.h" + +#include +#include +#include +#include +#include + +ClipSpeed::ClipSpeed(const QUrl &destination, bool isDirectory, QWidget * parent) : + QDialog(parent) +{ + setFont(QFontDatabase::systemFont(QFontDatabase::SmallestReadableFont)); + m_view.setupUi(this); + setWindowTitle(i18n("Create clip with speed")); + if (isDirectory) { + m_view.kurlrequester->setMode(KFile::Directory); + } else { + m_view.kurlrequester->setMode(KFile::File); + } + m_view.kurlrequester->setUrl(destination); + m_view.toolButton->setIcon(KoIconUtils::themedIcon("kdenlive-menu")); + QMenu *settingsMenu = new QMenu(this); + m_view.toolButton->setMenu(settingsMenu); + QAction *a = settingsMenu->addAction(i18n("Reverse clip")); + a->setData(-100); + a = settingsMenu->addAction(i18n("25%")); + a->setData(25); + a = settingsMenu->addAction(i18n("50%")); + a->setData(50); + a = settingsMenu->addAction(i18n("200%")); + a->setData(200); + a = settingsMenu->addAction(i18n("400%")); + a->setData(400); + connect(settingsMenu, &QMenu::triggered, this, &ClipSpeed::adjustSpeed); + connect(m_view.speedSlider, &QSlider::valueChanged, this, &ClipSpeed::slotUpdateSpeed); + connect(m_view.speedSpin, SIGNAL(valueChanged(double)), this, SLOT(slotUpdateSlider(double))); +} + +void ClipSpeed::slotUpdateSlider(double speed) +{ + m_view.speedSlider->blockSignals(true); + m_view.speedSlider->setValue((int) speed); + m_view.speedSlider->blockSignals(false); + m_view.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(speed != 0.0); +} + + +void ClipSpeed::slotUpdateSpeed(int speed) +{ + m_view.speedSpin->blockSignals(true); + m_view.speedSpin->setValue((double) speed); + m_view.speedSpin->blockSignals(false); +} + +QUrl ClipSpeed::selectedUrl() const +{ + return m_view.kurlrequester->url(); +} + +void ClipSpeed::adjustSpeed(QAction *a) +{ + if (!a) + return; + int speed = a->data().toInt(); + m_view.speedSlider->blockSignals(true); + m_view.speedSpin->blockSignals(true); + m_view.speedSpin->setValue((double) speed); + m_view.speedSlider->setValue(speed); + m_view.speedSlider->blockSignals(false); + m_view.speedSpin->blockSignals(false); +} + +double ClipSpeed::speed() const +{ + return m_view.speedSpin->value(); +} + diff --git a/src/project/dialogs/clipspeed.h b/src/project/dialogs/clipspeed.h new file mode 100644 index 0000000000..9f7ba96c0f --- /dev/null +++ b/src/project/dialogs/clipspeed.h @@ -0,0 +1,52 @@ +/*************************************************************************** + * Copyright (C) 2016 by Jean-Baptiste Mardelle (jb@kdenlive.org) * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + + +#ifndef CLIPSPEED_H +#define CLIPSPEED_H + +#include "ui_clipspeed_ui.h" +#include + +/** + * @class ClipSpeed + * @brief A dialog allowing to set a destination and a new speed to create an MLT file from a clip. + */ + +class ClipSpeed : public QDialog +{ + Q_OBJECT + +public: + explicit ClipSpeed(const QUrl &destination, bool isDirectory, QWidget * parent = 0); + QUrl selectedUrl() const; + double speed() const; + +private slots: + void slotUpdateSlider(double); + void slotUpdateSpeed(int); + void adjustSpeed(QAction *a); + +private: + Ui::ClipSpeed_UI m_view; +}; + + +#endif + diff --git a/src/project/dialogs/slideshowclip.cpp b/src/project/dialogs/slideshowclip.cpp index 553e54dc2c..8f63d1518e 100644 --- a/src/project/dialogs/slideshowclip.cpp +++ b/src/project/dialogs/slideshowclip.cpp @@ -38,8 +38,8 @@ SlideshowClip::SlideshowClip(const Timecode &tc, QString clipFolder, ProjectClip m_thumbJob(NULL) { setFont(QFontDatabase::systemFont(QFontDatabase::SmallestReadableFont)); - setWindowTitle(i18n("Add Slideshow Clip")); m_view.setupUi(this); + setWindowTitle(i18n("Add Slideshow Clip")); if (clip) { m_view.clip_name->setText(clip->name()); m_view.groupBox->setHidden(true); diff --git a/src/project/jobs/filterjob.cpp b/src/project/jobs/filterjob.cpp index 97842b9f9a..7a8169e32b 100644 --- a/src/project/jobs/filterjob.cpp +++ b/src/project/jobs/filterjob.cpp @@ -24,12 +24,13 @@ #include "doc/kdenlivedoc.h" #include "bin/projectclip.h" #include "project/clipstabilize.h" +#include "project/dialogs/clipspeed.h" #include "ui_scenecutdialog_ui.h" #include #include #include - +#include #include // static @@ -75,16 +76,36 @@ QHash FilterJob::prepareJob(QList 1; + QPointer d = new ClipSpeed(clips.count() == 1 ? QUrl::fromLocalFile(sources.first() + QStringLiteral(".mlt")) : QUrl::fromLocalFile(sources.first()).adjusted(QUrl::RemoveFilename), multipleSelection, QApplication::activeWindow()); + if (d->exec() == QDialog::Accepted) { + QLocale locale; + QString speedString = QString("timewarp:%1:").arg(locale.toString(d->speed()/100)); + QDir destFolder; + if (multipleSelection) { + destFolder = QDir(d->selectedUrl().path()); + } for (int i = 0; i < clips.count(); i++) { - QString prodstring = QString("timewarp:-1:" + sources.at(i)); + QString prodstring = speedString + sources.at(i); producerParams.insert(QStringLiteral("producer"), prodstring); - consumerParams.insert(QStringLiteral("consumer"), "xml:" + sources.at(i) + ".mlt"); + QString destination; + if (multipleSelection) { + destination = destFolder.absoluteFilePath(QUrl::fromLocalFile(sources.at(i)).fileName()); + } else { + destination = d->selectedUrl().path(); + } + if (QFile::exists(destination)) { + if (KMessageBox::questionYesNo(QApplication::activeWindow(), i18n("File %1 already exists.\nDo you want to overwrite it?", destination)) != KMessageBox::Yes) continue; + } + consumerParams.insert(QStringLiteral("consumer"), "xml:" + destination); ProjectClip *clip = clips.at(i); MeltJob *job = new MeltJob(clip->clipType(), clip->clipId(), producerParams, filterParams, consumerParams, extraParams); job->description = i18n("Reverse clip"); job->setAddClipToProject(true); jobs.insert(clip, job); } + } + delete d; return jobs; } else if (filterName == QLatin1String("motion_est")) { // Show config dialog diff --git a/src/ui/clipspeed_ui.ui b/src/ui/clipspeed_ui.ui new file mode 100644 index 0000000000..7eb6068b90 --- /dev/null +++ b/src/ui/clipspeed_ui.ui @@ -0,0 +1,164 @@ + + + ClipSpeed_UI + + + + 0 + 0 + 498 + 158 + + + + Dialog + + + + + + Qt::Vertical + + + + 20 + 0 + + + + + + + + + + Destination + + + + + + + + 0 + 0 + + + + + + + + + + + + Speed + + + + + + + 1 + + + 1000 + + + 100 + + + Qt::Horizontal + + + QSlider::TicksBelow + + + 50 + + + + + + + % + + + -20000.000000000000000 + + + 20000.000000000000000 + + + 100.000000000000000 + + + + + + + ... + + + QToolButton::InstantPopup + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + KUrlRequester + QWidget +
kurlrequester.h
+
+
+ + + + buttonBox + accepted() + ClipSpeed_UI + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + ClipSpeed_UI + reject() + + + 316 + 260 + + + 286 + 274 + + + + +