]> git.sesse.net Git - kdenlive/commitdiff
* Fix issues with one frame clips
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 21 Jun 2009 17:29:00 +0000 (17:29 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 21 Jun 2009 17:29:00 +0000 (17:29 +0000)
* Fix waiting render jobs lost on exit:
http://www.kdenlive.org:80/mantis/view.php?id=939

svn path=/trunk/kdenlive/; revision=3614

src/customtrackview.cpp
src/mainwindow.cpp
src/mainwindow.h
src/renderer.cpp
src/renderwidget.cpp
src/renderwidget.h
src/trackview.cpp

index 61bcf6bdd04ab298828e6c517d571b6baefdc2e6..7bdd8069766ec873c29215b2a7e0bfd22e779b2f 100644 (file)
@@ -2737,7 +2737,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
 
 void CustomTrackView::deleteClip(ItemInfo info)
 {
-    ClipItem *item = getClipItemAt((int) info.startPos.frames(m_document->fps()) + 1, info.track);
+    ClipItem *item = getClipItemAt((int) info.startPos.frames(m_document->fps()), info.track);
 
     if (!item || m_document->renderer()->mltRemoveClip(m_document->tracksCount() - info.track, info.startPos) == false) {
         emit displayMessage(i18n("Error removing clip at %1 on track %2", m_document->timecode().getTimecodeFromFrames(info.startPos.frames(m_document->fps())), info.track), ErrorMessage);
@@ -2850,7 +2850,7 @@ void CustomTrackView::changeClipSpeed()
 void CustomTrackView::doChangeClipSpeed(ItemInfo info, const double speed, const double oldspeed, const QString &id)
 {
     DocClipBase *baseclip = m_document->clipManager()->getClipById(id);
-    ClipItem *item = getClipItemAt((int) info.startPos.frames(m_document->fps()) + 1, info.track);
+    ClipItem *item = getClipItemAt((int) info.startPos.frames(m_document->fps()), info.track);
     if (!item) {
         kDebug() << "ERROR: Cannot find clip for speed change";
         emit displayMessage(i18n("Cannot find clip for speed change"), ErrorMessage);
index 71b0f2f72b2e3f8e7e3fa6f76da04bc4bf331e7e..4530f1a23fcce15dd42e8231687da8099c0a3e81 100644 (file)
@@ -397,9 +397,7 @@ bool MainWindow::queryClose()
             switch (KMessageBox::warningYesNoCancel(this, i18n("You have %1 rendering jobs waiting in the queue.\nWhat do you want to do with these jobs?", waitingJobs), QString(), KGuiItem(i18n("Start them now")), KGuiItem(i18n("Delete them")))) {
             case KMessageBox::Yes :
                 // create script with waiting jobs and start it
-                //startWaitingRenderJobs();
-                KMessageBox::sorry(this, "not implementd yet");
-                return false;
+                if (m_renderWidget->startWaitingRenderJobs() == false) return false;
                 break;
             case KMessageBox::No :
                 // Don't do anything, jobs will be deleted
@@ -2788,10 +2786,6 @@ void MainWindow::slotSetDocumentRenderProfile(const QString &dest, const QString
     m_activeDocument->setModified(true);
 }
 
-void MainWindow::startWaitingRenderJobs()
-{
-
-}
 
 void MainWindow::slotPrepareRendering(bool scriptExport, bool zoneOnly, const QString &chapterFile)
 {
index c43c6e7ef1f21e6b90813de7d95ff2bf6eeb6667..d97d87dcc2c353b47bac1d7e30cb27c5aa2eda7b 100644 (file)
@@ -193,7 +193,7 @@ private:
     QStringList m_pluginFileNames;
     QByteArray m_timelineState;
     void loadTranscoders();
-    void startWaitingRenderJobs();
+
 
 public slots:
     void openFile(const KUrl &url);
index eeabb2d96e4db988386e6e7aeb2d0de145fe8571..e3e9b428dcecfbe1d60000e99dedd8080698fbf1 100644 (file)
@@ -2423,7 +2423,7 @@ bool Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEn
     mlt_service_lock(service.get_service());
     Mlt::Producer trackProducer(tractor.track(startTrack));
     Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
-    int clipIndex = trackPlaylist.get_clip_index_at(moveStart + 1);
+    int clipIndex = trackPlaylist.get_clip_index_at(moveStart);
     kDebug() << "//////  LOOKING FOR CLIP TO MOVE, INDEX: " << clipIndex;
     bool checkLength = false;
     if (endTrack == startTrack) {
index 3ab5dda94a64907011bea601e7477e6deee4bcb4..72ab8d3ab0491dc2b54c2dcac9447d8068f29ef1 100644 (file)
@@ -58,7 +58,8 @@ const int FINISHEDJOB = 2;
 
 RenderWidget::RenderWidget(const QString &projectfolder, QWidget * parent) :
         QDialog(parent),
-        m_projectFolder(projectfolder)
+        m_projectFolder(projectfolder),
+        m_blockProcessing(false)
 {
     m_view.setupUi(this);
     setWindowTitle(i18n("Rendering"));
@@ -787,6 +788,7 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const
 
 void RenderWidget::checkRenderStatus()
 {
+    if (m_blockProcessing) return;
     QTreeWidgetItem *item = m_view.running_jobs->topLevelItem(0);
     while (item) {
         if (item->data(1, Qt::UserRole + 2).toInt() == RUNNINGJOB) break;
@@ -1517,34 +1519,52 @@ void RenderWidget::setRenderProfile(const QString &dest, const QString &name)
 
 }
 
-QMap <QStringList, QStringList> RenderWidget::waitingJobsData()
+bool RenderWidget::startWaitingRenderJobs()
 {
+    m_blockProcessing = true;
+    QString autoscriptFile = getFreeScriptName("auto");
+    QFile file(autoscriptFile);
+    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
+        kWarning() << "//////  ERROR writing to file: " << autoscriptFile;
+        KMessageBox::error(0, i18n("Cannot write to file %1", autoscriptFile));
+        return false;
+    }
 
-    QMap <QStringList, QStringList> renderData;
-    /*  QTreeWidgetItem *item = m_view.running_jobs->topLevelItem(0);
-      while (item) {
-          if (item->data(1, Qt::UserRole + 2).toInt() == WAITINGJOB) {
-       if (item->data(1, Qt::UserRole + 4).isNull()) {
-    // We only start straight jobs, script jobs are already saved somewhere...
-    const QStringList params = item->data(1, Qt::UserRole + 3).toStringList();
-    const QStringList ov_params = item->data(1, Qt::UserRole + 2).toStringList();
-    renderData.insert(params, ov_params);
-       }
+    QString renderer = QCoreApplication::applicationDirPath() + QString("/kdenlive_render");
+    if (!QFile::exists(renderer)) renderer = "kdenlive_render";
+    QTextStream outStream(&file);
+    outStream << "#! /bin/sh" << "\n" << "\n";
+    QTreeWidgetItem *item = m_view.running_jobs->topLevelItem(0);
+    while (item) {
+        if (item->data(1, Qt::UserRole + 2).toInt() == WAITINGJOB) {
+            // Add render process for item
+            const QString params = item->data(1, Qt::UserRole + 3).toStringList().join(" ");
+            outStream << renderer << " " << params << "\n";
+        }
+        item = m_view.running_jobs->itemBelow(item);
     }
-          item = m_view.running_jobs->itemBelow(item);
-      }*/
-    return renderData;
+    // erase itself when rendering is finished
+    outStream << "rm " << autoscriptFile << "\n" << "\n";
+    if (file.error() != QFile::NoError) {
+        KMessageBox::error(0, i18n("Cannot write to file %1", autoscriptFile));
+        file.close();
+        return false;
+    }
+    file.close();
+    QFile::setPermissions(autoscriptFile, file.permissions() | QFile::ExeUser);
+    QProcess::startDetached(autoscriptFile, QStringList());
+    return true;
 }
 
-QString RenderWidget::getFreeScriptName()
+QString RenderWidget::getFreeScriptName(const QString &prefix)
 {
     int ix = 0;
     QString scriptsFolder = m_projectFolder + "/scripts/";
     KStandardDirs::makeDir(scriptsFolder);
-    QString path = scriptsFolder + i18n("script") + QString::number(ix).rightJustified(3, '0', false) + ".sh";
-    while (QFile::exists(path)) {
+    QString path;
+    while (path.isEmpty() || QFile::exists(path)) {
         ix++;
-        path = scriptsFolder + i18n("script") + QString::number(ix).rightJustified(3, '0', false) + ".sh";
+        path = scriptsFolder + prefix + i18n("script") + QString::number(ix).rightJustified(3, '0', false) + ".sh";
     }
     return path;
 }
index 32e910cc6634778ae0f7b8dfd692d4cefb2adfa4..33cc4b5abce974563c90ea8d4deb9c43540210b9 100644 (file)
@@ -148,8 +148,8 @@ public:
     void reloadProfiles();
     void setRenderProfile(const QString &dest, const QString &name);
     int waitingJobsCount() const;
-    QMap <QStringList, QStringList> waitingJobsData();
-    QString getFreeScriptName();
+    QString getFreeScriptName(const QString &prefix = QString());
+    bool startWaitingRenderJobs();
 
 public slots:
     void slotExport(bool scriptExport, int zoneIn, int zoneOut, const QString &playlistPath, const QString &scriptPath);
@@ -183,6 +183,7 @@ private:
     Ui::RenderWidget_UI m_view;
     MltVideoProfile m_profile;
     QString m_projectFolder;
+    bool m_blockProcessing;
     void parseProfiles(QString meta = QString(), QString group = QString(), QString profile = QString());
     void parseFile(QString exportFile, bool editable);
     void updateButtons();
index e5acd82dfb5788b85969c82ecdd461b7fc17cab8..3abf8579b66cedcdef22f7eca3573acb6f4b85f0 100644 (file)
@@ -477,7 +477,7 @@ int TrackView::slotAddProjectTrack(int ix, QDomElement xml, bool locked)
             // Found a clip
             int in = elem.attribute("in").toInt();
             int out = elem.attribute("out").toInt();
-            if (in > out || in == out || m_invalidProducers.contains(elem.attribute("producer"))) {
+            if (in > out || /*in == out ||*/ m_invalidProducers.contains(elem.attribute("producer"))) {
                 m_documentErrors.append(i18n("Invalid clip removed from track %1 at %2\n", ix, position));
                 xml.removeChild(children.at(nodeindex));
                 nodeindex--;