]> git.sesse.net Git - kdenlive/commitdiff
improve document checker
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 4 May 2009 11:21:14 +0000 (11:21 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 4 May 2009 11:21:14 +0000 (11:21 +0000)
svn path=/trunk/kdenlive/; revision=3354

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

index 181a4d913f65966413f1fe7f53d78535a2ddd2e6..4c6ccad4eaa3370b2a8aae52294e5d43be37af38 100644 (file)
@@ -33,7 +33,7 @@
 
 #include <QCryptographicHash>
 
-DocClipBase::DocClipBase(ClipManager *clipManager, QDomElement xml, const QString &id, bool placeHolder) :
+DocClipBase::DocClipBase(ClipManager *clipManager, QDomElement xml, const QString &id) :
         QObject(),
         m_audioFrameCache(),
         m_refcount(0),
@@ -46,12 +46,12 @@ DocClipBase::DocClipBase(ClipManager *clipManager, QDomElement xml, const QStrin
         m_thumbProd(NULL),
         m_audioThumbCreated(false),
         m_id(id),
-        m_placeHolder(placeHolder),
+        m_placeHolder(xml.hasAttribute("placeholder")),
         m_properties()
 {
     int type = xml.attribute("type").toInt();
     m_clipType = (CLIPTYPE) type;
-
+    if (m_placeHolder) xml.removeAttribute("placeholder");
     QDomNamedNodeMap attributes = xml.attributes();
     for (int i = 0; i < attributes.count(); i++) {
         m_properties.insert(attributes.item(i).nodeName(), attributes.item(i).nodeValue());
index 82c0566b41fc11466aec178a6267e9d432e4a876..0b453eec0b28ccaff28923724d63197cbf125e3f 100644 (file)
@@ -56,7 +56,7 @@ Q_OBJECT public:
      *   done here. If a new clip type is added then it should be possible to combine it with both audio
      *   and video. */
 
-    DocClipBase(ClipManager *clipManager, QDomElement xml, const QString &id, bool placeHolder = false);
+    DocClipBase(ClipManager *clipManager, QDomElement xml, const QString &id);
 //    DocClipBase & operator=(const DocClipBase & clip);
     virtual ~ DocClipBase();
 
index 724cdf9878bbecabb2d0362353ebe3af10d33958..4aeafaf39c9152afa1b3a818e4f535422d82369f 100644 (file)
@@ -43,6 +43,10 @@ const int sizeRole = Qt::UserRole + 1;
 const int idRole = Qt::UserRole + 2;
 const int statusRole = Qt::UserRole + 3;
 
+const int CLIPMISSING = 0;
+const int CLIPOK = 1;
+const int CLIPPLACEHOLDER = 2;
+
 DocumentChecker::DocumentChecker(QDomDocument doc, QWidget * parent) :
         QDialog(parent), m_doc(doc)
 {
@@ -70,8 +74,8 @@ DocumentChecker::DocumentChecker(QDomDocument doc, QWidget * parent) :
         }
     }
 
-    if (missingClips.isEmpty()) QTimer::singleShot(0, this, SLOT(reject()));
-
+    if (missingClips.isEmpty()) QTimer::singleShot(0, this, SLOT(accept()));
+    m_view.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
     for (int i = 0; i < missingClips.count(); i++) {
         e = missingClips.at(i).toElement();
         QString clipType;
@@ -102,9 +106,10 @@ DocumentChecker::DocumentChecker(QDomDocument doc, QWidget * parent) :
         item->setData(0, hashRole, e.attribute("file_hash"));
         item->setData(0, sizeRole, e.attribute("file_size"));
         item->setData(0, idRole, e.attribute("id"));
-        item->setData(0, statusRole, '1');
+        item->setData(0, statusRole, CLIPMISSING);
     }
     connect(m_view.recursiveSearch, SIGNAL(pressed()), this, SLOT(slotSearchClips()));
+    connect(m_view.usePlaceholders, SIGNAL(pressed()), this, SLOT(slotPlaceholders()));
     connect(m_view.treeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(slotEditItem(QTreeWidgetItem *, int)));
     //adjustSize();
 }
@@ -117,16 +122,17 @@ void DocumentChecker::slotSearchClips()
     if (newpath.isEmpty()) return;
     int ix = 0;
     QTreeWidgetItem *child = m_view.treeWidget->topLevelItem(ix);
-    while (child && !child->data(0, statusRole).toString().isEmpty()) {
+    while (child && child->data(0, statusRole).toInt() == CLIPMISSING) {
         QString clipPath = searchFileRecursively(QDir(newpath), child->data(0, sizeRole).toString(), child->data(0, hashRole).toString());
         if (!clipPath.isEmpty()) {
             child->setText(1, clipPath);
             child->setIcon(0, KIcon("dialog-ok"));
-            child->setData(0, statusRole, QString());
+            child->setData(0, statusRole, CLIPOK);
         }
         ix++;
         child = m_view.treeWidget->topLevelItem(ix);
     }
+    checkStatus();
 }
 
 QString DocumentChecker::searchFileRecursively(const QDir &dir, const QString &matchSize, const QString &matchHash) const
@@ -173,7 +179,8 @@ void DocumentChecker::slotEditItem(QTreeWidgetItem *item, int)
     item->setText(1, url.path());
     if (KIO::NetAccess::exists(url, KIO::NetAccess::SourceSide, 0)) {
         item->setIcon(0, KIcon("dialog-ok"));
-        item->setData(0, statusRole, QString());
+        item->setData(0, statusRole, CLIPOK);
+        checkStatus();
     }
 }
 
@@ -185,31 +192,74 @@ void DocumentChecker::accept()
     QDomNodeList infoproducers = m_doc.elementsByTagName("kdenlive_producer");
     int ix = 0;
     QTreeWidgetItem *child = m_view.treeWidget->topLevelItem(ix);
-    while (child && child->data(0, statusRole).toString().isEmpty()) {
-        QString id = child->data(0, idRole).toString();
-        for (int i = 0; i < infoproducers.count(); i++) {
-            e = infoproducers.item(i).toElement();
-            if (e.attribute("id") == id) {
-                // Fix clip
-                e.setAttribute("resource", child->text(1));
-                break;
+    while (child) {
+        if (child->data(0, statusRole).toInt() == CLIPOK) {
+            QString id = child->data(0, idRole).toString();
+            for (int i = 0; i < infoproducers.count(); i++) {
+                e = infoproducers.item(i).toElement();
+                if (e.attribute("id") == id) {
+                    // Fix clip
+                    e.setAttribute("resource", child->text(1));
+                    break;
+                }
             }
-        }
-        for (int i = 0; i < producers.count(); i++) {
-            e = producers.item(i).toElement();
-            if (e.attribute("id") == id) {
-                // Fix clip
-                e.setAttribute("resource", child->text(1));
-                break;
+            for (int i = 0; i < producers.count(); i++) {
+                e = producers.item(i).toElement();
+                if (e.attribute("id") == id) {
+                    // Fix clip
+                    e.setAttribute("resource", child->text(1));
+                    break;
+                }
+            }
+        } else if (child->data(0, statusRole).toInt() == CLIPPLACEHOLDER) {
+            QString id = child->data(0, idRole).toString();
+            for (int i = 0; i < infoproducers.count(); i++) {
+                e = infoproducers.item(i).toElement();
+                if (e.attribute("id") == id) {
+                    // Fix clip
+                    e.setAttribute("placeholder", '1');
+                    break;
+                }
             }
         }
-
         ix++;
         child = m_view.treeWidget->topLevelItem(ix);
     }
     QDialog::accept();
 }
 
+void DocumentChecker::slotPlaceholders()
+{
+    int ix = 0;
+    QTreeWidgetItem *child = m_view.treeWidget->topLevelItem(ix);
+    while (child) {
+        if (child->data(0, statusRole).toInt() == CLIPMISSING) {
+            child->setData(0, statusRole, CLIPPLACEHOLDER);
+            child->setIcon(0, KIcon("dialog-ok"));
+        }
+        ix++;
+        child = m_view.treeWidget->topLevelItem(ix);
+    }
+    checkStatus();
+}
+
+
+void DocumentChecker::checkStatus()
+{
+    bool status = true;
+    int ix = 0;
+    QTreeWidgetItem *child = m_view.treeWidget->topLevelItem(ix);
+    while (child) {
+        if (child->data(0, statusRole).toInt() == CLIPMISSING) {
+            status = false;
+            break;
+        }
+        ix++;
+        child = m_view.treeWidget->topLevelItem(ix);
+    }
+    m_view.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(status);
+}
+
 #include "documentchecker.moc"
 
 
index ef8e4c51e0ae99d198eb403c74fc0b75793a2e9e..57d3bf37ed87a612d2e5a0a49eaaac270f94791e 100644 (file)
@@ -43,6 +43,7 @@ private slots:
     virtual void accept();
     void slotSearchClips();
     void slotEditItem(QTreeWidgetItem *item, int);
+    void slotPlaceholders();
 
 protected:
     //void wheelEvent(QWheelEvent * event);
@@ -51,6 +52,7 @@ private:
     Ui::MissingClips_UI m_view;
     QDomDocument m_doc;
     QString searchFileRecursively(const QDir &dir, const QString &matchSize, const QString &matchHash) const;
+    void checkStatus();
 
 signals:
     //void updateThumb();
index eb12c9f4a183d5dc16138a1e726acc8cc7701c87..0b0db98315316b0ae0f7accb2293072dab5f555b 100644 (file)
@@ -134,7 +134,7 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup
                         }
                         westley.removeChild(tracksinfo);
                     }
-                    checkDocumentClips();
+                    if (checkDocumentClips() == false) m_abortLoading = true;
                     QDomNodeList producers = m_document.elementsByTagName("producer");
                     QDomNodeList infoproducers = m_document.elementsByTagName("kdenlive_producer");
                     const int max = producers.count();
@@ -1357,7 +1357,7 @@ void KdenliveDoc::addClip(QDomElement elem, QString clipId, bool createClipItem)
 {
     const QString producerId = clipId.section('_', 0, 0);
     DocClipBase *clip = m_clipManager->getClipById(producerId);
-    bool placeHolder = false;
+
     if (clip == NULL) {
         elem.setAttribute("id", producerId);
         QString path = elem.attribute("resource");
@@ -1390,7 +1390,7 @@ void KdenliveDoc::addClip(QDomElement elem, QString clipId, bool createClipItem)
             delete dia_ui;
         }
 
-        if (path.isEmpty() == false && QFile::exists(path) == false && elem.attribute("type").toInt() != TEXT) {
+        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");
@@ -1429,7 +1429,7 @@ void KdenliveDoc::addClip(QDomElement elem, QString clipId, bool createClipItem)
                 return;
             } else if (action == KMessageBox::No) {
                 // Keep clip as placeHolder
-                placeHolder = true;
+                elem.setAttribute("placeholder", '1');
             }
             if (!newpath.isEmpty()) {
                 if (elem.attribute("type").toInt() == SLIDESHOW) newpath.append('/' + extension);
@@ -1438,7 +1438,7 @@ void KdenliveDoc::addClip(QDomElement elem, QString clipId, bool createClipItem)
                 setModified(true);
             }
         }
-        clip = new DocClipBase(m_clipManager, elem, producerId, placeHolder);
+        clip = new DocClipBase(m_clipManager, elem, producerId);
         m_clipManager->addClip(clip);
     }
 
@@ -1680,10 +1680,10 @@ QString KdenliveDoc::getLadspaFile() const
     return m_projectFolder.path() + "/ladspa/" + counter + ".ladspa";
 }
 
-void KdenliveDoc::checkDocumentClips()
+bool KdenliveDoc::checkDocumentClips()
 {
     DocumentChecker d(m_document);
-    d.exec();
+    return (d.exec() == QDialog::Accepted);
 }
 
 
index 01f103d58f4d640ea6c054a0350a673e5b34f105..bfaf397404baa3b5def9e6b019e4412e53d6721c 100644 (file)
@@ -149,7 +149,7 @@ private:
     void setNewClipResource(const QString &id, const QString &path);
     QString searchFileRecursively(const QDir &dir, const QString &matchSize, const QString &matchHash) const;
     void moveProjectData(KUrl url);
-    void checkDocumentClips();
+    bool checkDocumentClips();
 
 public slots:
     void slotCreateTextClip(QString group, const QString &groupId);