X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fkdenlivedoc.cpp;h=0d00dacf291ba28bedf9093daa63c81de52d6d15;hb=147ce69b96c1bb3869cc7390a75107b13cc53e73;hp=fb87c65cb02731fa8c0fed7554599baf45ad0b97;hpb=6859d22b9666e99ce1f15f86f4233afa8af371ff;p=kdenlive diff --git a/src/kdenlivedoc.cpp b/src/kdenlivedoc.cpp index fb87c65c..0d00dacf 100644 --- a/src/kdenlivedoc.cpp +++ b/src/kdenlivedoc.cpp @@ -40,6 +40,10 @@ #include #include #include +#include +#include +#include +#include #include #include @@ -48,9 +52,9 @@ #include -const double DOCUMENTVERSION = 0.85; +const double DOCUMENTVERSION = 0.86; -KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup *undoGroup, QString profileName, const QPoint tracks, Render *render, KTextEdit *notes, MainWindow *parent, KProgressDialog *progressDialog) : +KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup *undoGroup, QString profileName, QMap properties, const QPoint tracks, Render *render, KTextEdit *notes, MainWindow *parent, KProgressDialog *progressDialog) : QObject(parent), m_autosave(NULL), m_url(url), @@ -70,7 +74,21 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup m_documentProperties["verticalzoom"] = "1"; m_documentProperties["zonein"] = "0"; m_documentProperties["zoneout"] = "100"; - + m_documentProperties["enableproxy"] = QString::number((int) KdenliveSettings::enableproxy()); + m_documentProperties["proxyparams"] = KdenliveSettings::proxyparams(); + m_documentProperties["proxyextension"] = KdenliveSettings::proxyextension(); + m_documentProperties["generateproxy"] = QString::number((int) KdenliveSettings::generateproxy()); + m_documentProperties["proxyminsize"] = QString::number(KdenliveSettings::proxyminsize()); + m_documentProperties["generateimageproxy"] = QString::number((int) KdenliveSettings::generateimageproxy()); + m_documentProperties["proxyimageminsize"] = QString::number(KdenliveSettings::proxyimageminsize()); + + // Load properties + QMapIterator i(properties); + while (i.hasNext()) { + i.next(); + m_documentProperties[i.key()] = i.value(); + } + if (!url.isEmpty()) { QString tmpFile; success = KIO::NetAccess::download(url.path(), tmpFile, parent); @@ -108,6 +126,7 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup QDomNodeList infoproducers = m_document.elementsByTagName("kdenlive_producer"); success = checkDocumentClips(infoproducers); if (success) { + if (m_document.documentElement().attribute("modified") == "1") setModified(true); parent->slotGotProgressInfo(i18n("Loading"), 0); QDomElement mlt = m_document.firstChildElement("mlt"); QDomElement infoXml = mlt.firstChildElement("kdenlivedoc"); @@ -147,12 +166,14 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup } mlt.removeChild(tracksinfo); } - + QStringList expandedFolders; QDomNodeList folders = m_document.elementsByTagName("folder"); for (int i = 0; i < folders.count(); i++) { e = folders.item(i).cloneNode().toElement(); + if (e.hasAttribute("opened")) expandedFolders.append(e.attribute("id")); m_clipManager->addFolder(e.attribute("id"), e.attribute("name")); } + m_documentProperties["expandedfolders"] = expandedFolders.join(";"); const int infomax = infoproducers.count(); QDomNodeList producers = m_document.elementsByTagName("producer"); @@ -216,7 +237,7 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup for (int i = 0; i < props.count(); i++) m_documentProperties.insert(props.item(i).nodeName(), props.item(i).nodeValue()); setProfilePath(infoXml.attribute("profile")); - setModified(validator.isModified()); + if (validator.isModified()) setModified(true); kDebug() << "Reading file: " << url.path() << ", found clips: " << producers.count(); } } @@ -258,6 +279,9 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup 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(); //kDebug() << "// SETTING SCENE LIST:\n\n" << m_document.toString(); connect(m_autoSaveTimer, SIGNAL(timeout()), this, SLOT(slotAutoSave())); @@ -304,6 +328,7 @@ QDomDocument KdenliveDoc::createEmptyDocument(int videotracks, int audiotracks) audioTrack.isBlind = true; audioTrack.isLocked = false; audioTrack.trackName = QString("Audio ") + QString::number(audiotracks - i); + audioTrack.duration = 0; m_tracksList.append(audioTrack); } @@ -314,6 +339,7 @@ QDomDocument KdenliveDoc::createEmptyDocument(int videotracks, int audiotracks) videoTrack.isBlind = false; videoTrack.isLocked = false; videoTrack.trackName = QString("Video ") + QString::number(videotracks - i); + videoTrack.duration = 0; m_tracksList.append(videoTrack); } return createEmptyDocument(m_tracksList); @@ -483,15 +509,7 @@ void KdenliveDoc::slotAutoSave() kDebug() << "ERROR; CANNOT CREATE AUTOSAVE FILE"; } kDebug() << "// AUTOSAVE FILE: " << m_autosave->fileName(); - QString doc; - if (KdenliveSettings::dropbframes()) { - KdenliveSettings::setDropbframes(false); - m_clipManager->updatePreviewSettings(); - doc = m_render->sceneList(); - KdenliveSettings::setDropbframes(true); - m_clipManager->updatePreviewSettings(); - } else doc = m_render->sceneList(); - saveSceneList(m_autosave->fileName(), doc); + saveSceneList(m_autosave->fileName(), m_render->sceneList(), QStringList()); } } @@ -517,15 +535,14 @@ QPoint KdenliveDoc::zone() const return QPoint(m_documentProperties.value("zonein").toInt(), m_documentProperties.value("zoneout").toInt()); } -bool KdenliveDoc::saveSceneList(const QString &path, const QString &scene) +QDomDocument KdenliveDoc::xmlSceneList(const QString &scene, const QStringList expandedFolders) { QDomDocument sceneList; sceneList.setContent(scene, true); QDomElement mlt = sceneList.firstChildElement("mlt"); if (mlt.isNull() || !mlt.hasChildNodes()) { - //Make sure we don't save if scenelist is corrupted - KMessageBox::error(kapp->activeWindow(), i18n("Cannot write to file %1, scene list is corrupted.", path)); - return false; + //scenelist is corrupted + return sceneList; } QDomElement addedXml = sceneList.createElement("kdenlivedoc"); @@ -571,7 +588,7 @@ bool KdenliveDoc::saveSceneList(const QString &path, const QString &scene) addedXml.appendChild(docproperties); QDomElement docnotes = sceneList.createElement("documentnotes"); - QDomText value = sceneList.createTextNode(m_notesWidget->toPlainText()); + QDomText value = sceneList.createTextNode(m_notesWidget->toHtml()); docnotes.appendChild(value); addedXml.appendChild(docnotes); @@ -611,6 +628,7 @@ bool KdenliveDoc::saveSceneList(const QString &path, const QString &scene) QDomElement folder = sceneList.createElement("folder"); folder.setAttribute("id", f.key()); folder.setAttribute("name", f.value()); + if (expandedFolders.contains(f.key())) folder.setAttribute("opened", "1"); addedXml.appendChild(folder); } @@ -639,6 +657,17 @@ bool KdenliveDoc::saveSceneList(const QString &path, const QString &scene) addedXml.appendChild(sceneList.importNode(m_clipManager->groupsXml(), true)); //wes.appendChild(doc.importNode(kdenliveData, true)); + return sceneList; +} + +bool KdenliveDoc::saveSceneList(const QString &path, const QString &scene, const QStringList expandedFolders) +{ + QDomDocument sceneList = xmlSceneList(scene, expandedFolders); + if (sceneList.isNull()) { + //Make sure we don't save if scenelist is corrupted + KMessageBox::error(kapp->activeWindow(), i18n("Cannot write to file %1, scene list is corrupted.", path)); + return false; + } QFile file(path); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { @@ -677,6 +706,8 @@ void KdenliveDoc::setProjectFolder(KUrl url) 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); m_projectFolder = url; + + updateProjectFolderPlacesEntry(); } void KdenliveDoc::moveProjectData(KUrl url) @@ -723,7 +754,7 @@ bool KdenliveDoc::setProfilePath(QString path) if (path.isEmpty()) path = KdenliveSettings::default_profile(); if (path.isEmpty()) path = "dv_pal"; m_profile = ProfilesDialog::getVideoProfile(path); - bool current_fps = m_fps; + double current_fps = m_fps; if (m_profile.path.isEmpty()) { // Profile not found, use embedded profile QDomElement profileInfo = m_document.elementsByTagName("profileinfo").at(0).toElement(); @@ -807,20 +838,10 @@ void KdenliveDoc::setRenderer(Render *render) { emit progressInfo(QString(), -1); }*/ -void KdenliveDoc::checkProjectClips() +void KdenliveDoc::checkProjectClips(bool displayRatioChanged) { if (m_render == NULL) return; - m_clipManager->resetProducersList(m_render->producersList()); -} - -void KdenliveDoc::updatePreviewSettings() -{ - m_clipManager->updatePreviewSettings(); - m_render->updatePreviewSettings(); - QList prods = m_render->producersList(); - m_clipManager->resetProducersList(m_render->producersList()); - qDeleteAll(prods); - prods.clear(); + m_clipManager->resetProducersList(m_render->producersList(), displayRatioChanged); } Render *KdenliveDoc::renderer() @@ -994,7 +1015,6 @@ bool KdenliveDoc::addClip(QDomElement elem, QString clipId, bool createClipItem) if (createClipItem) { emit addProjectClip(clip); - //qApp->processEvents(); } return true; @@ -1167,7 +1187,7 @@ void KdenliveDoc::slotCreateTextTemplateClip(QString group, const QString &group { QString titlesFolder = projectFolder().path(KUrl::AddTrailingSlash) + "titles/"; if (path.isEmpty()) { - path = KFileDialog::getOpenUrl(KUrl(titlesFolder), "*.kdenlivetitle", kapp->activeWindow(), i18n("Enter Template Path")); + path = KFileDialog::getOpenUrl(KUrl(titlesFolder), "application/x-kdenlivetitle", kapp->activeWindow(), i18n("Enter Template Path")); } if (path.isEmpty()) return; @@ -1228,6 +1248,16 @@ void KdenliveDoc::switchTrackVideo(int ix, bool hide) m_tracksList[ix].isBlind = hide; // !m_tracksList.at(ix).isBlind; } +int KdenliveDoc::trackDuration(int ix) +{ + return m_tracksList.at(ix).duration; +} + +void KdenliveDoc::setTrackDuration(int ix, int duration) +{ + m_tracksList[ix].duration = duration; +} + void KdenliveDoc::insertTrack(int ix, TrackInfo type) { if (ix == -1) m_tracksList << type; @@ -1377,6 +1407,12 @@ void KdenliveDoc::addTrackEffect(int ix, QDomElement effect) //break; } } + + if (effect.attribute("id") == "crop") { + // default use_profile to 1 for clips with proxies to avoid problems when rendering + if (e.attribute("name") == "use_profile" && getDocumentProperty("enableproxy") == "1") + e.setAttribute("value", "1"); + } } m_tracksList[ix].effectsList.append(effect); @@ -1466,5 +1502,56 @@ bool KdenliveDoc::saveCustomEffects(QDomNodeList customeffects) return (!importedEffects.isEmpty()); } +void KdenliveDoc::updateProjectFolderPlacesEntry() +{ + /* + * For similar and more code have a look at kfileplacesmodel.cpp and the included files: + * http://websvn.kde.org/trunk/KDE/kdelibs/kfile/kfileplacesmodel.cpp?view=markup + */ + + const QString file = KStandardDirs::locateLocal("data", "kfileplaces/bookmarks.xml"); + KBookmarkManager *bookmarkManager = KBookmarkManager::managerForFile(file, "kfilePlaces"); + KBookmarkGroup root = bookmarkManager->root(); + KBookmark bookmark = root.first(); + + QString kdenliveName = KGlobal::mainComponent().componentName(); + KUrl documentLocation = m_projectFolder; + + bool exists = false; + + while (!bookmark.isNull()) { + // UDI not empty indicates a device + QString udi = bookmark.metaDataItem("UDI"); + QString appName = bookmark.metaDataItem("OnlyInApp"); + + if (udi.isEmpty() && appName == kdenliveName && bookmark.text() == i18n("Project Folder")) { + if (bookmark.url() != documentLocation) { + bookmark.setUrl(documentLocation); + bookmarkManager->emitChanged(root); + } + exists = true; + break; + } + + bookmark = root.next(bookmark); + } + + // if entry does not exist yet (was not found), well, create it then + if (!exists) { + bookmark = root.addBookmark(i18n("Project Folder"), documentLocation, "folder-favorites"); + // Make this user selectable ? + bookmark.setMetaDataItem("OnlyInApp", kdenliveName); + bookmarkManager->emitChanged(root); + } +} + +QStringList KdenliveDoc::getExpandedFolders() +{ + QStringList result = m_documentProperties.value("expandedfolders").split(';'); + // this property is only needed once when opening project, so clear it now + m_documentProperties.remove("expandedfolders"); + return result; +} + #include "kdenlivedoc.moc"