m_transcodeAction(NULL),
m_doc(NULL),
m_refreshed(false),
- m_infoQueue(),
m_thumbnailQueue(),
m_abortAllProxies(false)
{
ProjectList::~ProjectList()
{
m_abortAllProxies = true;
+ m_thumbnailQueue.clear();
delete m_menu;
m_listView->blockSignals(true);
m_listView->clear();
e.setAttribute("length", length);
}
}
- emit getFileProperties(e, item->clipId(), m_listView->iconSize().height(), true, false);
+ emit getFileProperties(e, item->clipId(), m_listView->iconSize().height(), true);
}
}
}
void ProjectList::slotClipSelected()
{
- if (!m_listView->isEnabled()) return;
if (m_listView->currentItem()) {
if (m_listView->currentItem()->type() == PROJECTFOLDERTYPE) {
emit clipSelected(NULL);
void ProjectList::slotAddClip(DocClipBase *clip, bool getProperties)
{
- m_listView->setEnabled(false);
+ //m_listView->setEnabled(false);
const QString parent = clip->getProperty("groupid");
ProjectItem *item = NULL;
monitorItemEditing(false);
item = new ProjectItem(m_listView, clip);
}
if (item->data(0, DurationRole).isNull()) item->setData(0, DurationRole, i18n("Loading"));
+ QString proxy = clip->getProperty("proxy");
+ if (!proxy.isEmpty() && proxy != "-") slotCreateProxy(clip->getId());
connect(clip, SIGNAL(createProxy(const QString &)), this, SLOT(slotCreateProxy(const QString &)));
connect(clip, SIGNAL(abortProxy(const QString &, const QString &)), this, SLOT(slotAbortProxy(const QString, const QString)));
if (getProperties) {
+ int height = m_listView->iconSize().height();
+ int width = (int)(height * m_render->dar());
+ QPixmap pix = KIcon("video-x-generic").pixmap(QSize(width, height));
+ item->setData(0, Qt::DecorationRole, pix);
+ //item->setFlags(Qt::ItemIsSelectable);
m_listView->processLayout();
QDomElement e = clip->toXML().cloneNode().toElement();
e.removeAttribute("file_hash");
- m_mutex.lock();
- m_infoQueue.insert(clip->getId(), e);
- m_mutex.unlock();
+ emit getFileProperties(e, clip->getId(), m_listView->iconSize().height(), true);
}
else if (item->hasProxy() && !item->isProxyRunning()) {
slotCreateProxy(clip->getId());
clip->askForAudioThumbs();
KUrl url = clip->fileURL();
- if (getProperties == false && !clip->getClipHash().isEmpty()) {
- QString cachedPixmap = m_doc->projectFolder().path(KUrl::AddTrailingSlash) + "thumbs/" + clip->getClipHash() + ".png";
- if (QFile::exists(cachedPixmap)) {
- QPixmap pix(cachedPixmap);
- if (pix.isNull())
- KIO::NetAccess::del(KUrl(cachedPixmap), this);
- item->setData(0, Qt::DecorationRole, pix);
- }
- }
#ifdef NEPOMUK
if (!url.isEmpty() && KdenliveSettings::activate_nepomuk()) {
// if file has Nepomuk comment, use it
}
}
monitorItemEditing(true);
- if (m_listView->isEnabled()) {
- updateButtons();
- }
-
- //if (getProperties && m_processingClips.isEmpty())
- //m_queueRunner = QtConcurrent::run(this, &ProjectList::slotProcessNextClipInQueue);
- if (getProperties)
- QtConcurrent::run(this, &ProjectList::slotProcessNextClipInQueue);
+ updateButtons();
}
void ProjectList::slotGotProxy(const QString &proxyPath)
e.setAttribute("length", length);
}
}
- e.setAttribute("replace", 1);
- m_mutex.lock();
- m_infoQueue.insert(clip->getId(), e);
- m_mutex.unlock();
- //if (!m_queueRunner.isRunning() && m_processingClips.isEmpty()) m_queueRunner = QtConcurrent::run(this, &ProjectList::slotProcessNextClipInQueue);
- QtConcurrent::run(this, &ProjectList::slotProcessNextClipInQueue);
+ emit getFileProperties(e, clip->getId(), m_listView->iconSize().height(), true);
}
void ProjectList::slotResetProjectList()
m_abortAllProxies = true;
m_proxyThreads.waitForFinished();
m_proxyThreads.clearFutures();
+ m_thumbnailQueue.clear();
m_listView->clear();
emit clipSelected(NULL);
- m_thumbnailQueue.clear();
- m_infoQueue.clear();
m_refreshed = false;
m_abortAllProxies = false;
}
-void ProjectList::slotProcessNextClipInQueue()
-{
- if (m_infoQueue.isEmpty()) {
- emit processNextThumbnail();
- return;
- }
- QMutexLocker locker(&m_mutex);
- QMap<QString, QDomElement>::const_iterator j = m_infoQueue.constBegin();
- if (j != m_infoQueue.constEnd()) {
- QDomElement dom = j.value().cloneNode().toElement();
- const QString id = j.key();
- m_infoQueue.remove(id);
- m_processingClips.append(id);
- locker.unlock();
- bool replace;
- if (dom.hasAttribute("replace")) {
- // Proxy action was enabled / disabled and we want to replace current producer
- dom.removeAttribute("replace");
- replace = true;
- }
- else replace = false;
- bool selectClip = !replace;
- if (m_infoQueue.count() > 1) selectClip = false;
- emit getFileProperties(dom, id, m_listView->iconSize().height(), replace, selectClip);
- }
-}
-
void ProjectList::slotUpdateClip(const QString &id)
{
ProjectItem *item = getItemById(id);
monitorItemEditing(true);
}
+void ProjectList::getCachedThumbnail(ProjectItem *item)
+{
+ if (!item) return;
+ DocClipBase *clip = item->referencedClip();
+ if (!clip) return;
+ QString cachedPixmap = m_doc->projectFolder().path(KUrl::AddTrailingSlash) + "thumbs/" + clip->getClipHash() + ".png";
+ if (QFile::exists(cachedPixmap)) {
+ QPixmap pix(cachedPixmap);
+ if (pix.isNull()) {
+ KIO::NetAccess::del(KUrl(cachedPixmap), this);
+ requestClipThumbnail(item->clipId());
+ }
+ else item->setData(0, Qt::DecorationRole, pix);
+ }
+ else requestClipThumbnail(item->clipId());
+}
+
void ProjectList::updateAllClips(bool displayRatioChanged, bool fpsChanged)
{
m_listView->setSortingEnabled(false);
xml.removeAttribute("file_hash");
xml.removeAttribute("proxy_out");
}
- m_mutex.lock();
- m_infoQueue.insert(clip->getId(), xml);
- m_mutex.unlock();
- QtConcurrent::run(this, &ProjectList::slotProcessNextClipInQueue);
+ emit getFileProperties(xml, clip->getId(), m_listView->iconSize().height(), xml.attribute("replace") == "1");
}
else {
item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDropEnabled);
item->setData(0, Qt::DecorationRole, pixmap);
}
}
- } else {
- if (displayRatioChanged || item->data(0, Qt::DecorationRole).isNull())
+ } else {
+ if (displayRatioChanged)
requestClipThumbnail(clip->getId());
+ else if (item->data(0, Qt::DecorationRole).isNull()) {
+ getCachedThumbnail(item);
+ }
if (item->data(0, DurationRole).toString().isEmpty()) {
item->changeDuration(item->referencedClip()->producer()->get_playtime());
}
++it;
}
- //if (!m_queueRunner.isRunning() && m_processingClips.isEmpty()) m_queueRunner = QtConcurrent::run(this, &ProjectList::slotProcessNextClipInQueue);
- //QtConcurrent::run(this, &ProjectList::slotProcessNextClipInQueue);
- /*while (!m_infoQueue.isEmpty()) {
- QtConcurrent::run(this, &ProjectList::slotProcessNextClipInQueue);
- }*/
-
- if (m_listView->isEnabled())
- monitorItemEditing(true);
m_listView->setSortingEnabled(true);
- if (m_infoQueue.isEmpty()) {
+ if (m_render->processingItems() == 0) {
+ monitorItemEditing(true);
slotProcessNextThumbnail();
}
}
ProjectItem *item = getItemById(id);
m_processingClips.removeAll(id);
m_thumbnailQueue.removeAll(id);
- //if (!m_queueRunner.isRunning() && m_processingClips.isEmpty()) m_queueRunner = QtConcurrent::run(this, &ProjectList::slotProcessNextClipInQueue);
- QtConcurrent::run(this, &ProjectList::slotProcessNextClipInQueue);
if (item) {
+ item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsDropEnabled);
const QString path = item->referencedClip()->fileURL().path();
if (item->referencedClip()->isPlaceHolder()) replace = false;
if (!path.isEmpty()) {
{
ProjectItem *item = getItemById(id);
if (item) {
+ item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsDropEnabled);
if (durationError) {
kDebug() << "Proxy duration is wrong, try changing transcoding parameters.";
emit displayMessage(i18n("Proxy clip unusable (duration is different from original)."), -2);
}
m_processingClips.removeAll(id);
m_thumbnailQueue.removeAll(id);
- //if (!m_queueRunner.isRunning() && m_processingClips.isEmpty()) m_queueRunner = QtConcurrent::run(this, &ProjectList::slotProcessNextClipInQueue);
- QtConcurrent::run(this, &ProjectList::slotProcessNextClipInQueue);
}
void ProjectList::slotAddColorClip()
m_abortAllProxies = true;
m_proxyThreads.waitForFinished();
m_proxyThreads.clearFutures();
+ m_thumbnailQueue.clear();
m_listView->clear();
m_processingClips.clear();
+
m_listView->setSortingEnabled(false);
emit clipSelected(NULL);
- m_thumbnailQueue.clear();
- m_infoQueue.clear();
m_refreshed = false;
m_fps = doc->fps();
m_timecode = doc->timecode();
void ProjectList::slotCheckForEmptyQueue()
{
- if (m_processingClips.isEmpty() && m_thumbnailQueue.isEmpty() && m_infoQueue.isEmpty()) {
+ if (m_render->processingItems() == 0 && m_thumbnailQueue.isEmpty()) {
if (!m_refreshed) {
emit loadingIsOver();
emit displayMessage(QString(), -1);
m_refreshed = true;
}
- m_listView->blockSignals(false);
- m_listView->setEnabled(true);
updateButtons();
} else if (!m_refreshed) {
QTimer::singleShot(300, this, SLOT(slotCheckForEmptyQueue()));
void ProjectList::requestClipThumbnail(const QString id)
{
if (!m_thumbnailQueue.contains(id)) m_thumbnailQueue.append(id);
+ slotProcessNextThumbnail();
}
void ProjectList::slotProcessNextThumbnail()
{
- if (m_thumbnailQueue.isEmpty() && m_infoQueue.isEmpty()) {
- slotCheckForEmptyQueue();
+ if (m_render->processingItems() > 0) {
return;
}
- if (!m_infoQueue.isEmpty()) {
- //QTimer::singleShot(300, this, SLOT(slotProcessNextThumbnail()));
+ if (m_thumbnailQueue.isEmpty()) {
+ slotCheckForEmptyQueue();
return;
}
- if (m_thumbnailQueue.count() > 1) {
- int max = m_doc->clipManager()->clipsCount();
- emit displayMessage(i18n("Loading thumbnails"), (int)(100 *(max - m_thumbnailQueue.count()) / max));
- }
+ int max = m_doc->clipManager()->clipsCount();
+ emit displayMessage(i18n("Loading thumbnails"), (int)(100 *(max - m_thumbnailQueue.count()) / max));
slotRefreshClipThumbnail(m_thumbnailQueue.takeFirst(), false);
}
}
}
-void ProjectList::slotReplyGetFileProperties(const QString &clipId, Mlt::Producer *producer, const QMap < QString, QString > &properties, const QMap < QString, QString > &metadata, bool replace, bool selectClip)
+void ProjectList::slotReplyGetFileProperties(const QString &clipId, Mlt::Producer *producer, const stringMap &properties, const stringMap &metadata, bool replace, bool refreshThumbnail)
{
QString toReload;
ProjectItem *item = getItemById(clipId);
- if (!m_refreshed) {
- // we are still finishing to load the document
- selectClip = false;
+
+ int queue = m_render->processingItems();
+ if (queue == 0) {
+ m_listView->setEnabled(true);
}
- m_processingClips.removeAll(clipId);
- if (m_infoQueue.isEmpty() && m_processingClips.isEmpty()) m_listView->setEnabled(true);
if (item && producer) {
- //m_listView->blockSignals(true);
monitorItemEditing(false);
DocClipBase *clip = item->referencedClip();
item->setProperties(properties, metadata);
- if (clip->isPlaceHolder() && producer->is_valid()) {
- clip->setValid();
+ if (producer->is_valid()) {
+ if (clip->isPlaceHolder()) {
+ clip->setValid();
+ toReload = clipId;
+ }
item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsDropEnabled);
- toReload = clipId;
}
clip->setProducer(producer, replace);
clip->askForAudioThumbs();
+ if (refreshThumbnail) getCachedThumbnail(item);
// Proxy stuff
QString size = properties.value("frame_size");
if (!useProxy() && clip->getProperty("proxy").isEmpty()) setProxyStatus(item, NOPROXY);
}
}
- if (!replace && item->data(0, Qt::DecorationRole).isNull())
+ if (!replace && item->data(0, Qt::DecorationRole).isNull() && !refreshThumbnail) {
requestClipThumbnail(clipId);
+ }
if (!toReload.isEmpty())
item->slotSetToolTip();
-
- if (m_listView->isEnabled())
- monitorItemEditing(true);
} else kDebug() << "//////// COULD NOT FIND CLIP TO UPDATE PRPS...";
- if (selectClip && m_infoQueue.isEmpty()) {
- if (item && m_infoQueue.isEmpty() && m_thumbnailQueue.isEmpty() && m_processingClips.isEmpty()) {
+ if (queue == 0) {
+ monitorItemEditing(true);
+ if (item && m_thumbnailQueue.isEmpty()) {
m_listView->setCurrentItem(item);
bool updatedProfile = false;
if (item->parent()) {
}
} else {
int max = m_doc->clipManager()->clipsCount();
- emit displayMessage(i18n("Loading clips"), (int)(100 *(max - m_infoQueue.count()) / max));
+ emit displayMessage(i18n("Loading clips"), (int)(100 *(max - queue) / max));
}
+ processNextThumbnail();
+ }
+ if (item && queue == 0 && replace) {
+ // update clip in clip monitor
+ if (item->isSelected() && m_listView->selectedItems().count() == 1)
+ emit clipSelected(item->referencedClip());
+ //TODO: Make sure the line below has no side effect
+ toReload = clipId;
+ }
+ if (!item) {
+ // no item for producer, delete it
+ delete producer;
}
- if (item && m_listView->isEnabled() && replace) {
- // update clip in clip monitor
- if (item->isSelected() && m_listView->selectedItems().count() == 1)
- emit clipSelected(item->referencedClip());
- //TODO: Make sure the line below has no side effect
- toReload = clipId;
- }
if (!toReload.isEmpty())
emit clipNeedsReload(toReload, true);
-
- //if (!m_queueRunner.isRunning() && m_processingClips.isEmpty()) m_queueRunner = QtConcurrent::run(this, &ProjectList::slotProcessNextClipInQueue);
- QtConcurrent::run(this, &ProjectList::slotProcessNextClipInQueue);
}
bool ProjectList::adjustProjectProfileToItem(ProjectItem *item)
return m_doc->getDocumentProperty("generateimageproxy").toInt();
}
-void ProjectList::slotReplyGetImage(const QString &clipId, const QPixmap &pix)
+void ProjectList::slotReplyGetImage(const QString &clipId, const QImage &img)
+{
+ QPixmap pix = QPixmap::fromImage(img);
+ setThumbnail(clipId, pix);
+}
+
+void ProjectList::slotReplyGetImage(const QString &clipId, const QString &name, int width, int height)
+{
+ QPixmap pix = KIcon(name).pixmap(QSize(width, height));
+ setThumbnail(clipId, pix);
+}
+
+void ProjectList::setThumbnail(const QString &clipId, const QPixmap &pix)
{
ProjectItem *item = getItemById(clipId);
if (item && !pix.isNull()) {
monitorItemEditing(false);
item->setData(0, Qt::DecorationRole, pix);
monitorItemEditing(true);
+ //update();
m_doc->cachePixmap(item->getClipHash(), pix);
- if (m_listView->isEnabled())
- m_listView->blockSignals(false);
}
}
void ProjectList::slotForceProcessing(const QString &id)
{
- while (m_infoQueue.contains(id)) {
- slotProcessNextClipInQueue();
- }
+ m_render->forceProcessing(id);
}
void ProjectList::slotAddOrUpdateSequence(const QString frameName)
//kDebug()<<"TRANSCOD: "<<parameters;
QProcess myProcess;
+ myProcess.setProcessChannelMode(QProcess::MergedChannels);
myProcess.start(KdenliveSettings::rendererpath(), parameters);
myProcess.waitForStarted();
int result = -1;
result = -2;
}
else {
- QString log = QString(myProcess.readAllStandardOutput());
- log.append(QString(myProcess.readAllStandardError()));
+ QString log = QString(myProcess.readAll());
processLogInfo(info.dest, &duration, log);
}
myProcess.waitForFinished(500);
parameters << info.dest;
kDebug()<<"// STARTING PROXY GEN: "<<parameters;
QProcess myProcess;
+ myProcess.setProcessChannelMode(QProcess::MergedChannels);
myProcess.start("ffmpeg", parameters);
myProcess.waitForStarted();
int result = -1;
}
else {
- QString log = QString(myProcess.readAllStandardOutput());
- log.append(QString(myProcess.readAllStandardError()));
+ QString log = QString(myProcess.readAll());
processLogInfo(info.dest, &duration, log);
}
myProcess.waitForFinished(500);
}
if (command->childCount() > 0) m_doc->commandStack()->push(command);
else delete command;
- //if (!m_infoQueue.isEmpty() && !m_queueRunner.isRunning() && m_processingClips.isEmpty()) m_queueRunner = QtConcurrent::run(this, &ProjectList::slotProcessNextClipInQueue);
- QtConcurrent::run(this, &ProjectList::slotProcessNextClipInQueue);
}
void ProjectList::slotProxyCurrentItem(bool doProxy)
m_doc->commandStack()->push(command);
}
else delete command;
- //if (!m_infoQueue.isEmpty() && !m_queueRunner.isRunning() && m_processingClips.isEmpty()) m_queueRunner = QtConcurrent::run(this, &ProjectList::slotProcessNextClipInQueue);
- if (!m_infoQueue.isEmpty()) QtConcurrent::run(this, &ProjectList::slotProcessNextClipInQueue);
}