]> git.sesse.net Git - kdenlive/commitdiff
Allow working on a project if only proxies are available:
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 5 Feb 2012 14:06:46 +0000 (15:06 +0100)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 5 Feb 2012 14:06:46 +0000 (15:06 +0100)
http://kdenlive.org/mantis/view.php?id=2509

src/docclipbase.cpp
src/docclipbase.h
src/documentchecker.cpp
src/kdenlivedoc.cpp
src/projectlist.cpp

index 094e9c714c3eff6d20951e369974c18bc8ba7294..f54eaff7d0d6f8d05e846be388d8650177776418 100644 (file)
@@ -235,7 +235,7 @@ qulonglong DocClipBase::fileSize() const
 }
 
 // virtual
-QDomElement DocClipBase::toXML() const
+QDomElement DocClipBase::toXML(bool hideTemporaryProperties) const
 {
     QDomDocument doc;
     QDomElement clip = doc.createElement("producer");
@@ -243,6 +243,7 @@ QDomElement DocClipBase::toXML() const
     QMapIterator<QString, QString> i(m_properties);
     while (i.hasNext()) {
         i.next();
+        if (hideTemporaryProperties && i.key().startsWith("_")) continue;
         if (!i.value().isEmpty()) clip.setAttribute(i.key(), i.value());
     }
     doc.appendChild(clip);
index 8e0f6ac452b792b6108786a0cd7625596126bb74..fd84c4670ea18cc055b78cbb61a35987cb9e087b 100644 (file)
@@ -138,7 +138,7 @@ Q_OBJECT public:
     QDomDocument sceneToXML(const GenTime & startTime,
                             const GenTime & endTime) const;
     /** returns a QString containing all of the XML data required to recreate this clip. */
-    QDomElement toXML() const;
+    QDomElement toXML(bool hideTemporaryProperties = false) const;
 
     /** Returns true if the xml passed matches the values in this clip */
     bool matchesXML(const QDomElement & element) const;
index 405767386a2f42d580236615dca65ac920f55b2c..85f2e42a149fa213f3e561b5ec311c8f36603e92 100644 (file)
@@ -56,6 +56,7 @@ const int CLIPOK = 1;
 const int CLIPPLACEHOLDER = 2;
 const int CLIPWRONGDURATION = 3;
 const int PROXYMISSING = 4;
+const int SOURCEMISSING = 5;
 
 const int LUMAMISSING = 10;
 const int LUMAOK = 11;
@@ -78,7 +79,10 @@ bool DocumentChecker::hasErrorInClips()
     int max;
     QDomNodeList documentProducers = m_doc.elementsByTagName("producer");
     QList <QDomElement> wrongDurationClips;
+    // List clips whose proxy is missing
     QList <QDomElement> missingProxies;
+    // List clips who have a working proxy but no source clip
+    QList <QDomElement> missingSources;
     m_safeImages.clear();
     m_safeFonts.clear();
     max = m_info.count();
@@ -132,9 +136,17 @@ bool DocumentChecker::hasErrorInClips()
         resource = e.attribute("resource");
         if (e.hasAttribute("proxy")) {
             QString proxyresource = e.attribute("proxy");
-            if (!proxyresource.isEmpty() && proxyresource != "-" && !KIO::NetAccess::exists(KUrl(proxyresource), KIO::NetAccess::SourceSide, 0)) {
-                // Missing clip found
-                missingProxies.append(e);
+            if (!proxyresource.isEmpty() && proxyresource != "-") {
+                // clip has a proxy
+                if (!KIO::NetAccess::exists(KUrl(proxyresource), KIO::NetAccess::SourceSide, 0)) {
+                    // Missing clip found
+                    missingProxies.append(e);
+                }
+                else if (!KIO::NetAccess::exists(KUrl(resource), KIO::NetAccess::SourceSide, 0)) {
+                    // clip has proxy but original clip is missing
+                    missingSources.append(e);
+                    continue;
+                }
             }
         }
         if (clipType == SLIDESHOW) resource = KUrl(resource).directory();
@@ -174,7 +186,7 @@ bool DocumentChecker::hasErrorInClips()
     
     
 
-    if (m_missingClips.isEmpty() && missingLumas.isEmpty() && wrongDurationClips.isEmpty() && missingProxies.isEmpty())
+    if (m_missingClips.isEmpty() && missingLumas.isEmpty() && wrongDurationClips.isEmpty() && missingProxies.isEmpty() && missingSources.isEmpty())
         return false;
 
     m_dialog = new QDialog();
@@ -263,6 +275,10 @@ bool DocumentChecker::hasErrorInClips()
         if (!m_ui.infoLabel->text().isEmpty()) m_ui.infoLabel->setText(m_ui.infoLabel->text() + ". ");
         m_ui.infoLabel->setText(m_ui.infoLabel->text() + i18n("Missing proxies will be recreated after opening."));
     }
+    if (missingSources.count() > 0) {
+        if (!m_ui.infoLabel->text().isEmpty()) m_ui.infoLabel->setText(m_ui.infoLabel->text() + ". ");
+        m_ui.infoLabel->setText(m_ui.infoLabel->text() + i18np("The project file contains a missing clip, you can still work with its proxy.", "The project file contains missing clips, you can still work with their proxies.", missingSources.count()));
+    }
 
     m_ui.removeSelected->setEnabled(!m_missingClips.isEmpty());
     m_ui.recursiveSearch->setEnabled(!m_missingClips.isEmpty() || !missingLumas.isEmpty());
@@ -310,16 +326,17 @@ bool DocumentChecker::hasErrorInClips()
         item->setToolTip(0, i18n("Duration mismatch"));
     }
 
