]> git.sesse.net Git - kdenlive/commitdiff
Fix crash when undoing / redoing add clip to project & to timeline
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Tue, 27 Jul 2010 10:47:22 +0000 (10:47 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Tue, 27 Jul 2010 10:47:22 +0000 (10:47 +0000)
svn path=/trunk/kdenlive/; revision=4657

src/customtrackview.cpp
src/customtrackview.h
src/mainwindow.cpp
src/projectlist.cpp
src/projectlist.h

index 0dbcbd82f6b0613c43099c39919ce7fbc818bb62..626f99ec4308deef895907656cf2400e7a1992cd 100644 (file)
@@ -3778,6 +3778,27 @@ void CustomTrackView::addClip(QDomElement xml, const QString &clipId, ItemInfo i
         emit displayMessage(i18n("No clip copied"), ErrorMessage);
         return;
     }
+
+    if (baseclip->producer() == NULL) {
+        // If the clip has no producer, we must wait until it is created...
+        m_mutex.lock();
+        emit displayMessage(i18n("Waiting for clip..."), InformationMessage);
+        emit forceClipProcessing(clipId);
+        qApp->processEvents();
+        for (int i = 0; i < 3; i++) {
+            if (baseclip->producer() == NULL) {
+                m_producerNotReady.wait(&m_mutex, 500 + 500 * i);
+            } else break;
+        }
+        if (baseclip->producer() == NULL) {
+            emit displayMessage(i18n("Cannot insert clip..."), ErrorMessage);
+            m_mutex.unlock();
+            return;
+        }
+        emit displayMessage(QString(), InformationMessage);
+        m_mutex.unlock();
+    }
+
     ClipItem *item = new ClipItem(baseclip, info, m_document->fps(), xml.attribute("speed", "1").toDouble(), xml.attribute("strobe", "1").toInt());
     item->setEffectList(effects);
     if (xml.hasAttribute("audio_only")) item->setAudioOnly(true);
index a5b9828ae2bd31688adbc33ee885087c4c3a45fd..4df0fdb1293d39f3ef2878108de90de7b027a537 100644 (file)
@@ -28,6 +28,8 @@
 #include <QTimeLine>
 #include <QMenu>
 #include <QUndoStack>
+#include <QMutex>
+#include <QWaitCondition>
 
 #include "kdenlivedoc.h"
 #include "docclipbase.h"
@@ -322,6 +324,9 @@ private:
     int m_selectedTrack;
     int m_spacerOffset;
 
+    QMutex m_mutex;
+    QWaitCondition m_producerNotReady;
+
     /** Get the index of the video track that is just below current track */
     int getPreviousVideoTrack(int track);
     void updatePositionEffects(ClipItem * item, ItemInfo info);
@@ -408,6 +413,7 @@ signals:
     void playMonitor();
     /** @brief Monitor document changes (for example the presence of audio data in timeline for export widget.*/
     void documentModified();
+    void forceClipProcessing(const QString &);
 };
 
 #endif
index 8281194a4a2835e6f0bba450497a3aeb6db7fed2..13c8b7843f3fb0d1a5f772f012ad97e9a389f4f6 100644 (file)
@@ -2136,6 +2136,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc)   //cha
     connect(trackView, SIGNAL(configTrack(int)), this, SLOT(slotConfigTrack(int)));
     connect(trackView, SIGNAL(updateTracksInfo()), this, SLOT(slotUpdateTrackInfo()));
     connect(trackView, SIGNAL(mousePosition(int)), this, SLOT(slotUpdateMousePosition(int)));
+    connect(trackView->projectView(), SIGNAL(forceClipProcessing(const QString &)), m_projectList, SLOT(slotForceProcessing(const QString &)));
     connect(m_projectMonitor, SIGNAL(renderPosition(int)), trackView, SLOT(moveCursorPos(int)));
     connect(m_projectMonitor, SIGNAL(zoneUpdated(QPoint)), trackView, SLOT(slotSetZone(QPoint)));
     connect(m_clipMonitor, SIGNAL(zoneUpdated(QPoint)), m_projectList, SLOT(slotUpdateClipCut(QPoint)));
index 2850075dfa94fa499ab6590d8098de3cab9e2d4d..dc5d239892099218a45185f11b9c282eca46a695 100644 (file)
@@ -953,7 +953,7 @@ void ProjectList::slotAddClip(DocClipBase *clip, bool getProperties)
             m_listView->blockSignals(false);
     }
     if (getProperties && !m_queueTimer.isActive())
-        m_queueTimer.start();
+        slotProcessNextClipInQueue();
 }
 
 void ProjectList::slotResetProjectList()
@@ -986,6 +986,7 @@ void ProjectList::slotProcessNextClipInQueue()
         m_infoQueue.remove(j.key());
         emit getFileProperties(dom, id, m_listView->iconSize().height(), false);
     }
+    if (!m_infoQueue.isEmpty()) m_queueTimer.start();
 }
 
 void ProjectList::slotUpdateClip(const QString &id)
@@ -1721,4 +1722,11 @@ void ProjectList::doUpdateClipCut(const QString &id, const QPoint oldzone, const
     emit projectModified();
 }
 
+void ProjectList::slotForceProcessing(const QString &id)
+{
+    while (m_infoQueue.contains(id)) {
+        slotProcessNextClipInQueue();
+    }
+}
+
 #include "projectlist.moc"
index 6d1972b5243e0f0a17d75b27b0a108df3416e569..efe8d4bb317d68eff9bd96992d99e03c11781367 100644 (file)
@@ -193,6 +193,7 @@ public slots:
     void regenerateTemplate(const QString &id);
     void slotUpdateClipCut(QPoint p);
     void slotAddClipCut(const QString &id, int in, int out);
+    void slotForceProcessing(const QString &id);
 
 private:
     ProjectListView *m_listView;