]> git.sesse.net Git - kdenlive/blobdiff - src/documentchecker.cpp
* Fix missing proxy not re-created on project opening
[kdenlive] / src / documentchecker.cpp
index d1e3b16f23b77844512d266c8409a003b5beefc9..405767386a2f42d580236615dca65ac920f55b2c 100644 (file)
@@ -33,6 +33,7 @@
 #include <KApplication>
 #include <KUrlRequesterDialog>
 #include <KMessageBox>
+#include <KStandardDirs>
 
 #include <QTreeWidgetItem>
 #include <QFile>
@@ -78,6 +79,8 @@ bool DocumentChecker::hasErrorInClips()
     QDomNodeList documentProducers = m_doc.elementsByTagName("producer");
     QList <QDomElement> wrongDurationClips;
     QList <QDomElement> missingProxies;
+    m_safeImages.clear();
+    m_safeFonts.clear();
     max = m_info.count();
     for (int i = 0; i < max; i++) {
         e = m_info.item(i).toElement();
@@ -119,16 +122,11 @@ bool DocumentChecker::hasErrorInClips()
             }
         }
         
-        QStringList safeImages;
         if (clipType == TEXT) {
             //TODO: Check is clip template is missing (xmltemplate) or hash changed
             QStringList images = TitleWidget::extractImageList(e.attribute("xmldata"));
             QStringList fonts = TitleWidget::extractFontList(e.attribute("xmldata"));
-            // Make sure we don't check the same images twice
-            foreach(const QString &existingImage, safeImages) {
-                images.removeAll(existingImage);
-            }
-            safeImages.append(checkMissingImages(images, fonts, e.attribute("id"), e.attribute("name")));
+            checkMissingImagesAndFonts(images, fonts, e.attribute("id"), e.attribute("name"));
             continue;
         }
         resource = e.attribute("resource");
@@ -327,6 +325,8 @@ bool DocumentChecker::hasErrorInClips()
         QString clipType;
         QString realPath = e.attribute("resource");
         QString id = e.attribute("id");
+        // Tell Kdenlive to recreate proxy
+        e.setAttribute("_replaceproxy", "1");
         // Replace proxy url with real clip in MLT producers
         QDomNodeList properties;
         QDomElement mltProd;
@@ -426,7 +426,7 @@ void DocumentChecker::slotSearchClips()
                 child->setData(0, statusRole, CLIPOK);
             }
         } else if (child->data(0, statusRole).toInt() == LUMAMISSING) {
-            QString fileName = searchLuma(child->data(0, idRole).toString());
+            QString fileName = searchLuma(searchDir, child->data(0, idRole).toString());
             if (!fileName.isEmpty()) {
                 fixed = true;
                 child->setText(1, fileName);
@@ -459,24 +459,29 @@ void DocumentChecker::slotSearchClips()
 }
 
 
-QString DocumentChecker::searchLuma(QString file) const
+QString DocumentChecker::searchLuma(const QDir &dir, const QString &file) const
 {
     KUrl searchPath(KdenliveSettings::mltpath());
+    QString fname = KUrl(file).fileName();
     if (file.contains("PAL"))
         searchPath.cd("../lumas/PAL");
     else
         searchPath.cd("../lumas/NTSC");
-    QString result = searchPath.path(KUrl::AddTrailingSlash) + KUrl(file).fileName();
+    QString result = searchPath.path(KUrl::AddTrailingSlash) + fname;
     if (QFile::exists(result))
         return result;
     // try to find luma in application path
     searchPath.clear();
     searchPath = KUrl(QCoreApplication::applicationDirPath());
     searchPath.cd("../share/apps/kdenlive/lumas");
-    result = searchPath.path(KUrl::AddTrailingSlash) + KUrl(file).fileName();
+    result = searchPath.path(KUrl::AddTrailingSlash) + fname;
     if (QFile::exists(result))
         return result;
-    return QString();
+    // Try in Kdenlive's standard KDE path
+    result = KStandardDirs::locate("appdata", "lumas/" + fname);
+    if (!result.isEmpty()) return result;
+    // Try in user's chosen folder 
+    return searchPathRecursively(dir, fname);
 }
 
 QString DocumentChecker::searchPathRecursively(const QDir &dir, const QString &fileName) const
@@ -835,11 +840,11 @@ void DocumentChecker::slotDeleteSelected()
     }
 }
 
-QStringList DocumentChecker::checkMissingImages(QStringList images, QStringList fonts, QString id, QString baseClip)
+void DocumentChecker::checkMissingImagesAndFonts(QStringList images, QStringList fonts, const QString &id, const QString &baseClip)
 {
     QDomDocument doc;
-    QStringList safeImages;
     foreach(const QString &img, images) {
+        if (m_safeImages.contains(img)) continue;
         if (!KIO::NetAccess::exists(KUrl(img), KIO::NetAccess::SourceSide, 0)) {
             QDomElement e = doc.createElement("missingclip");
             e.setAttribute("type", TITLE_IMAGE_ELEMENT);
@@ -848,12 +853,12 @@ QStringList DocumentChecker::checkMissingImages(QStringList images, QStringList
             e.setAttribute("name", baseClip);
             m_missingClips.append(e);
         }
-        else safeImages.append(img);
+        else m_safeImages.append(img);
     }
-    kDebug() << "/ / / CHK FONTS: " << fonts;
     foreach(const QString &fontelement, fonts) {
+        if (m_safeFonts.contains(fontelement)) continue;
         QFont f(fontelement);
-        kDebug() << "/ / / CHK FONTS: " << fontelement << " = " << QFontInfo(f).family();
+        //kDebug() << "/ / / CHK FONTS: " << fontelement << " = " << QFontInfo(f).family();
         if (fontelement != QFontInfo(f).family()) {
             QDomElement e = doc.createElement("missingclip");
             e.setAttribute("type", TITLE_FONT_ELEMENT);
@@ -862,8 +867,8 @@ QStringList DocumentChecker::checkMissingImages(QStringList images, QStringList
             e.setAttribute("name", baseClip);
             m_missingClips.append(e);
         }
+        else m_safeFonts.append(fontelement);
     }
-    return safeImages;
 }