]> git.sesse.net Git - kdenlive/blobdiff - src/projectsettings.cpp
automatically select if we should export audio or not:
[kdenlive] / src / projectsettings.cpp
index f7a71abb694adb1d50e1908cf7306c1c893b0387..9891810fe948e7f1dc56d7a2b289ec488e3d4f3a 100644 (file)
@@ -22,6 +22,7 @@
 #include "profilesdialog.h"
 #include "docclipbase.h"
 #include "titlewidget.h"
+#include "effectslist.h"
 
 #include <KStandardDirs>
 #include <KMessageBox>
 #include <QDir>
 #include <kmessagebox.h>
 
-ProjectSettings::ProjectSettings(ProjectList *projectlist, int videotracks, int audiotracks, const QString projectPath, bool readOnlyTracks, bool savedProject, QWidget * parent) :
-        QDialog(parent), m_savedProject(savedProject), m_projectList(projectlist)
+ProjectSettings::ProjectSettings(ProjectList *projectlist, QStringList lumas, int videotracks, int audiotracks, const QString projectPath, bool readOnlyTracks, bool savedProject, QWidget * parent) :
+        QDialog(parent), m_savedProject(savedProject), m_projectList(projectlist), m_lumas(lumas)
 {
     setupUi(this);
-    
+
     list_search->setListWidget(files_list);
 
     QMap <QString, QString> profilesInfo = ProfilesDialog::getProfilesInfo();
@@ -62,6 +63,7 @@ ProjectSettings::ProjectSettings(ProjectList *projectlist, int videotracks, int
     video_thumbs->setChecked(KdenliveSettings::videothumbnails());
     audio_tracks->setValue(audiotracks);
     video_tracks->setValue(videotracks);
+
     if (readOnlyTracks) {
         video_tracks->setEnabled(false);
         audio_tracks->setEnabled(false);
@@ -84,10 +86,9 @@ void ProjectSettings::slotDeleteUnused()
         DocClipBase *clip = list.at(i);
         if (clip->numReferences() == 0 && clip->clipType() != SLIDESHOW) {
             KUrl url = clip->fileURL();
-            if (!url.isEmpty()) toDelete << url.path();
+            if (!url.isEmpty() && !toDelete.contains(url.path())) toDelete << url.path();
         }
     }
-    toDelete.removeDuplicates();
 
     // make sure our urls are not used in another clip
     for (int i = 0; i < list.count(); i++) {
@@ -133,33 +134,31 @@ void ProjectSettings::slotUpdateFiles(bool cacheOnly)
     KIO::filesize_t unUsedSize = 0;
     QList <DocClipBase*> list = m_projectList->documentClipList();
     files_list->clear();
-    
+
     // List all files that are used in the project. That also means:
-    // images included in slideshow, titles
-    // TODO: images used in luma transitions, files used in playlist clips, files used for LADSPA effects
-    
+    // images included in slideshow and titles, files in playlist clips
+    // TODO: images used in luma transitions, files used for LADSPA effects?
+
     QStringList allFiles;
+    QStringList allFonts;
+    allFiles << m_lumas;
     for (int i = 0; i < list.count(); i++) {
         DocClipBase *clip = list.at(i);
-       if (clip->clipType() == SLIDESHOW) {
-           // special case, list all images
-           QString path = clip->fileURL().directory();
-           QString ext = clip->fileURL().path().section('.', -1);
-           QDir dir(path);
-           QStringList filters;
-           filters << "*." + ext;
-           dir.setNameFilters(filters);
-           QStringList result = dir.entryList(QDir::Files);
-           for (int j = 0; j < result.count(); j++) {
-               allFiles.append(path + result.at(j));
-           }
-       }
-       else if (!clip->fileURL().isEmpty()) allFiles.append(clip->fileURL().path());
-       if (clip->clipType() == TEXT) {
-           QStringList images = TitleWidget::extractImageList(clip->getProperty("xmldata"));
-           allFiles << images;
-       }
-       
+        if (clip->clipType() == SLIDESHOW) {
+            // special case, list all images
+            QStringList files = extractSlideshowUrls(clip->fileURL());
+            allFiles << files;
+        } else if (!clip->fileURL().isEmpty()) allFiles.append(clip->fileURL().path());
+        if (clip->clipType() == TEXT) {
+            QStringList images = TitleWidget::extractImageList(clip->getProperty("xmldata"));
+            QStringList fonts = TitleWidget::extractFontList(clip->getProperty("xmldata"));
+            allFiles << images;
+            allFonts << fonts;
+        } else if (clip->clipType() == PLAYLIST) {
+            QStringList files = extractPlaylistUrls(clip->fileURL().path());
+            allFiles << files;
+        }
+
         if (clip->numReferences() == 0) {
             unused++;
             unUsedSize += clip->fileSize();
@@ -168,9 +167,13 @@ void ProjectSettings::slotUpdateFiles(bool cacheOnly)
             usedSize += clip->fileSize();
         }
     }
+#if QT_VERSION >= 0x040500
     allFiles.removeDuplicates();
+    allFonts.removeDuplicates();
+#endif
     files_count->setText(QString::number(allFiles.count()));
     files_list->addItems(allFiles);
+    fonts_list->addItems(allFonts);
     used_count->setText(QString::number(used));
     used_size->setText(KIO::convertSize(usedSize));
     unused_count->setText(QString::number(unused));
@@ -234,6 +237,74 @@ bool ProjectSettings::enableAudioThumbs() const
     return audio_thumbs->isChecked();
 }
 
+
+//static
+QStringList ProjectSettings::extractPlaylistUrls(QString path)
+{
+    QStringList urls;
+    QDomDocument doc;
+    QFile file(path);
+    if (!file.open(QIODevice::ReadOnly))
+        return urls;
+    if (!doc.setContent(&file)) {
+        file.close();
+        return urls;
+    }
+    file.close();
+    QString root = doc.documentElement().attribute("root");
+    if (!root.isEmpty() && !root.endsWith('/')) root.append('/');
+    QDomNodeList files = doc.elementsByTagName("producer");
+    for (int i = 0; i < files.count(); i++) {
+        QDomElement e = files.at(i).toElement();
+        QString type = EffectsList::property(e, "mlt_service");
+        if (type != "colour") {
+            QString url = EffectsList::property(e, "resource");
+            if (!url.isEmpty()) {
+                if (!url.startsWith('/')) url.prepend(root);
+                if (url.section('.', 0, -2).endsWith("/.all")) {
+                    // slideshow clip, extract image urls
+                    urls << extractSlideshowUrls(KUrl(url));
+                } else urls << url;
+                if (url.endsWith(".mlt") || url.endsWith(".kdenlive")) {
+                    //TODO: Do something to avoid infinite loops if 2 files reference themselves...
+                    urls << extractPlaylistUrls(url);
+                }
+            }
+        }
+    }
+
+    // luma files for transitions
+    files = doc.elementsByTagName("transition");
+    for (int i = 0; i < files.count(); i++) {
+        QDomElement e = files.at(i).toElement();
+        QString url = EffectsList::property(e, "luma");
+        if (!url.isEmpty()) {
+            if (!url.startsWith('/')) url.prepend(root);
+            urls << url;
+        }
+    }
+
+    return urls;
+}
+
+
+//static
+QStringList ProjectSettings::extractSlideshowUrls(KUrl url)
+{
+    QStringList urls;
+    QString path = url.directory(KUrl::AppendTrailingSlash);
+    QString ext = url.path().section('.', -1);
+    QDir dir(path);
+    QStringList filters;
+    filters << "*." + ext;
+    dir.setNameFilters(filters);
+    QStringList result = dir.entryList(QDir::Files);
+    for (int j = 0; j < result.count(); j++) {
+        urls.append(path + result.at(j));
+    }
+    return urls;
+}
+
 #include "projectsettings.moc"