]> git.sesse.net Git - kdenlive/blobdiff - src/kdenlivedoc.cpp
Automatically crop tracks relative to project resolution if proxies are enabled for...
[kdenlive] / src / kdenlivedoc.cpp
index d0aae8bbb852389f047144302604f987b8b17e3c..0e7862d86ac6c2819519d99bc3f54cdd404cf6c2 100644 (file)
 #include <KIO/NetAccess>
 #include <KIO/CopyJob>
 #include <KApplication>
+#include <KGlobal>
+#include <KBookmarkManager>
+#include <KBookmark>
+#include <KStandardDirs>
 
 #include <QCryptographicHash>
 #include <QFile>
@@ -50,7 +54,7 @@
 
 const double DOCUMENTVERSION = 0.85;
 
-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 <QString, QString> 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<QString, QString> 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);
                             }
-
-                            QDomNodeList                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    folders = m_document.elementsByTagName("folder");
+                            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");
@@ -193,7 +214,8 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup
                                         break;
                                     }
                                 }
-                                progressDialog->progressBar()->setValue(i);
+                                if (i % 10 == 0)
+                                    progressDialog->progressBar()->setValue(i);
                             }
 
                             if (success) {
@@ -215,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();
                             }
                         }
@@ -257,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()));
@@ -303,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);
 
     }
@@ -313,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);
@@ -482,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());
     }
 }
 
@@ -516,7 +535,7 @@ 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)
+bool KdenliveDoc::saveSceneList(const QString &path, const QString &scene, const QStringList expandedFolders)
 {
     QDomDocument sceneList;
     sceneList.setContent(scene, true);
@@ -610,6 +629,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);
     }
 
@@ -676,6 +696,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)
@@ -722,7 +744,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();
@@ -812,16 +834,6 @@ void KdenliveDoc::checkProjectClips()
     m_clipManager->resetProducersList(m_render->producersList());
 }
 
-void KdenliveDoc::updatePreviewSettings()
-{
-    m_clipManager->updatePreviewSettings();
-    m_render->updatePreviewSettings();
-    QList <Mlt::Producer *> prods = m_render->producersList();
-    m_clipManager->resetProducersList(m_render->producersList());
-    qDeleteAll(prods);
-    prods.clear();
-}
-
 Render *KdenliveDoc::renderer()
 {
     return m_render;
@@ -993,7 +1005,6 @@ bool KdenliveDoc::addClip(QDomElement elem, QString clipId, bool createClipItem)
 
     if (createClipItem) {
         emit addProjectClip(clip);
-        //qApp->processEvents();
     }
 
     return true;
@@ -1166,7 +1177,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;
@@ -1227,6 +1238,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;
@@ -1376,6 +1397,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);
@@ -1465,5 +1492,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"