#include "projectlist.h"
#include "projectitem.h"
-#include "addfoldercommand.h"
+#include "commands/addfoldercommand.h"
#include "kdenlivesettings.h"
#include "slideshowclip.h"
#include "ui_colorclip_ui.h"
#include "projectlistview.h"
#include "timecodedisplay.h"
#include "profilesdialog.h"
-#include "editclipcommand.h"
-#include "editclipcutcommand.h"
-#include "editfoldercommand.h"
-#include "addclipcutcommand.h"
+#include "commands/editclipcommand.h"
+#include "commands/editclipcutcommand.h"
+#include "commands/editfoldercommand.h"
+#include "commands/addclipcutcommand.h"
#include "ui_templateclip_ui.h"
m_transcodeAction(NULL),
m_doc(NULL),
m_refreshed(false),
+ m_allClipsProcessed(false),
m_thumbnailQueue(),
m_abortAllProxies(false),
m_invalidClipDialog(NULL)
QTreeWidgetItemIterator it(m_listView);
ProjectItem *item;
- while (*it) {
+ while (*it && !m_abortAllProxies) {
if ((*it)->type() == PROJECTCLIPTYPE) {
item = static_cast <ProjectItem *>(*it);
if (item->referencedClip()->getProperty("proxy") == proxyPath)
void ProjectList::slotResetProjectList()
{
+ m_listView->blockSignals(true);
m_abortAllProxies = true;
m_proxyThreads.waitForFinished();
m_proxyThreads.clearFutures();
m_listView->clear();
emit clipSelected(NULL);
m_refreshed = false;
+ m_allClipsProcessed = false;
m_abortAllProxies = false;
+ m_listView->blockSignals(false);
}
void ProjectList::slotUpdateClip(const QString &id)
}
else item->setData(0, Qt::DecorationRole, pix);
}
- else requestClipThumbnail(item->clipId());
+ else {
+ requestClipThumbnail(item->clipId());
+ }
+}
+
+void ProjectList::getCachedThumbnail(SubProjectItem *item)
+{
+ if (!item) return;
+ ProjectItem *parentItem = static_cast <ProjectItem *>(item->parent());
+ if (!parentItem) return;
+ DocClipBase *clip = parentItem->referencedClip();
+ if (!clip) return;
+ int pos = item->zone().x();
+ QString cachedPixmap = m_doc->projectFolder().path(KUrl::AddTrailingSlash) + "thumbs/" + clip->getClipHash() + "#" + QString::number(pos) + ".png";
+ if (QFile::exists(cachedPixmap)) {
+ QPixmap pix(cachedPixmap);
+ if (pix.isNull()) {
+ KIO::NetAccess::del(KUrl(cachedPixmap), this);
+ requestClipThumbnail(parentItem->clipId() + '#' + QString::number(pos));
+ }
+ else item->setData(0, Qt::DecorationRole, pix);
+ }
+ else requestClipThumbnail(parentItem->clipId() + '#' + QString::number(pos));
}
void ProjectList::updateAllClips(bool displayRatioChanged, bool fpsChanged)
{
+ if (!m_allClipsProcessed) m_listView->setEnabled(false);
m_listView->setSortingEnabled(false);
-
QTreeWidgetItemIterator it(m_listView);
DocClipBase *clip;
ProjectItem *item;
QPainter p(&missingPixmap);
p.drawPixmap(3, 3, icon.pixmap(width - 6, height - 6));
p.end();
- kDebug()<<"//////////////7 UPDATE ALL CLPS";
+
+ int max = m_doc->clipManager()->clipsCount();
+ max = qMax(1, max);
+ int ct = 0;
+
while (*it) {
+ emit displayMessage(i18n("Loading thumbnails"), (int)(100 *(max - ct++) / max));
if ((*it)->type() == PROJECTSUBCLIPTYPE) {
// subitem
SubProjectItem *sub = static_cast <SubProjectItem *>(*it);
- if (displayRatioChanged || sub->data(0, Qt::DecorationRole).isNull()) {
+ if (displayRatioChanged) {
item = static_cast <ProjectItem *>((*it)->parent());
requestClipThumbnail(item->clipId() + '#' + QString::number(sub->zone().x()));
}
+ else if (sub->data(0, Qt::DecorationRole).isNull()) {
+ getCachedThumbnail(sub);
+ }
++it;
continue;
} else if ((*it)->type() == PROJECTFOLDERTYPE) {
item = static_cast <ProjectItem *>(*it);
clip = item->referencedClip();
if (item->referencedClip()->getProducer() == NULL) {
- if (clip->isPlaceHolder() == false) {
+ if (clip->isPlaceHolder() == false && !item->isProxyRunning()) {
QDomElement xml = clip->toXML();
if (fpsChanged) {
xml.removeAttribute("out");
}
m_listView->setSortingEnabled(true);
+ m_allClipsProcessed = true;
if (m_render->processingItems() == 0) {
monitorItemEditing(true);
slotProcessNextThumbnail();
m_listView->setSortingEnabled(false);
emit clipSelected(NULL);
m_refreshed = false;
+ m_allClipsProcessed = false;
m_fps = doc->fps();
m_timecode = doc->timecode();
m_commandStack = doc->commandStack();
}
QList <DocClipBase*> list = doc->clipManager()->documentClipList();
- if (list.isEmpty()) m_refreshed = true;
+ if (list.isEmpty()) {
+ // blank document
+ m_refreshed = true;
+ m_allClipsProcessed = true;
+ }
for (int i = 0; i < list.count(); i++)
slotAddClip(list.at(i), false);
QDomDocument doc;
QDomElement prods = doc.createElement("producerlist");
doc.appendChild(prods);
- kDebug() << "//////////// PRO LIST BUILD PRDSLIST ";
QTreeWidgetItemIterator it(m_listView);
while (*it) {
if ((*it)->type() != PROJECTCLIPTYPE) {
void ProjectList::slotCheckForEmptyQueue()
{
if (m_render->processingItems() == 0 && m_thumbnailQueue.isEmpty()) {
- if (!m_refreshed) {
- emit loadingIsOver();
+ if (!m_refreshed && m_allClipsProcessed) {
+ m_listView->setEnabled(true);
+ slotClipSelected();
+ QTimer::singleShot(500, this, SIGNAL(loadingIsOver()));
emit displayMessage(QString(), -1);
m_refreshed = true;
}
ProjectItem *item = getItemById(clipId);
int queue = m_render->processingItems();
- if (queue == 0) {
- m_listView->setEnabled(true);
- }
if (item && producer) {
monitorItemEditing(false);
DocClipBase *clip = item->referencedClip();
}
}
- if (!replace && item->data(0, Qt::DecorationRole).isNull()) {
- requestClipThumbnail(clipId);
+ if (!replace && m_allClipsProcessed && item->data(0, Qt::DecorationRole).isNull()) {
+ getCachedThumbnail(item);
}
if (!toReload.isEmpty())
item->slotSetToolTip();
int max = m_doc->clipManager()->clipsCount();
emit displayMessage(i18n("Loading clips"), (int)(100 *(max - queue) / max));
}
- processNextThumbnail();
+ if (m_allClipsProcessed) emit processNextThumbnail();
}
if (replace && item) {
toReload = clipId;
// Proxy process crashed
QFile::remove(info.dest);
setProxyStatus(info.dest, PROXYCRASHED);
- }
-
+ }
+ return;
}
if (info.type == IMAGE) {
m_abortProxy.removeAll(info.dest);
m_processingProxy.removeAll(info.dest);
QFile::remove(info.dest);
- setProxyStatus(info.dest, NOPROXY);
+ if (!m_abortAllProxies) setProxyStatus(info.dest, NOPROXY);
result = -2;
}
if (proxyPath.isEmpty() || m_abortAllProxies) return;
QTreeWidgetItemIterator it(m_listView);
ProjectItem *item;
- while (*it) {
+ while (*it && !m_abortAllProxies) {
if ((*it)->type() == PROJECTCLIPTYPE) {
item = static_cast <ProjectItem *>(*it);
if (item->referencedClip()->getProperty("proxy") == proxyPath) {