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;
}
if (count > 0) {
m_commandStack->push(effectCommand);
- m_document->setModified(true);
+ setDocumentModified();
} else delete effectCommand;
}
}
if (count > 0) {
m_commandStack->push(effectCommand);
- m_document->setModified(true);
+ setDocumentModified();
} else delete effectCommand;
}
{
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)
}
}
}
- m_document->setModified(true);
+ setDocumentModified();
}
void CustomTrackView::moveEffect(int track, GenTime pos, int oldPos, int newPos)
clip->setEffectAt(newPos - 1, before);
emit clipItemSelected(clip, newPos - 1);
}
- m_document->setModified(true);
+ setDocumentModified();
}
void CustomTrackView::slotChangeEffectState(ClipItem *clip, int effectPos, bool disable)
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)
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 {
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);
}
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)
//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;
if (m_dragItem == item) m_dragItem = NULL;
delete item;
emit transitionItemSelected(NULL);
- m_document->setModified(true);
+ setDocumentModified();
}
void CustomTrackView::slotTransitionUpdated(Transition *tr, QDomElement old)
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)
}
emit transitionItemSelected(item, getPreviousVideoTrack(info.track), p, true);
}
- m_document->setModified(true);
+ setDocumentModified();
}
void CustomTrackView::dragMoveEvent(QDragMoveEvent * event)
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);
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)
}
kDebug() << "NEXT TRK STATE: " << m_document->trackInfoAt(tracknumber).isLocked;
viewport()->update();
- m_document->setModified(true);
+ setDocumentModified();
}
void CustomTrackView::slotSwitchTrackVideo(int ix)
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()
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);
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();
}
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;
}
if (m_dragItem == item) m_dragItem = NULL;
delete item;
item = NULL;
- m_document->setModified(true);
+ setDocumentModified();
m_document->renderer()->doRefresh();
}
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);
}
}
tr->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
}
- m_document->setModified(true);
+ setDocumentModified();
return;
}
}
groupSelectedItems(false, true);
- m_document->setModified(true);
+ setDocumentModified();
}
void CustomTrackView::addClip(QDomElement xml, const QString &clipId, ItemInfo info, EffectsList effects)
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();
}
}
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);
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();
}
}
AddTrackCommand *addTrack = new AddTrackCommand(this, ix, info, true);
m_commandStack->push(addTrack);
- m_document->setModified(true);
+ setDocumentModified();
}
}
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);*/
}
info.isBlind = true;
}
changeTimelineTrack(ix, info);
- m_document->setModified(true);
+ setDocumentModified();
}
}
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)
file.close();
fileHash = QCryptographicHash::hash(fileData, QCryptographicHash::Md5);
m_properties.insert("file_hash", QString(fileHash.toHex()));
- //kDebug() << file.fileName() << file.size() << fileHash.toHex();
}
}
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"));
/** 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
#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),
// 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");
infoXml.removeChild(markers);
}
setProfilePath(profileName);
+ setModified(validator.isModified());
kDebug() << "Reading file: " << url.path() << ", found clips: " << producers.count();
}
}
if (createClipItem) {
emit addProjectClip(clip);
qApp->processEvents();
- m_render->getFileProperties(clip->toXML(), clip->getId(), false);
+ m_render->getFileProperties(clip->toXML(), clip->getId(), true);
}
}
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)
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;
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);
void slotSwitchMarkersComments();
void slotSwitchSnap();
void slotRenderProject();
- void slotDoRender(const QStringList render_args, const QStringList overlay_args);
void slotFullScreen();
void slotUpdateDocumentState(bool modified);
void slotZoomIn();
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()));
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);
}
}
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()
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)
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);
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()));
}
}*/
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)
#include <QPainter>
#include <QItemDelegate>
#include <QUndoStack>
-
+#include <QTimer>
#include <KTreeWidgetSearchLine>
#include <KUrl>
Timecode m_timecode;
double m_fps;
QToolBar *m_toolbar;
+ QTimer m_queueTimer;
QMenu *m_menu;
QUndoStack *m_commandStack;
void selectItemById(const QString &clipId);
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);
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());