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);
#include <QTimeLine>
#include <QMenu>
#include <QUndoStack>
+#include <QMutex>
+#include <QWaitCondition>
#include "kdenlivedoc.h"
#include "docclipbase.h"
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);
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
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)));
m_listView->blockSignals(false);
}
if (getProperties && !m_queueTimer.isActive())
- m_queueTimer.start();
+ slotProcessNextClipInQueue();
}
void ProjectList::slotResetProjectList()
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)
emit projectModified();
}
+void ProjectList::slotForceProcessing(const QString &id)
+{
+ while (m_infoQueue.contains(id)) {
+ slotProcessNextClipInQueue();
+ }
+}
+
#include "projectlist.moc"
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;