From: <j-...@us...> - 2009-06-24 01:22:48
|
Revision: 3634 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=3634&view=rev Author: j-b-m Date: 2009-06-24 00:22:09 +0000 (Wed, 24 Jun 2009) Log Message: ----------- Fix loading of project cached thumbs, when loading a document, reuse all cached properties if possible Modified Paths: -------------- trunk/kdenlive/src/customtrackview.cpp trunk/kdenlive/src/docclipbase.cpp trunk/kdenlive/src/docclipbase.h trunk/kdenlive/src/kdenlivedoc.cpp trunk/kdenlive/src/mainwindow.cpp trunk/kdenlive/src/mainwindow.h trunk/kdenlive/src/projectlist.cpp trunk/kdenlive/src/projectlist.h trunk/kdenlive/src/renderer.cpp Modified: trunk/kdenlive/src/customtrackview.cpp =================================================================== --- trunk/kdenlive/src/customtrackview.cpp 2009-06-23 20:54:56 UTC (rev 3633) +++ trunk/kdenlive/src/customtrackview.cpp 2009-06-24 00:22:09 UTC (rev 3634) @@ -764,7 +764,7 @@ RazorClipCommand* command = new RazorClipCommand(this, clip->info(), GenTime((int)(mapToScene(event->pos()).x()), m_document->fps())); m_document->renderer()->pause(); m_commandStack->push(command); - m_document->setModified(true); + setDocumentModified(); m_dragItem = NULL; event->accept(); return; @@ -1309,7 +1309,7 @@ } if (count > 0) { m_commandStack->push(effectCommand); - m_document->setModified(true); + setDocumentModified(); } else delete effectCommand; } @@ -1365,7 +1365,7 @@ } if (count > 0) { m_commandStack->push(effectCommand); - m_document->setModified(true); + setDocumentModified(); } else delete effectCommand; } @@ -1373,7 +1373,7 @@ { AddEffectCommand *command = new AddEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), effect, false); m_commandStack->push(command); - m_document->setModified(true); + setDocumentModified(); } void CustomTrackView::updateEffect(int track, GenTime pos, QDomElement effect, int ix, bool triggeredByUser) @@ -1415,7 +1415,7 @@ } } } - m_document->setModified(true); + setDocumentModified(); } void CustomTrackView::moveEffect(int track, GenTime pos, int oldPos, int newPos) @@ -1429,7 +1429,7 @@ clip->setEffectAt(newPos - 1, before); emit clipItemSelected(clip, newPos - 1); } - m_document->setModified(true); + setDocumentModified(); } void CustomTrackView::slotChangeEffectState(ClipItem *clip, int effectPos, bool disable) @@ -1439,14 +1439,14 @@ effect.setAttribute("disabled", disable); EditEffectCommand *command = new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), oldEffect, effect, effectPos, true); m_commandStack->push(command); - m_document->setModified(true); + setDocumentModified();; } void CustomTrackView::slotChangeEffectPosition(ClipItem *clip, int currentPos, int newPos) { MoveEffectCommand *command = new MoveEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), currentPos, newPos); m_commandStack->push(command); - m_document->setModified(true); + setDocumentModified(); } void CustomTrackView::slotUpdateClipEffect(ClipItem *clip, QDomElement oldeffect, QDomElement effect, int ix) @@ -1499,7 +1499,7 @@ if (dup->checkKeyFrames()) slotRefreshEffects(dup); item->baseClip()->addReference(); m_document->updateClip(item->baseClip()->getId()); - m_document->setModified(true); + setDocumentModified(); kDebug() << "///////// CUTTING CLIP RESULT: (" << item->startPos().frames(25) << "-" << item->endPos().frames(25) << "), DUP: (" << dup->startPos().frames(25) << "-" << dup->endPos().frames(25) << ")" << ", CUT: " << cutTime.frames(25); kDebug() << "// CUTTING CLIP dONE"; } else { @@ -1534,7 +1534,7 @@ bool success = m_document->renderer()->mltResizeClipEnd(clipinfo, info.endPos - info.startPos); if (success) { item->resizeEnd((int) info.endPos.frames(m_document->fps())); - m_document->setModified(true); + setDocumentModified(); } else emit displayMessage(i18n("Error when resizing clip"), ErrorMessage); @@ -1644,7 +1644,7 @@ } AddTransitionCommand* command = new AddTransitionCommand(this, transitionInfo, endTrack, transition, false, true); m_commandStack->push(command); - m_document->setModified(true); + setDocumentModified(); } void CustomTrackView::addTransition(ItemInfo transitionInfo, int endTrack, QDomElement params) @@ -1653,7 +1653,7 @@ //kDebug() << "---- ADDING transition " << params.attribute("value"); if (m_document->renderer()->mltAddTransition(tr->transitionTag(), endTrack, m_document->tracksCount() - transitionInfo.track, transitionInfo.startPos, transitionInfo.endPos, tr->toXML())) { scene()->addItem(tr); - m_document->setModified(true); + setDocumentModified(); } else { emit displayMessage(i18n("Cannot add transition"), ErrorMessage); delete tr; @@ -1671,7 +1671,7 @@ if (m_dragItem == item) m_dragItem = NULL; delete item; emit transitionItemSelected(NULL); - m_document->setModified(true); + setDocumentModified(); } void CustomTrackView::slotTransitionUpdated(Transition *tr, QDomElement old) @@ -1679,7 +1679,7 @@ kDebug() << "TRANS UPDATE, TRACKS: " << old.attribute("transition_btrack") << ", NEW: " << tr->toXML().attribute("transition_btrack"); EditTransitionCommand *command = new EditTransitionCommand(this, tr->track(), tr->startPos(), old, tr->toXML(), false); m_commandStack->push(command); - m_document->setModified(true); + setDocumentModified(); } void CustomTrackView::updateTransition(int track, GenTime pos, QDomElement oldTransition, QDomElement transition, bool updateTransitionWidget) @@ -1703,7 +1703,7 @@ } emit transitionItemSelected(item, getPreviousVideoTrack(info.track), p, true); } - m_document->setModified(true); + setDocumentModified(); } void CustomTrackView::dragMoveEvent(QDragMoveEvent * event) @@ -1769,7 +1769,7 @@ item->setSelected(true); } m_commandStack->push(addCommand); - m_document->setModified(true); + setDocumentModified(); m_changeSpeedAction->setEnabled(hasVideoClip); m_pasteEffectsAction->setEnabled(m_copiedItems.count() == 1); if (items.count() > 1) groupSelectedItems(true); @@ -1957,7 +1957,7 @@ m_document->switchTrackAudio(tracknumber, !m_document->trackInfoAt(tracknumber).isMute); kDebug() << "NEXT TRK STATE: " << m_document->trackInfoAt(tracknumber).isMute << m_document->trackInfoAt(tracknumber).isBlind; m_document->renderer()->mltChangeTrackState(tracknumber + 1, m_document->trackInfoAt(tracknumber).isMute, m_document->trackInfoAt(tracknumber).isBlind); - m_document->setModified(true); + setDocumentModified(); } void CustomTrackView::slotSwitchTrackLock(int ix) @@ -1985,7 +1985,7 @@ } kDebug() << "NEXT TRK STATE: " << m_document->trackInfoAt(tracknumber).isLocked; viewport()->update(); - m_document->setModified(true); + setDocumentModified(); } void CustomTrackView::slotSwitchTrackVideo(int ix) @@ -1993,7 +1993,7 @@ int tracknumber = m_document->tracksCount() - ix; m_document->switchTrackVideo(tracknumber - 1, !m_document->trackInfoAt(tracknumber - 1).isBlind); m_document->renderer()->mltChangeTrackState(tracknumber, m_document->trackInfoAt(tracknumber - 1).isMute, m_document->trackInfoAt(tracknumber - 1).isBlind); - m_document->setModified(true); + setDocumentModified(); } void CustomTrackView::slotRemoveSpace() @@ -2403,7 +2403,7 @@ KdenliveSettings::setSnaptopoints(snap); emit displayMessage(i18n("Cannot move clip to position %1", m_document->timecode().getTimecodeFromFrames(m_dragItemInfo.startPos.frames(m_document->fps()))), ErrorMessage); } - m_document->setModified(true); + setDocumentModified(); } if (m_dragItem->type() == TRANSITIONWIDGET && (m_dragItemInfo.startPos != info.startPos || m_dragItemInfo.track != info.track)) { Transition *transition = static_cast <Transition *>(m_dragItem); @@ -2505,7 +2505,7 @@ m_selectionGroupInfo.startPos = GenTime(m_selectionGroup->scenePos().x(), m_document->fps()); m_selectionGroupInfo.track = m_selectionGroup->track(); } - m_document->setModified(true); + setDocumentModified(); } } m_document->renderer()->doRefresh(); @@ -2734,7 +2734,7 @@ } emit transitionItemSelected(static_cast <Transition *>(m_dragItem), getPreviousVideoTrack(m_dragItem->track()), p); } else emit transitionItemSelected(NULL); - if (m_operationMode != NONE && m_operationMode != MOVE) m_document->setModified(true); + if (m_operationMode != NONE && m_operationMode != MOVE) setDocumentModified(); m_operationMode = NONE; } @@ -2764,7 +2764,7 @@ if (m_dragItem == item) m_dragItem = NULL; delete item; item = NULL; - m_document->setModified(true); + setDocumentModified(); m_document->renderer()->doRefresh(); } @@ -2866,7 +2866,7 @@ item->updateRectGeometry(); if (item->cropDuration().frames(m_document->fps()) > endPos) item->AbstractClipItem::resizeEnd(info.startPos.frames(m_document->fps()) + endPos, speed); - m_document->setModified(true); + setDocumentModified(); } else emit displayMessage(i18n("Invalid clip"), ErrorMessage); } @@ -2942,7 +2942,7 @@ } tr->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); } - m_document->setModified(true); + setDocumentModified(); return; } @@ -2961,7 +2961,7 @@ } groupSelectedItems(false, true); - m_document->setModified(true); + setDocumentModified(); } void CustomTrackView::addClip(QDomElement xml, const QString &clipId, ItemInfo info, EffectsList effects) @@ -2992,7 +2992,7 @@ for (int i = 0; i < item->effectsCount(); i++) { m_document->renderer()->mltAddEffect(info.track, info.startPos, item->getEffectArgs(item->effectAt(i)), false); } - m_document->setModified(true); + setDocumentModified(); m_document->renderer()->doRefresh(); m_waitingThumbs.append(item); m_thumbsTimer.start(); @@ -3149,7 +3149,7 @@ } } KdenliveSettings::setSnaptopoints(snap); - m_document->setModified(true); + setDocumentModified(); } else { // undo last move and emit error message emit displayMessage(i18n("Cannot move clip to position %1", m_document->timecode().getTimecodeFromFrames(end.startPos.frames(m_document->fps()))), ErrorMessage); @@ -3574,7 +3574,7 @@ DocClipBase *base = m_document->clipManager()->getClipById(id); if (!comment.isEmpty()) base->addSnapMarker(pos, comment); else base->deleteSnapMarker(pos); - m_document->setModified(true); + setDocumentModified(); viewport()->update(); } @@ -4206,7 +4206,7 @@ } AddTrackCommand *addTrack = new AddTrackCommand(this, ix, info, true); m_commandStack->push(addTrack); - m_document->setModified(true); + setDocumentModified(); } } @@ -4217,7 +4217,7 @@ if (ok) { TrackInfo info = m_document->trackInfoAt(m_document->tracksCount() - ix - 1); deleteTimelineTrack(ix, info); - m_document->setModified(true); + setDocumentModified(); /*AddTrackCommand* command = new AddTrackCommand(this, ix, info, false); m_commandStack->push(command);*/ } @@ -4253,7 +4253,7 @@ info.isBlind = true; } changeTimelineTrack(ix, info); - m_document->setModified(true); + setDocumentModified(); } } @@ -4591,7 +4591,7 @@ m_document->renderer()->mltUpdateClipProducer(m_document->tracksCount() - track, start, clip->baseClip()->producer(track)); } clip->update(); - m_document->setModified(true); + setDocumentModified(); } void CustomTrackView::updateClipTypeActions(ClipItem *clip) Modified: trunk/kdenlive/src/docclipbase.cpp =================================================================== --- trunk/kdenlive/src/docclipbase.cpp 2009-06-23 20:54:56 UTC (rev 3633) +++ trunk/kdenlive/src/docclipbase.cpp 2009-06-24 00:22:09 UTC (rev 3634) @@ -700,7 +700,6 @@ file.close(); fileHash = QCryptographicHash::hash(fileData, QCryptographicHash::Md5); m_properties.insert("file_hash", QString(fileHash.toHex())); - //kDebug() << file.fileName() << file.size() << fileHash.toHex(); } } @@ -713,6 +712,29 @@ return hash; } +// static +QString DocClipBase::getHash(const QString &path) +{ + QFile file(path); + if (file.open(QIODevice::ReadOnly)) { // write size and hash only if resource points to a file + QByteArray fileData; + QByteArray fileHash; + /* + * 1 MB = 1 second per 450 files (or faster) + * 10 MB = 9 seconds per 450 files (or faster) + */ + if (file.size() > 1000000*2) { + fileData = file.read(1000000); + if (file.seek(file.size() - 1000000)) + fileData.append(file.readAll()); + } else + fileData = file.readAll(); + file.close(); + return QCryptographicHash::hash(fileData, QCryptographicHash::Md5).toHex(); + } + return QString(); +} + void DocClipBase::refreshThumbUrl() { if (m_thumbProd) m_thumbProd->updateThumbUrl(m_properties.value("file_hash")); Modified: trunk/kdenlive/src/docclipbase.h =================================================================== --- trunk/kdenlive/src/docclipbase.h 2009-06-23 20:54:56 UTC (rev 3633) +++ trunk/kdenlive/src/docclipbase.h 2009-06-24 00:22:09 UTC (rev 3634) @@ -182,6 +182,7 @@ /** Returns true is clip is missing but user wants to keep it as placeholder */ bool isPlaceHolder() const; + static QString getHash(const QString &path); private: // Private attributes Modified: trunk/kdenlive/src/kdenlivedoc.cpp =================================================================== --- trunk/kdenlive/src/kdenlivedoc.cpp 2009-06-23 20:54:56 UTC (rev 3633) +++ trunk/kdenlive/src/kdenlivedoc.cpp 2009-06-24 00:22:09 UTC (rev 3634) @@ -45,7 +45,7 @@ #include <mlt++/Mlt.h> -const double DOCUMENTVERSION = 0.83; +const double DOCUMENTVERSION = 0.84; KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup *undoGroup, QString profileName, const QPoint tracks, Render *render, MainWindow *parent) : QObject(parent), @@ -95,7 +95,6 @@ // TODO: backup the document or alert the user? success = validator.validate(DOCUMENTVERSION); if (success) { // Let the validator handle error messages - setModified(validator.isModified()); QDomElement mlt = m_document.firstChildElement("mlt"); QDomElement infoXml = mlt.firstChildElement("kdenlivedoc"); @@ -192,6 +191,7 @@ infoXml.removeChild(markers); } setProfilePath(profileName); + setModified(validator.isModified()); kDebug() << "Reading file: " << url.path() << ", found clips: " << producers.count(); } } @@ -915,7 +915,7 @@ if (createClipItem) { emit addProjectClip(clip); qApp->processEvents(); - m_render->getFileProperties(clip->toXML(), clip->getId(), false); + m_render->getFileProperties(clip->toXML(), clip->getId(), true); } } @@ -1170,18 +1170,18 @@ void KdenliveDoc::cachePixmap(const QString &fileId, const QPixmap &pix) const { - pix.save(m_projectFolder.path() + "/thumbs/" + fileId + ".png"); + pix.save(m_projectFolder.path(KUrl::AddTrailingSlash) + "thumbs/" + fileId + ".png"); } QString KdenliveDoc::getLadspaFile() const { int ct = 0; QString counter = QString::number(ct).rightJustified(5, '0', false); - while (QFile::exists(m_projectFolder.path() + "/ladspa/" + counter + ".ladspa")) { + while (QFile::exists(m_projectFolder.path(KUrl::AddTrailingSlash) + "ladspa/" + counter + ".ladspa")) { ct++; counter = QString::number(ct).rightJustified(5, '0', false); } - return m_projectFolder.path() + "/ladspa/" + counter + ".ladspa"; + return m_projectFolder.path(KUrl::AddTrailingSlash) + "ladspa/" + counter + ".ladspa"; } bool KdenliveDoc::checkDocumentClips(QDomNodeList infoproducers) @@ -1194,13 +1194,23 @@ for (int i = 0; i < infoproducers.count(); i++) { e = infoproducers.item(i).toElement(); clipType = e.attribute("type").toInt(); - if (clipType == TEXT || clipType == COLOR) continue; + if (clipType == COLOR) continue; + if (clipType == TEXT) { + //TODO: Check is clip template is missing (xmltemplate) or hash changed + continue; + } id = e.attribute("id"); resource = e.attribute("resource"); if (clipType == SLIDESHOW) resource = KUrl(resource).directory(); if (!KIO::NetAccess::exists(KUrl(resource), KIO::NetAccess::SourceSide, 0)) { // Missing clip found missingClips.append(e); + } else { + // Check if the clip has changed + if (clipType != SLIDESHOW && e.hasAttribute("file_hash")) { + if (e.attribute("file_hash") != DocClipBase::getHash(e.attribute("resource"))) + e.removeAttribute("file_hash"); + } } } if (missingClips.isEmpty()) return true; Modified: trunk/kdenlive/src/mainwindow.cpp =================================================================== --- trunk/kdenlive/src/mainwindow.cpp 2009-06-23 20:54:56 UTC (rev 3633) +++ trunk/kdenlive/src/mainwindow.cpp 2009-06-24 00:22:09 UTC (rev 3634) @@ -1629,112 +1629,6 @@ m_renderWidget->showNormal(); } -void MainWindow::slotDoRender(const QStringList render_args, const QStringList overlay_args) -{ - //TODO: remove this function if no problem is detected with the new renderwidget rendering - QString dest = render_args.at(0); - QString render = render_args.at(1); - QStringList avformat_args = render_args.at(2).split(' '); - bool zoneOnly = render_args.at(3).toInt(); - bool playAfter = render_args.at(4).toInt(); - double guideStart = render_args.at(5).toDouble(); - double guideEnd = render_args.at(6).toDouble(); - bool resizeProfile = render_args.at(7).toInt(); - QString scriptExport = render_args.at(8); - bool createChapterFile = render_args.at(9).toInt(); - - if (dest.isEmpty()) return; - int in = 0; - int out = 0; - - if (m_activeTimeline && zoneOnly) { - in = m_activeTimeline->inPoint(); - out = m_activeTimeline->outPoint(); - } - - KTemporaryFile temp; - temp.setAutoRemove(false); - temp.setSuffix(".mlt"); - if (!scriptExport.isEmpty() || temp.open()) { - if (KdenliveSettings::dropbframes()) { - KdenliveSettings::setDropbframes(false); - m_activeDocument->clipManager()->updatePreviewSettings(); - if (!scriptExport.isEmpty()) m_projectMonitor->saveSceneList(scriptExport + ".mlt"); - else m_projectMonitor->saveSceneList(temp.fileName()); - KdenliveSettings::setDropbframes(true); - m_activeDocument->clipManager()->updatePreviewSettings(); - } else { - if (!scriptExport.isEmpty()) m_projectMonitor->saveSceneList(scriptExport + ".mlt"); - else m_projectMonitor->saveSceneList(temp.fileName()); - } - - QStringList args; - if (scriptExport.isEmpty()) args << "-erase"; - if (KdenliveSettings::usekuiserver()) args << "-kuiserver"; - if (zoneOnly) args << "in=" + QString::number(in) << "out=" + QString::number(out); - else if (guideStart != -1) { - args << "in=" + QString::number(GenTime(guideStart).frames(m_activeDocument->fps())) << "out=" + QString::number(GenTime(guideEnd).frames(m_activeDocument->fps())); - } - if (!overlay_args.isEmpty()) args << "preargs=" + overlay_args.join(" "); - QString videoPlayer = "-"; - if (playAfter) { - videoPlayer = KdenliveSettings::defaultplayerapp(); - if (videoPlayer.isEmpty()) KMessageBox::sorry(this, i18n("Cannot play video after rendering because the default video player application is not set.\nPlease define it in Kdenlive settings dialog.")); - } - if (!QFile::exists(KdenliveSettings::rendererpath())) { - KMessageBox::sorry(this, i18n("Cannot find the melt program required for rendering (part of Mlt)")); - setRenderingProgress(dest, -3); - return; - } - args << KdenliveSettings::rendererpath() << m_activeDocument->profilePath() << render << videoPlayer; - - for (int i = 0; i < avformat_args.count(); i++) { - if (avformat_args.at(i).startsWith("profile=")) { - if (avformat_args.at(i).section('=', 1) != m_activeDocument->profilePath()) resizeProfile = true; - break; - } - } - - if (resizeProfile) { - // The rendering profile is different from project profile, so use MLT's special producer_consumer - if (scriptExport.isEmpty()) args << "consumer:" + temp.fileName(); - else args << "consumer:$SOURCE"; - } else { - if (scriptExport.isEmpty()) args << temp.fileName(); - else args << "$SOURCE"; - } - if (scriptExport.isEmpty()) args << dest; - else args << "$TARGET"; - args << avformat_args; - QString renderer = QCoreApplication::applicationDirPath() + QString("/kdenlive_render"); - if (!QFile::exists(renderer)) renderer = "kdenlive_render"; - if (scriptExport.isEmpty()) { - QProcess::startDetached(renderer, args); - KNotification::event("RenderStarted", i18n("Rendering <i>%1</i> started", dest), QPixmap(), this); - } else { - // Generate script file - QFile file(scriptExport); - if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { - KMessageBox::error(this, i18n("Cannot write to file %1", scriptExport)); - return; - } - - QTextStream outStream(&file); - outStream << "#! /bin/sh" << "\n" << "\n"; - outStream << "SOURCE=" << "\"" + scriptExport + ".mlt\"" << "\n"; - outStream << "TARGET=" << "\"" + dest + "\"" << "\n"; - outStream << renderer << " " << args.join(" ") << "\n" << "\n"; - if (file.error() != QFile::NoError) { - KMessageBox::error(this, i18n("Cannot write to file %1", scriptExport)); - file.close(); - return; - } - file.close(); - QFile::setPermissions(scriptExport, file.permissions() | QFile::ExeUser); - } - } -} - void MainWindow::setRenderingProgress(const QString &url, int progress) { if (m_renderWidget) m_renderWidget->setRenderJob(url, progress); Modified: trunk/kdenlive/src/mainwindow.h =================================================================== --- trunk/kdenlive/src/mainwindow.h 2009-06-23 20:54:56 UTC (rev 3633) +++ trunk/kdenlive/src/mainwindow.h 2009-06-24 00:22:09 UTC (rev 3634) @@ -227,7 +227,6 @@ void slotSwitchMarkersComments(); void slotSwitchSnap(); void slotRenderProject(); - void slotDoRender(const QStringList render_args, const QStringList overlay_args); void slotFullScreen(); void slotUpdateDocumentState(bool modified); void slotZoomIn(); Modified: trunk/kdenlive/src/projectlist.cpp =================================================================== --- trunk/kdenlive/src/projectlist.cpp 2009-06-23 20:54:56 UTC (rev 3633) +++ trunk/kdenlive/src/projectlist.cpp 2009-06-24 00:22:09 UTC (rev 3634) @@ -87,8 +87,12 @@ layout->addWidget(m_listView); setLayout(layout); + m_queueTimer.setInterval(100); + connect(&m_queueTimer, SIGNAL(timeout()), this, SLOT(slotProcessNextClipInQueue())); + m_queueTimer.setSingleShot(true); + connect(m_listView, SIGNAL(itemSelectionChanged()), this, SLOT(slotClipSelected())); connect(m_listView, SIGNAL(focusMonitor()), this, SLOT(slotClipSelected())); connect(m_listView, SIGNAL(pauseMonitor()), this, SLOT(slotPauseMonitor())); @@ -216,6 +220,7 @@ if (!item->referencedClip()->getProperty("xmltemplate").isEmpty()) regenerateTemplate(item); } //requestClipInfo(item->toXml(), item->clipId(), true); + // Clear the file_hash value, which will cause a complete reload of the clip emit getFileProperties(item->toXml(), item->clipId(), true); } } @@ -520,10 +525,10 @@ void ProjectList::requestClipInfo(const QDomElement xml, const QString id) { - kDebug() << " PRG LIST REQUEST CLP INFO: " << id; m_infoQueue.insert(id, xml); m_listView->setEnabled(false); - if (m_infoQueue.count() == 1) QTimer::singleShot(300, this, SLOT(slotProcessNextClipInQueue())); + if (!m_queueTimer.isActive()) m_queueTimer.start(); + //if (m_infoQueue.count() == 1 || ) QTimer::singleShot(300, this, SLOT(slotProcessNextClipInQueue())); } void ProjectList::slotProcessNextClipInQueue() @@ -532,14 +537,15 @@ m_listView->setEnabled(true); return; } - QMap<QString, QDomElement>::const_iterator i = m_infoQueue.constBegin(); - if (i != m_infoQueue.constEnd()) { - const QDomElement dom = i.value(); - const QString id = i.key(); - m_infoQueue.remove(i.key()); + QMap<QString, QDomElement>::const_iterator j = m_infoQueue.constBegin(); + if (j != m_infoQueue.constEnd()) { + const QDomElement dom = j.value(); + const QString id = j.key(); + m_infoQueue.remove(j.key()); emit getFileProperties(dom, id, false); } if (m_infoQueue.isEmpty()) m_listView->setEnabled(true); + else m_queueTimer.start(); } void ProjectList::slotUpdateClip(const QString &id) @@ -556,35 +562,38 @@ while (*it) { ProjectItem *item = static_cast <ProjectItem *>(*it); if (!item->isGroup()) { - if (item->referencedClip()->producer() == NULL) { - DocClipBase *clip = item->referencedClip(); - if (clip->clipType() == TEXT && !QFile::exists(clip->fileURL().path())) { - // regenerate text clip image if required - TitleWidget *dia_ui = new TitleWidget(KUrl(), QString(), m_render, this); - QDomDocument doc; - doc.setContent(clip->getProperty("xmldata")); - dia_ui->setXml(doc); - QImage pix = dia_ui->renderedPixmap(); - pix.save(clip->fileURL().path()); - delete dia_ui; - } - if (clip->isPlaceHolder() == false) requestClipInfo(clip->toXML(), clip->getId()); - else item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); - } else { - QString cachedPixmap = m_doc->projectFolder().path() + "/thumbs/" + item->getClipHash() + ".png"; + DocClipBase *clip = item->referencedClip(); + if (clip->clipType() == TEXT && !QFile::exists(clip->fileURL().path())) { + // regenerate text clip image if required + TitleWidget *dia_ui = new TitleWidget(KUrl(), QString(), m_render, this); + QDomDocument doc; + doc.setContent(clip->getProperty("xmldata")); + dia_ui->setXml(doc); + QImage pix = dia_ui->renderedPixmap(); + pix.save(clip->fileURL().path()); + delete dia_ui; + } + QString cachedPixmap; + if (!item->getClipHash().isEmpty()) { + cachedPixmap = m_doc->projectFolder().path(KUrl::AddTrailingSlash) + "thumbs/" + item->getClipHash() + ".png"; if (QFile::exists(cachedPixmap)) { - //kDebug()<<"// USING CACHED PIX: "<<cachedPixmap; m_listView->blockSignals(true); item->setIcon(0, QPixmap(cachedPixmap)); m_listView->blockSignals(false); - } else requestClipThumbnail(item->clipId()); - - if (item->data(1, DurationRole).toString().isEmpty()) { - m_listView->blockSignals(true); - item->changeDuration(item->referencedClip()->producer()->get_playtime()); - m_listView->blockSignals(false); + } else { + cachedPixmap.clear(); } } + if (cachedPixmap.isEmpty() && item->referencedClip()->producer() != NULL) requestClipThumbnail(item->clipId()); + + if (item->referencedClip()->producer() == NULL) { + if (clip->isPlaceHolder() == false) requestClipInfo(clip->toXML(), clip->getId()); + else item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + } else if (item->data(1, DurationRole).toString().isEmpty()) { + m_listView->blockSignals(true); + item->changeDuration(item->referencedClip()->producer()->get_playtime()); + m_listView->blockSignals(false); + } m_listView->blockSignals(true); item->setData(1, UsageRole, QString::number(item->numReferences())); m_listView->blockSignals(false); @@ -831,11 +840,14 @@ if (!clip) slotProcessNextThumbnail(); QPixmap pix; if (clip->clipType() == AUDIO) pix = KIcon("audio-x-generic").pixmap(QSize(width, height)); + else if (clip->clipType() == TEXT || clip->clipType() == IMAGE) pix = KThumb::getFrame(item->referencedClip()->producer(), 0, width, height); else pix = item->referencedClip()->thumbProducer()->extractImage(item->referencedClip()->getClipThumbFrame(), width, height); - m_listView->blockSignals(true); - item->setIcon(0, pix); - m_listView->blockSignals(false); - m_doc->cachePixmap(item->getClipHash(), pix); + if (!pix.isNull()) { + m_listView->blockSignals(true); + item->setIcon(0, pix); + m_listView->blockSignals(false); + m_doc->cachePixmap(item->getClipHash(), pix); + } if (update) emit projectModified(); if (!m_thumbnailQueue.isEmpty()) QTimer::singleShot(300, this, SLOT(slotProcessNextThumbnail())); } @@ -862,8 +874,8 @@ }*/ m_listView->blockSignals(false); } else kDebug() << "//////// COULD NOT FIND CLIP TO UPDATE PRPS..."; - if (!m_infoQueue.isEmpty()) QTimer::singleShot(300, this, SLOT(slotProcessNextClipInQueue())); - else m_listView->setEnabled(true); + if (m_infoQueue.isEmpty()) /*slotProcessNextClipInQueue(); + else*/ m_listView->setEnabled(true); } void ProjectList::slotReplyGetImage(const QString &clipId, const QPixmap &pix) Modified: trunk/kdenlive/src/projectlist.h =================================================================== --- trunk/kdenlive/src/projectlist.h 2009-06-23 20:54:56 UTC (rev 3633) +++ trunk/kdenlive/src/projectlist.h 2009-06-24 00:22:09 UTC (rev 3634) @@ -28,8 +28,8 @@ #include <QPainter> #include <QItemDelegate> #include <QUndoStack> +#include <QTimer> - #include <KTreeWidgetSearchLine> #include <KUrl> #include <nepomuk/kratingpainter.h> @@ -159,6 +159,7 @@ Timecode m_timecode; double m_fps; QToolBar *m_toolbar; + QTimer m_queueTimer; QMenu *m_menu; QUndoStack *m_commandStack; void selectItemById(const QString &clipId); @@ -173,6 +174,7 @@ bool m_refreshed; QToolButton *m_addButton; QMap <QString, QDomElement> m_infoQueue; + QMap <QString, QDomElement> m_producerQueue; void requestClipInfo(const QDomElement xml, const QString id); QList <QString> m_thumbnailQueue; void requestClipThumbnail(const QString &id); Modified: trunk/kdenlive/src/renderer.cpp =================================================================== --- trunk/kdenlive/src/renderer.cpp 2009-06-23 20:54:56 UTC (rev 3633) +++ trunk/kdenlive/src/renderer.cpp 2009-06-24 00:22:09 UTC (rev 3634) @@ -549,6 +549,12 @@ char *tmp = decodedString(clipId); producer->set("id", tmp); delete[] tmp; + + if (!replaceProducer && xml.hasAttribute("file_hash")) { + // Clip already has all properties + emit replyGetFileProperties(clipId, producer, QMap < QString, QString >(), QMap < QString, QString >(), replaceProducer); + return; + } int height = 50; int width = (int)(height * m_mltProfile->dar()); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |