X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fkdenlivedoc.cpp;h=b210a5bcfc0e382393c7ca34223a0c6e11a43a54;hb=ec4afadc6e994943318f7d53376448dbd402cb3d;hp=35355db0e74b989442973f1d21e2085d218b3198;hpb=8094288cefb96c161d2bdbfc6ace594530ec16bc;p=kdenlive diff --git a/src/kdenlivedoc.cpp b/src/kdenlivedoc.cpp index 35355db0..b210a5bc 100644 --- a/src/kdenlivedoc.cpp +++ b/src/kdenlivedoc.cpp @@ -28,7 +28,7 @@ #include "mainwindow.h" #include "documentchecker.h" #include "documentvalidator.h" -#include "kdenlive-config.h" +#include "config-kdenlive.h" #include "initeffects.h" #include @@ -39,6 +39,7 @@ #include #include #include +#include #include #include #include @@ -52,9 +53,12 @@ #include -const double DOCUMENTVERSION = 0.86; +#include "locale.h" -KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup *undoGroup, QString profileName, QMap properties, const QPoint tracks, Render *render, KTextEdit *notes, bool *openBackup, MainWindow *parent, KProgressDialog *progressDialog) : + +const double DOCUMENTVERSION = 0.88; + +KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup *undoGroup, QString profileName, QMap properties, QMap metadata, const QPoint &tracks, Render *render, KTextEdit *notes, bool *openBackup, MainWindow *parent, KProgressDialog *progressDialog) : QObject(parent), m_autosave(NULL), m_url(url), @@ -64,9 +68,22 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup m_modified(false), m_projectFolder(projectFolder) { + // init m_profile struct + m_profile.frame_rate_num = 0; + m_profile.frame_rate_den = 0; + m_profile.width = 0; + m_profile.height = 0; + m_profile.progressive = 0; + m_profile.sample_aspect_num = 0; + m_profile.sample_aspect_den = 0; + m_profile.display_aspect_num = 0; + m_profile.display_aspect_den = 0; + m_profile.colorspace = 0; + m_clipManager = new ClipManager(this); m_autoSaveTimer = new QTimer(this); m_autoSaveTimer->setSingleShot(true); + connect(m_clipManager, SIGNAL(displayMessage(QString, int)), parent, SLOT(slotGotProgressInfo(QString,int))); bool success = false; // init default document properties @@ -81,13 +98,35 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup m_documentProperties["proxyminsize"] = QString::number(KdenliveSettings::proxyminsize()); m_documentProperties["generateimageproxy"] = QString::number((int) KdenliveSettings::generateimageproxy()); m_documentProperties["proxyimageminsize"] = QString::number(KdenliveSettings::proxyimageminsize()); - +#if QT_VERSION >= 0x040700 + m_documentProperties["documentid"] = QString::number(QDateTime::currentMSecsSinceEpoch()); +#else + QDateTime date = QDateTime::currentDateTime(); + m_documentProperties["documentid"] = QString::number(date.toTime_t()); +#endif + // Load properties QMapIterator i(properties); while (i.hasNext()) { i.next(); m_documentProperties[i.key()] = i.value(); } + + // Load metadata + QMapIterator j(metadata); + while (j.hasNext()) { + j.next(); + m_documentMetadata[j.key()] = j.value(); + } + + if (QLocale().decimalPoint() != QLocale::system().decimalPoint()) { + setlocale(LC_NUMERIC, ""); + QLocale systemLocale = QLocale::system(); + systemLocale.setNumberOptions(QLocale::OmitGroupSeparator); + QLocale::setDefault(systemLocale); + // locale conversion might need to be redone + initEffects::parseEffectFiles(setlocale(LC_NUMERIC, NULL)); + } *openBackup = false; @@ -104,8 +143,7 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup else { QFile file(tmpFile); QString errorMsg; - QDomImplementation impl; - impl.setInvalidDataPolicy(QDomImplementation::DropInvalidChars); + QDomImplementation::setInvalidDataPolicy(QDomImplementation::DropInvalidChars); success = m_document.setContent(&file, false, &errorMsg); file.close(); KIO::NetAccess::removeTempFile(tmpFile); @@ -120,7 +158,7 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup else { parent->slotGotProgressInfo(i18n("Validating"), 0); qApp->processEvents(); - DocumentValidator validator(m_document); + DocumentValidator validator(m_document, url); success = validator.isProject(); if (!success) { // It is not a project file @@ -146,6 +184,9 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup QDomElement mlt = m_document.firstChildElement("mlt"); QDomElement infoXml = mlt.firstChildElement("kdenlivedoc"); + // Set profile, fps, etc for the document + setProfilePath(infoXml.attribute("profile")); + // Check embedded effects QDomElement customeffects = infoXml.firstChildElement("customeffects"); if (!customeffects.isNull() && customeffects.hasChildNodes()) { @@ -176,6 +217,7 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup projectTrack.isBlind = e.attribute("blind").toInt(); projectTrack.isLocked = e.attribute("locked").toInt(); projectTrack.trackName = e.attribute("trackname"); + projectTrack.effectsList = EffectsList(true); m_tracksList.append(projectTrack); } } @@ -251,7 +293,11 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup QDomNamedNodeMap props = docproperties.attributes(); for (int i = 0; i < props.count(); i++) m_documentProperties.insert(props.item(i).nodeName(), props.item(i).nodeValue()); - setProfilePath(infoXml.attribute("profile")); + docproperties = infoXml.firstChildElement("documentmetadata"); + props = docproperties.attributes(); + for (int i = 0; i < props.count(); i++) + m_documentMetadata.insert(props.item(i).nodeName(), props.item(i).nodeValue()); + if (validator.isModified()) setModified(true); kDebug() << "Reading file: " << url.path() << ", found clips: " << producers.count(); } @@ -261,7 +307,7 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup } } } - + // Something went wrong, or a new file was requested: create a new project if (!success) { m_url.clear(); @@ -269,9 +315,6 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup m_document = createEmptyDocument(tracks.x(), tracks.y()); } - // Set the video profile (empty == default) - KdenliveSettings::setCurrent_profile(profilePath()); - // Ask to create the project directory if it does not exist if (!QFile::exists(m_projectFolder.path())) { int create = KMessageBox::questionYesNo(parent, i18n("Project directory %1 does not exist. Create it?", m_projectFolder.path())); @@ -293,7 +336,6 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup // Make sure that the necessary folders exist KStandardDirs::makeDir(m_projectFolder.path(KUrl::AddTrailingSlash) + "titles/"); KStandardDirs::makeDir(m_projectFolder.path(KUrl::AddTrailingSlash) + "thumbs/"); - KStandardDirs::makeDir(m_projectFolder.path(KUrl::AddTrailingSlash) + "ladspa/"); KStandardDirs::makeDir(m_projectFolder.path(KUrl::AddTrailingSlash) + "proxy/"); updateProjectFolderPlacesEntry(); @@ -318,7 +360,7 @@ KdenliveDoc::~KdenliveDoc() int KdenliveDoc::setSceneList() { - m_render->resetProfile(KdenliveSettings::current_profile()); + m_render->resetProfile(KdenliveSettings::current_profile(), true); if (m_render->setSceneList(m_document.toString(), m_documentProperties.value("position").toInt()) == -1) { // INVALID MLT Consumer, something is wrong return -1; @@ -344,6 +386,7 @@ QDomDocument KdenliveDoc::createEmptyDocument(int videotracks, int audiotracks) audioTrack.isLocked = false; audioTrack.trackName = QString("Audio ") + QString::number(audiotracks - i); audioTrack.duration = 0; + audioTrack.effectsList = EffectsList(true); m_tracksList.append(audioTrack); } @@ -355,6 +398,7 @@ QDomDocument KdenliveDoc::createEmptyDocument(int videotracks, int audiotracks) videoTrack.isLocked = false; videoTrack.trackName = QString("Video ") + QString::number(videotracks - i); videoTrack.duration = 0; + videoTrack.effectsList = EffectsList(true); m_tracksList.append(videoTrack); } return createEmptyDocument(m_tracksList); @@ -365,9 +409,9 @@ QDomDocument KdenliveDoc::createEmptyDocument(QList tracks) // Creating new document QDomDocument doc; QDomElement mlt = doc.createElement("mlt"); + mlt.setAttribute("LC_NUMERIC", ""); doc.appendChild(mlt); - - + // Create black producer // For some unknown reason, we have to build the black producer here and not in renderer.cpp, otherwise // the composite transitions with the black track are corrupted. @@ -384,7 +428,7 @@ QDomDocument KdenliveDoc::createEmptyDocument(QList tracks) property = doc.createElement("property"); property.setAttribute("name", "aspect_ratio"); - value = doc.createTextNode(QString::number(0.0)); + value = doc.createTextNode(QString::number(0)); property.appendChild(value); blk.appendChild(property); @@ -550,7 +594,7 @@ QPoint KdenliveDoc::zone() const return QPoint(m_documentProperties.value("zonein").toInt(), m_documentProperties.value("zoneout").toInt()); } -QDomDocument KdenliveDoc::xmlSceneList(const QString &scene, const QStringList expandedFolders) +QDomDocument KdenliveDoc::xmlSceneList(const QString &scene, const QStringList &expandedFolders) { QDomDocument sceneList; sceneList.setContent(scene, true); @@ -560,6 +604,18 @@ QDomDocument KdenliveDoc::xmlSceneList(const QString &scene, const QStringList e return sceneList; } + // Set playlist audio volume to 100% + QDomElement tractor = mlt.firstChildElement("tractor"); + if (!tractor.isNull()) { + QDomNodeList props = tractor.elementsByTagName("property"); + for (int i = 0; i < props.count(); i++) { + if (props.at(i).toElement().attribute("name") == "meta.volume") { + props.at(i).firstChild().setNodeValue("1"); + break; + } + } + } + QDomElement addedXml = sceneList.createElement("kdenlivedoc"); mlt.appendChild(addedXml); @@ -601,6 +657,14 @@ QDomDocument KdenliveDoc::xmlSceneList(const QString &scene, const QStringList e } docproperties.setAttribute("position", m_render->seekPosition().frames(m_fps)); addedXml.appendChild(docproperties); + + QDomElement docmetadata = sceneList.createElement("documentmetadata"); + QMapIterator j(m_documentMetadata); + while (j.hasNext()) { + j.next(); + docmetadata.setAttribute(j.key(), j.value()); + } + addedXml.appendChild(docmetadata); QDomElement docnotes = sceneList.createElement("documentnotes"); QDomText value = sceneList.createTextNode(m_notesWidget->toHtml()); @@ -651,7 +715,7 @@ QDomDocument KdenliveDoc::xmlSceneList(const QString &scene, const QStringList e QDomElement e; QList list = m_clipManager->documentClipList(); for (int i = 0; i < list.count(); i++) { - e = list.at(i)->toXML(); + e = list.at(i)->toXML(true); e.setTagName("kdenlive_producer"); addedXml.appendChild(sceneList.importNode(e, true)); QList < CommentedTime > marks = list.at(i)->commentedSnapMarkers(); @@ -675,7 +739,7 @@ QDomDocument KdenliveDoc::xmlSceneList(const QString &scene, const QStringList e return sceneList; } -bool KdenliveDoc::saveSceneList(const QString &path, const QString &scene, const QStringList expandedFolders, bool autosave) +bool KdenliveDoc::saveSceneList(const QString &path, const QString &scene, const QStringList &expandedFolders, bool autosave) { QDomDocument sceneList = xmlSceneList(scene, expandedFolders); if (sceneList.isNull()) { @@ -703,6 +767,15 @@ bool KdenliveDoc::saveSceneList(const QString &path, const QString &scene, const file.close(); if (!autosave) { cleanupBackupFiles(); + QFileInfo info(file); + QString fileName = KUrl(path).fileName().section('.', 0, -2); + fileName.append("-" + m_documentProperties.value("documentid")); + fileName.append(info.lastModified().toString("-yyyy-MM-dd-hh-mm")); + fileName.append(".kdenlive.png"); + KUrl backupFile = m_projectFolder; + backupFile.addPath(".backup/"); + backupFile.addPath(fileName); + emit saveTimelinePreview(backupFile.path()); } return true; } @@ -725,7 +798,7 @@ void KdenliveDoc::setProjectFolder(KUrl url) KStandardDirs::makeDir(url.path()); KStandardDirs::makeDir(url.path(KUrl::AddTrailingSlash) + "titles/"); KStandardDirs::makeDir(url.path(KUrl::AddTrailingSlash) + "thumbs/"); - if (KMessageBox::questionYesNo(kapp->activeWindow(), i18n("You have changed the project folder. Do you want to copy the cached data from %1 to the new folder %2?").arg(m_projectFolder.path(), url.path())) == KMessageBox::Yes) moveProjectData(url); + if (KMessageBox::questionYesNo(kapp->activeWindow(), i18n("You have changed the project folder. Do you want to copy the cached data from %1 to the new folder %2?", m_projectFolder.path(), url.path())) == KMessageBox::Yes) moveProjectData(url); m_projectFolder = url; updateProjectFolderPlacesEntry(); @@ -734,7 +807,7 @@ void KdenliveDoc::setProjectFolder(KUrl url) void KdenliveDoc::moveProjectData(KUrl url) { QList list = m_clipManager->documentClipList(); - //TODO: Also move ladspa effects files + KUrl::List cacheUrls; for (int i = 0; i < list.count(); i++) { DocClipBase *clip = list.at(i); if (clip->clipType() == TEXT) { @@ -748,16 +821,17 @@ void KdenliveDoc::moveProjectData(KUrl url) KUrl oldVideoThumbUrl = KUrl(m_projectFolder.path(KUrl::AddTrailingSlash) + "thumbs/" + hash + ".png"); KUrl oldAudioThumbUrl = KUrl(m_projectFolder.path(KUrl::AddTrailingSlash) + "thumbs/" + hash + ".thumb"); if (KIO::NetAccess::exists(oldVideoThumbUrl, KIO::NetAccess::SourceSide, 0)) { - KUrl newUrl = KUrl(url.path(KUrl::AddTrailingSlash) + "thumbs/" + hash + ".png"); - KIO::Job *job = KIO::copy(oldVideoThumbUrl, newUrl); - KIO::NetAccess::synchronousRun(job, 0); + cacheUrls << oldVideoThumbUrl; } if (KIO::NetAccess::exists(oldAudioThumbUrl, KIO::NetAccess::SourceSide, 0)) { - KUrl newUrl = KUrl(url.path(KUrl::AddTrailingSlash) + "thumbs/" + hash + ".thumb"); - KIO::Job *job = KIO::copy(oldAudioThumbUrl, newUrl); - if (KIO::NetAccess::synchronousRun(job, 0)) clip->refreshThumbUrl(); + cacheUrls << oldAudioThumbUrl; } } + if (!cacheUrls.isEmpty()) { + KIO::Job *job = KIO::copy(cacheUrls, KUrl(url.path(KUrl::AddTrailingSlash) + "thumbs/")); + job->ui()->setWindow(kapp->activeWindow()); + KIO::NetAccess::synchronousRun(job, 0); + } } const QString &KdenliveDoc::profilePath() const @@ -827,6 +901,7 @@ bool KdenliveDoc::setProfilePath(QString path) m_height = m_profile.height; kDebug() << "Kdenlive document, init timecode from path: " << path << ", " << m_fps; m_timecode.setFormat(m_fps); + KdenliveSettings::setCurrent_profile(m_profile.path); return (current_fps != m_fps); } @@ -859,10 +934,10 @@ void KdenliveDoc::setRenderer(Render *render) { emit progressInfo(QString(), -1); }*/ -void KdenliveDoc::checkProjectClips(bool displayRatioChanged) +void KdenliveDoc::checkProjectClips(bool displayRatioChanged, bool fpsChanged) { if (m_render == NULL) return; - m_clipManager->resetProducersList(m_render->producersList(), displayRatioChanged); + m_clipManager->resetProducersList(m_render->producersList(), displayRatioChanged, fpsChanged); } Render *KdenliveDoc::renderer() @@ -870,7 +945,7 @@ Render *KdenliveDoc::renderer() return m_render; } -void KdenliveDoc::updateClip(const QString id) +void KdenliveDoc::updateClip(const QString &id) { emit updateClipDisplay(id); } @@ -980,8 +1055,10 @@ bool KdenliveDoc::addClip(QDomElement elem, QString clipId, bool createClipItem) extension = KUrl(path).fileName(); path = KUrl(path).directory(); } - - if (path.isEmpty() == false && QFile::exists(path) == false && elem.attribute("type").toInt() != TEXT && !elem.hasAttribute("placeholder")) { + if (elem.hasAttribute("_missingsource")) { + // Clip has proxy but missing original source + } + else if (path.isEmpty() == false && QFile::exists(path) == false && elem.attribute("type").toInt() != TEXT && !elem.hasAttribute("placeholder")) { kDebug() << "// FOUND MISSING CLIP: " << path << ", TYPE: " << elem.attribute("type").toInt(); const QString size = elem.attribute("file_size"); const QString hash = elem.attribute("file_hash"); @@ -1139,7 +1216,7 @@ void KdenliveDoc::deleteClip(const QString &clipId) emit signalDeleteProjectClip(clipId); } -void KdenliveDoc::slotAddClipList(const KUrl::List urls, const QString group, const QString &groupId) +void KdenliveDoc::slotAddClipList(const KUrl::List urls, const QString &group, const QString &groupId) { m_clipManager->slotAddClipList(urls, group, groupId); //emit selectLastAddedClip(QString::number(m_clipManager->lastClipId())); @@ -1147,9 +1224,9 @@ void KdenliveDoc::slotAddClipList(const KUrl::List urls, const QString group, co } -void KdenliveDoc::slotAddClipFile(const KUrl url, const QString group, const QString &groupId) +void KdenliveDoc::slotAddClipFile(const KUrl &url, const QString &group, const QString &groupId, const QString &comment) { - m_clipManager->slotAddClipFile(url, group, groupId); + m_clipManager->slotAddClipFile(url, group, groupId, comment); emit selectLastAddedClip(QString::number(m_clipManager->lastClipId())); setModified(true); } @@ -1178,15 +1255,9 @@ void KdenliveDoc::slotCreateColorClip(const QString &name, const QString &color, emit selectLastAddedClip(QString::number(m_clipManager->lastClipId())); } -void KdenliveDoc::slotCreateSlideshowClipFile(const QString name, const QString path, int count, const QString duration, - const bool loop, const bool crop, const bool fade, - const QString &luma_duration, const QString &luma_file, const int softness, - const QString &animation, QString group, const QString &groupId) +void KdenliveDoc::slotCreateSlideshowClipFile(QMap properties, QString group, const QString &groupId) { - m_clipManager->slotAddSlideshowClipFile(name, path, count, duration, loop, - crop, fade, luma_duration, - luma_file, softness, - animation, group, groupId); + m_clipManager->slotAddSlideshowClipFile(properties, group, groupId); setModified(true); emit selectLastAddedClip(QString::number(m_clipManager->lastClipId())); } @@ -1195,7 +1266,7 @@ void KdenliveDoc::slotCreateTextClip(QString group, const QString &groupId, cons { QString titlesFolder = projectFolder().path(KUrl::AddTrailingSlash) + "titles/"; KStandardDirs::makeDir(titlesFolder); - TitleWidget *dia_ui = new TitleWidget(templatePath, m_timecode, titlesFolder, m_render, kapp->activeWindow()); + QPointer dia_ui = new TitleWidget(templatePath, m_timecode, titlesFolder, m_render, kapp->activeWindow()); if (dia_ui->exec() == QDialog::Accepted) { m_clipManager->slotAddTextClipFile(i18n("Title clip"), dia_ui->outPoint(), dia_ui->xml().toString(), group, groupId); setModified(true); @@ -1323,26 +1394,15 @@ QPoint KdenliveDoc::getTracksCount() const return QPoint(video, audio); } -void KdenliveDoc::cachePixmap(const QString &fileId, const QPixmap &pix) const +void KdenliveDoc::cacheImage(const QString &fileId, const QImage &img) const { - 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(KUrl::AddTrailingSlash) + "ladspa/" + counter + ".ladspa")) { - ct++; - counter = QString::number(ct).rightJustified(5, '0', false); - } - return m_projectFolder.path(KUrl::AddTrailingSlash) + "ladspa/" + counter + ".ladspa"; + img.save(m_projectFolder.path(KUrl::AddTrailingSlash) + "thumbs/" + fileId + ".png"); } bool KdenliveDoc::checkDocumentClips(QDomNodeList infoproducers) { DocumentChecker d(infoproducers, m_document); - return (d.hasMissingClips() == false); + return (d.hasErrorInClips() == false); /* int clipType; QDomElement e; @@ -1411,7 +1471,7 @@ void KdenliveDoc::addTrackEffect(int ix, QDomElement effect) QDomElement e = params.item(i).toElement(); // Check if this effect has a variable parameter - if (e.attribute("default").startsWith('%')) { + if (e.attribute("default").contains('%')) { double evaluatedValue = ProfilesDialog::getStringEval(m_profile, e.attribute("default")); e.setAttribute("default", evaluatedValue); if (e.hasAttribute("value") && e.attribute("value").startsWith('%')) { @@ -1445,15 +1505,13 @@ void KdenliveDoc::removeTrackEffect(int ix, QDomElement effect) kWarning() << "Remove Track effect outisde of range"; return; } - QString index; - QString toRemove = effect.attribute("kdenlive_ix"); + int index; + int toRemove = effect.attribute("kdenlive_ix").toInt(); for (int i = 0; i < m_tracksList.at(ix).effectsList.count(); ++i) { - index = m_tracksList.at(ix).effectsList.at(i).attribute("kdenlive_ix"); + index = m_tracksList.at(ix).effectsList.at(i).attribute("kdenlive_ix").toInt(); if (toRemove == index) { - m_tracksList[ix].effectsList.removeAt(i); - i--; - } else if (index.toInt() > toRemove.toInt()) { - m_tracksList[ix].effectsList.item(i).setAttribute("kdenlive_ix", index.toInt() - 1); + m_tracksList[ix].effectsList.removeAt(toRemove); + break; } } } @@ -1464,12 +1522,28 @@ void KdenliveDoc::setTrackEffect(int trackIndex, int effectIndex, QDomElement ef kWarning() << "Set Track effect outisde of range"; return; } - if (effectIndex < 0 || effectIndex > (m_tracksList.at(trackIndex).effectsList.count() - 1) || effect.isNull()) { + if (effectIndex <= 0 || effectIndex > (m_tracksList.at(trackIndex).effectsList.count()) || effect.isNull()) { kDebug() << "Invalid effect index: " << effectIndex; return; } - effect.setAttribute("kdenlive_ix", effectIndex + 1); - m_tracksList[trackIndex].effectsList.replace(effectIndex, effect); + m_tracksList[trackIndex].effectsList.removeAt(effect.attribute("kdenlive_ix").toInt()); + effect.setAttribute("kdenlive_ix", effectIndex); + m_tracksList[trackIndex].effectsList.insert(effect); + //m_tracksList[trackIndex].effectsList.updateEffect(effect); +} + +void KdenliveDoc::enableTrackEffects(int trackIndex, QList effectIndexes, bool disable) +{ + if (trackIndex < 0 || trackIndex >= m_tracksList.count()) { + kWarning() << "Set Track effect outisde of range"; + return; + } + EffectsList list = m_tracksList.at(trackIndex).effectsList; + QDomElement effect; + for (int i = 0; i < effectIndexes.count(); i++) { + effect = list.itemFromIndex(effectIndexes.at(i)); + if (!effect.isNull()) effect.setAttribute("disable", (int) disable); + } } const EffectsList KdenliveDoc::getTrackEffects(int ix) @@ -1488,8 +1562,18 @@ QDomElement KdenliveDoc::getTrackEffect(int trackIndex, int effectIndex) const return QDomElement(); } EffectsList list = m_tracksList.at(trackIndex).effectsList; - if (effectIndex > list.count() - 1 || effectIndex < 0 || list.at(effectIndex).isNull()) return QDomElement(); - return list.at(effectIndex).cloneNode().toElement(); + if (effectIndex > list.count() || effectIndex < 1 || list.itemFromIndex(effectIndex).isNull()) return QDomElement(); + return list.itemFromIndex(effectIndex).cloneNode().toElement(); +} + +int KdenliveDoc::hasTrackEffect(int trackIndex, const QString &tag, const QString &id) const +{ + if (trackIndex < 0 || trackIndex >= m_tracksList.count()) { + kWarning() << "Get Track effect outisde of range"; + return -1; + } + EffectsList list = m_tracksList.at(trackIndex).effectsList; + return list.hasEffect(tag, id); } bool KdenliveDoc::saveCustomEffects(QDomNodeList customeffects) @@ -1532,7 +1616,9 @@ void KdenliveDoc::updateProjectFolderPlacesEntry() const QString file = KStandardDirs::locateLocal("data", "kfileplaces/bookmarks.xml"); KBookmarkManager *bookmarkManager = KBookmarkManager::managerForFile(file, "kfilePlaces"); + if (!bookmarkManager) return; KBookmarkGroup root = bookmarkManager->root(); + KBookmark bookmark = root.first(); QString kdenliveName = KGlobal::mainComponent().componentName(); @@ -1600,18 +1686,18 @@ double KdenliveDoc::getDisplayRatio(const QString &path) void KdenliveDoc::backupLastSavedVersion(const QString &path) { // Ensure backup folder exists + if (path.isEmpty()) return; QFile file(path); KUrl backupFile = m_projectFolder; backupFile.addPath(".backup/"); KIO::NetAccess::mkdir(backupFile, kapp->activeWindow()); QString fileName = KUrl(path).fileName().section('.', 0, -2); QFileInfo info(file); + fileName.append("-" + m_documentProperties.value("documentid")); fileName.append(info.lastModified().toString("-yyyy-MM-dd-hh-mm")); fileName.append(".kdenlive"); backupFile.addPath(fileName); - emit saveTimelinePreview(backupFile.path() + ".png"); - if (file.exists()) { // delete previous backup if it was done less than 60 seconds ago QFile::remove(backupFile.path()); @@ -1627,6 +1713,7 @@ void KdenliveDoc::cleanupBackupFiles() backupFile.addPath(".backup/"); QDir dir(backupFile.path()); QString projectFile = url().fileName().section('.', 0, -2); + projectFile.append("-" + m_documentProperties.value("documentid")); projectFile.append("-??"); projectFile.append("??"); projectFile.append("-??"); @@ -1716,5 +1803,15 @@ void KdenliveDoc::cleanupBackupFiles() } } +const QMap KdenliveDoc::metadata() const +{ + return m_documentMetadata; +} + +void KdenliveDoc::setMetadata(const QMap meta) +{ + m_documentMetadata = meta; +} + #include "kdenlivedoc.moc"