]> git.sesse.net Git - kdenlive/blobdiff - src/kdenlivedoc.cpp
Small cleanup + comment
[kdenlive] / src / kdenlivedoc.cpp
index f9a90afa35bf21ba589097d3713390d4c7bc4fd3..861fc28fda179ff2c6125718f09b0590246fb5f5 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) :
+KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup *undoGroup, QString profileName, const QPoint tracks, Render *render, KTextEdit *notes, MainWindow *parent, KProgressDialog *progressDialog) :
     QObject(parent),
     m_autosave(NULL),
     m_url(url),
@@ -89,6 +93,7 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup
                 KMessageBox::error(parent, errorMsg);
             else {
                 parent->slotGotProgressInfo(i18n("Validating"), 0);
+                qApp->processEvents();
                 DocumentValidator validator(m_document);
                 success = validator.isProject();
                 if (!success) {
@@ -103,9 +108,11 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup
                     success = validator.validate(DOCUMENTVERSION);
                     if (success) { // Let the validator handle error messages
                         parent->slotGotProgressInfo(i18n("Check missing clips"), 0);
+                        qApp->processEvents();
                         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");
@@ -114,6 +121,7 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup
                             QDomElement customeffects = infoXml.firstChildElement("customeffects");
                             if (!customeffects.isNull() && customeffects.hasChildNodes()) {
                                 parent->slotGotProgressInfo(i18n("Importing project effects"), 0);
+                                qApp->processEvents();
                                 if (saveCustomEffects(customeffects.childNodes())) parent->slotReloadEffects();
                             }
 
@@ -145,7 +153,7 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup
                                 mlt.removeChild(tracksinfo);
                             }
 
-                            QDomNodeList                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    folders = m_document.elementsByTagName("folder");
+                            QDomNodeList folders = m_document.elementsByTagName("folder");
                             for (int i = 0; i < folders.count(); i++) {
                                 e = folders.item(i).cloneNode().toElement();
                                 m_clipManager->addFolder(e.attribute("id"), e.attribute("name"));
@@ -155,10 +163,15 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup
                             QDomNodeList producers = m_document.elementsByTagName("producer");
                             const int max = producers.count();
 
-                            KProgressDialog progressDialog(parent, i18n("Loading project"), i18n("Loading project"));
-                            progressDialog.setAllowCancel(false);
-                            progressDialog.progressBar()->setMaximum(infomax - 1);
-                            progressDialog.show();
+                            if (!progressDialog) {
+                                progressDialog = new KProgressDialog(parent, i18n("Loading project"), i18n("Adding clips"));
+                                progressDialog->setAllowCancel(false);
+                            } else {
+                                progressDialog->setLabelText(i18n("Adding clips"));
+                            }
+                            progressDialog->progressBar()->setMaximum(infomax);
+                            progressDialog->show();
+                            qApp->processEvents();
 
                             for (int i = 0; i < infomax; i++) {
                                 e = infoproducers.item(i).cloneNode().toElement();
@@ -168,10 +181,10 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup
                                     // Get MLT's original producer properties
                                     QDomElement orig;
                                     for (int j = 0; j < max; j++) {
-                                        QDomElement o = producers.item(j).cloneNode().toElement();
-                                        QString origId = o.attribute("id").section('_', 0, 0);
+                                        QDomNode o = producers.item(j);
+                                        QString origId = o.attributes().namedItem("id").nodeValue().section('_', 0, 0);
                                         if (origId == prodId) {
-                                            orig = o;
+                                            orig = o.cloneNode().toElement();
                                             break;
                                         }
                                     }
@@ -185,7 +198,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) {
@@ -207,7 +221,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();
                             }
                         }
@@ -250,6 +264,8 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup
     KStandardDirs::makeDir(m_projectFolder.path(KUrl::AddTrailingSlash) + "thumbs/");
     KStandardDirs::makeDir(m_projectFolder.path(KUrl::AddTrailingSlash) + "ladspa/");
 
+    updateProjectFolderPlacesEntry();
+
     //kDebug() << "// SETTING SCENE LIST:\n\n" << m_document.toString();
     connect(m_autoSaveTimer, SIGNAL(timeout()), this, SLOT(slotAutoSave()));
 }
@@ -474,15 +490,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());
     }
 }
 
@@ -668,6 +676,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)
@@ -804,16 +814,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;
@@ -1158,7 +1158,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;
@@ -1457,5 +1457,48 @@ 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);
+    }
+}
+
 #include "kdenlivedoc.moc"