-    if (missingProxies.count() > 0) {
+    // Check missing proxies
+    max = missingProxies.count();
+    if (max > 0) {
         QTreeWidgetItem *item = new QTreeWidgetItem(m_ui.treeWidget, QStringList() << i18n("Proxy clip"));
         item->setIcon(0, KIcon("dialog-warning"));
-        item->setText(1, i18n("%1 missing proxy clips, will be recreated on project opening", missingProxies.count()));
+        item->setText(1, i18n("%1 missing proxy clips, will be recreated on project opening", max));
         item->setData(0, hashRole, e.attribute("file_hash"));
         item->setData(0, statusRole, PROXYMISSING);
         item->setToolTip(0, i18n("Missing proxy"));
     }
 
-    max = missingProxies.count();
     for (int i = 0; i < max; i++) {
         e = missingProxies.at(i).toElement();
         QString clipType;
@@ -358,7 +375,33 @@ bool DocumentChecker::hasErrorInClips()
         }
     }
     
-    if (missingProxies.count() > 0) {
+    if (max > 0) {
+        // original doc was modified
+        QDomElement infoXml = m_doc.elementsByTagName("kdenlivedoc").at(0).toElement();
+        infoXml.setAttribute("modified", "1");
+    }
+    
+    // Check clips with available proxies but missing original source clips
+    max = missingSources.count();
+    if (max > 0) {
+        QTreeWidgetItem *item = new QTreeWidgetItem(m_ui.treeWidget, QStringList() << i18n("Source clip"));
+        item->setIcon(0, KIcon("dialog-warning"));
+        item->setText(1, i18n("%1 missing source clips, you can only use the proxies", max));
+        item->setData(0, hashRole, e.attribute("file_hash"));
+        item->setData(0, statusRole, SOURCEMISSING);
+        item->setToolTip(0, i18n("Missing source clip"));
+    }
+
+    for (int i = 0; i < max; i++) {
+        e = missingSources.at(i).toElement();
+        QString clipType;
+        QString realPath = e.attribute("resource");
+        QString id = e.attribute("id");
+        // Tell Kdenlive the source is missing
+        e.setAttribute("_missingsource", "1");
+    }
+    
+    if (max > 0) {
         // original doc was modified
         QDomElement infoXml = m_doc.elementsByTagName("kdenlivedoc").at(0).toElement();
         infoXml.setAttribute("modified", "1");
index e31c589e56188833dc57f3083fca2e3ce5cf04a9..26dc37ad594881ae7e9343b1f77c78c8dfd18c5d 100644 (file)
@@ -712,7 +712,7 @@ QDomDocument KdenliveDoc::xmlSceneList(const QString &scene, const QStringList &
     QDomElement e;
     QList <DocClipBase*> list = m_clipManager->documentClipList();
     for (int i = 0; i < list.count(); i++) {
-        e = list.at(i)->toXML();
+        e = list.at(i)->toXML(true);
         e.setTagName("kdenlive_producer");
         addedXml.appendChild(sceneList.importNode(e, true));
         QList < CommentedTime > marks = list.at(i)->commentedSnapMarkers();
@@ -1052,8 +1052,10 @@ bool KdenliveDoc::addClip(QDomElement elem, QString clipId, bool createClipItem)
             extension = KUrl(path).fileName();
             path = KUrl(path).directory();
         }
-
-        if (path.isEmpty() == false && QFile::exists(path) == false && elem.attribute("type").toInt() != TEXT && !elem.hasAttribute("placeholder")) {
+        if (elem.hasAttribute("_missingsource")) {
+            // Clip has proxy but missing original source
+        }
+        else if (path.isEmpty() == false && QFile::exists(path) == false && elem.attribute("type").toInt() != TEXT && !elem.hasAttribute("placeholder")) {
             kDebug() << "// FOUND MISSING CLIP: " << path << ", TYPE: " << elem.attribute("type").toInt();
             const QString size = elem.attribute("file_size");
             const QString hash = elem.attribute("file_hash");
index fa7680a545a3296f5da7b3b2cd18ebd7d2ab92e3..7be5192807e4b3684a8736533d48cb5cbbde3f2e 100644 (file)
@@ -871,7 +871,9 @@ void ProjectList::adjustProxyActions(ProjectItem *clip) const
         m_proxyAction->setEnabled(false);
         return;
     }
-    m_proxyAction->setEnabled(useProxy());
+    bool enabled = useProxy();
+    if (clip->referencedClip() && !clip->referencedClip()->getProperty("_missingsource").isEmpty()) enabled = false;
+    m_proxyAction->setEnabled(enabled);
     m_proxyAction->blockSignals(true);
     m_proxyAction->setChecked(clip->hasProxy());
     m_proxyAction->blockSignals(false);