]> git.sesse.net Git - kdenlive/commitdiff
Improve handling of missing clips:
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 4 May 2009 20:28:51 +0000 (20:28 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 4 May 2009 20:28:51 +0000 (20:28 +0000)
http://www.kdenlive.org/mantis/view.php?id=805

svn path=/trunk/kdenlive/; revision=3357

src/documentchecker.cpp
src/documentchecker.h
src/kdenlivedoc.cpp
src/kdenlivedoc.h
src/mainwindow.cpp
src/projectlist.cpp
src/projectlist.h
src/renderer.cpp
src/renderer.h

index a39f1037ff61adc06b33fad13d320468cf97bb53..3444503f3137cdf6b5be39d2818e5f6ea223b81a 100644 (file)
@@ -48,34 +48,13 @@ const int CLIPMISSING = 0;
 const int CLIPOK = 1;
 const int CLIPPLACEHOLDER = 2;
 
-DocumentChecker::DocumentChecker(QDomDocument doc, QWidget * parent) :
+DocumentChecker::DocumentChecker(QDomNodeList producers, QDomNodeList infoproducers, QList <QDomElement> missingClips, QDomDocument doc, QWidget * parent) :
         QDialog(parent), m_doc(doc)
 {
     setFont(KGlobalSettings::toolBarFont());
     m_view.setupUi(this);
-
-    QDomNodeList producers = m_doc.elementsByTagName("producer");
-    QDomNodeList infoproducers = m_doc.elementsByTagName("kdenlive_producer");
-
-    int clipType;
     QDomElement e;
-    QString id;
-    QString resource;
-    QList <QDomElement> missingClips;
-    for (int i = 0; i < infoproducers.count(); i++) {
-        e = infoproducers.item(i).toElement();
-        clipType = e.attribute("type").toInt();
-        if (clipType == TEXT) continue;
-        id = e.attribute("id");
-        resource = e.attribute("resource");
-        if (clipType == SLIDESHOW) resource = KUrl(resource).directory();
-        if (!KIO::NetAccess::exists(KUrl(resource), KIO::NetAccess::SourceSide, 0)) {
-            // Missing clip found
-            missingClips.append(e);
-        }
-    }
 
-    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();
@@ -123,6 +102,7 @@ void DocumentChecker::slotSearchClips()
     QString newpath = KFileDialog::getExistingDirectory(KUrl("kfiledialog:///clipfolder"), kapp->activeWindow(), i18n("Clips folder"));
     if (newpath.isEmpty()) return;
     int ix = 0;
+    m_view.recursiveSearch->setEnabled(false);
     QTreeWidgetItem *child = m_view.treeWidget->topLevelItem(ix);
     while (child && child->data(0, statusRole).toInt() == CLIPMISSING) {
         QString clipPath = searchFileRecursively(QDir(newpath), child->data(0, sizeRole).toString(), child->data(0, hashRole).toString());
@@ -134,6 +114,7 @@ void DocumentChecker::slotSearchClips()
         ix++;
         child = m_view.treeWidget->topLevelItem(ix);
     }
+    m_view.recursiveSearch->setEnabled(true);
     checkStatus();
 }
 
@@ -163,7 +144,7 @@ QString DocumentChecker::searchFileRecursively(const QDir &dir, const QString &m
                     return file.fileName();
             }
         }
-        kDebug() << filesAndDirs.at(i) << file.size() << fileHash.toHex();
+        //kDebug() << filesAndDirs.at(i) << file.size() << fileHash.toHex();
     }
     filesAndDirs = dir.entryList(QDir::Dirs | QDir::Readable | QDir::Executable | QDir::NoDotAndDotDot);
     for (int i = 0; i < filesAndDirs.size() && foundFileName.isEmpty(); i++) {
index d162e294a14ffcfb3886fcc81421b60dbb99c39f..e6341e3cba8a34c9c7079bec24741671970245c2 100644 (file)
@@ -26,7 +26,6 @@
 #include <KUrl>
 
 #include <QDir>
-#include <QPushButton>
 #include <QDomElement>
 
 
@@ -35,9 +34,8 @@ class DocumentChecker : public QDialog
     Q_OBJECT
 
 public:
-    explicit DocumentChecker(QDomDocument doc, QWidget * parent = 0);
+    explicit DocumentChecker(QDomNodeList producers, QDomNodeList infoproducers, QList <QDomElement> missingClips, QDomDocument doc, QWidget * parent = 0);
     ~DocumentChecker();
-    KUrl::List importFiles();
 
 private slots:
     virtual void accept();
@@ -46,17 +44,12 @@ private slots:
     void slotPlaceholders();
     void slotDeleteSelected();
 
-protected:
-    //void wheelEvent(QWheelEvent * event);
-
 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 0b0db98315316b0ae0f7accb2293072dab5f555b..f10e6caa0636fa27ae7956f1ea36228c476018be 100644 (file)
@@ -134,9 +134,9 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup
                         }
                         westley.removeChild(tracksinfo);
                     }
-                    if (checkDocumentClips() == false) m_abortLoading = true;
                     QDomNodeList producers = m_document.elementsByTagName("producer");
                     QDomNodeList infoproducers = m_document.elementsByTagName("kdenlive_producer");
+                    if (checkDocumentClips(producers, infoproducers) == false) m_abortLoading = true;
                     const int max = producers.count();
                     const int infomax = infoproducers.count();
 
@@ -1680,9 +1680,27 @@ QString KdenliveDoc::getLadspaFile() const
     return m_projectFolder.path() + "/ladspa/" + counter + ".ladspa";
 }
 
-bool KdenliveDoc::checkDocumentClips()
+bool KdenliveDoc::checkDocumentClips(QDomNodeList producers, QDomNodeList infoproducers)
 {
-    DocumentChecker d(m_document);
+    int clipType;
+    QDomElement e;
+    QString id;
+    QString resource;
+    QList <QDomElement> missingClips;
+    for (int i = 0; i < infoproducers.count(); i++) {
+        e = infoproducers.item(i).toElement();
+        clipType = e.attribute("type").toInt();
+        if (clipType == TEXT) continue;
+        id = e.attribute("id");
+        resource = e.attribute("resource");
+        if (clipType == SLIDESHOW) resource = KUrl(resource).directory();
+        if (!KIO::NetAccess::exists(KUrl(resource), KIO::NetAccess::SourceSide, 0)) {
+            // Missing clip found
+            missingClips.append(e);
+        }
+    }
+    if (missingClips.isEmpty()) return true;
+    DocumentChecker d(producers, infoproducers, missingClips, m_document);
     return (d.exec() == QDialog::Accepted);
 }
 
index bfaf397404baa3b5def9e6b019e4412e53d6721c..e92c0a816e943e187bea4cd0d0a9458ed0fe8d25 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);
-    bool checkDocumentClips();
+    bool checkDocumentClips(QDomNodeList producers, QDomNodeList infoproducers);
 
 public slots:
     void slotCreateTextClip(QString group, const QString &groupId);
index a4667f0b0498cfaeda6b1952ad41329824dfd49d..c96c644c6fe1ada14584612fdd2de188f23c39af 100644 (file)
@@ -593,7 +593,7 @@ void MainWindow::slotConnectMonitors()
     connect(m_projectMonitor->render, SIGNAL(replyGetImage(const QString &, const QPixmap &)), m_projectList, SLOT(slotReplyGetImage(const QString &, const QPixmap &)));
     connect(m_projectMonitor->render, SIGNAL(replyGetFileProperties(const QString &, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &, bool)), m_projectList, SLOT(slotReplyGetFileProperties(const QString &, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &, bool)));
 
-    connect(m_projectMonitor->render, SIGNAL(removeInvalidClip(const QString &)), m_projectList, SLOT(slotRemoveInvalidClip(const QString &)));
+    connect(m_projectMonitor->render, SIGNAL(removeInvalidClip(const QString &, bool)), m_projectList, SLOT(slotRemoveInvalidClip(const QString &, bool)));
 
     connect(m_clipMonitor, SIGNAL(refreshClipThumbnail(const QString &)), m_projectList, SLOT(slotRefreshClipThumbnail(const QString &)));
 
index 0a311341f15bff190a1d2f5ecb9080bf17055df1..20ab1d4b3c6e23fb888cbec8a7b87423bad806e1 100644 (file)
@@ -86,7 +86,7 @@ ProjectList::ProjectList(QWidget *parent) :
     layout->addWidget(m_toolbar);
     layout->addWidget(m_listView);
     setLayout(layout);
-    
+
 
 
     connect(m_listView, SIGNAL(itemSelectionChanged()), this, SLOT(slotClipSelected()));
@@ -619,15 +619,20 @@ void ProjectList::slotAddClip(const QList <QUrl> givenList, QString group)
     m_doc->slotAddClipList(list, group, groupId);
 }
 
-void ProjectList::slotRemoveInvalidClip(const QString &id)
+void ProjectList::slotRemoveInvalidClip(const QString &id, bool replace)
 {
     ProjectItem *item = getItemById(id);
     if (item) {
         const QString path = item->referencedClip()->fileURL().path();
-        if (!path.isEmpty()) KMessageBox::sorry(this, i18n("Clip <b>%1</b><br>is invalid, will be removed from project.", path));
+        if (!path.isEmpty()) {
+            if (replace) KMessageBox::sorry(this, i18n("Clip <b>%1</b><br>is invalid, will be removed from project.", path));
+            else {
+                if (KMessageBox::questionYesNo(this, i18n("Clip <b>%1</b><br>is missing or invalid. Remove it from project?", path), i18n("Invalid clip")) == KMessageBox::Yes) replace = true;
+            }
+        }
         QList <QString> ids;
         ids << id;
-        m_doc->deleteProjectClip(ids);
+        if (replace) m_doc->deleteProjectClip(ids);
     }
     if (!m_infoQueue.isEmpty()) QTimer::singleShot(300, this, SLOT(slotProcessNextClipInQueue()));
     else m_listView->setEnabled(true);
index 879ddd112ed689c52575a768218d6da4f53e8241..b046757a4978808cf0c8a5730afc8a06e7af700c 100644 (file)
@@ -138,7 +138,7 @@ public slots:
     void slotUpdateClip(const QString &id);
     void slotRefreshClipThumbnail(const QString &clipId, bool update = true);
     void slotRefreshClipThumbnail(ProjectItem *item, bool update = true);
-    void slotRemoveInvalidClip(const QString &id);
+    void slotRemoveInvalidClip(const QString &id, bool replace);
     void slotSelectClip(const QString &ix);
     void slotRemoveClip();
     void slotAddClip(const QList <QUrl> givenList = QList <QUrl> (), QString group = QString());
@@ -147,6 +147,7 @@ public slots:
     void slotOpenClip();
     void slotEditClip();
     void slotReloadClip();
+    void slotAddColorClip();
 
 private:
     ProjectListView *m_listView;
@@ -176,7 +177,6 @@ private:
 
 private slots:
     void slotClipSelected();
-    void slotAddColorClip();
     void slotAddSlideshowClip();
     void slotAddTitleClip();
     void slotContextMenu(const QPoint &pos, QTreeWidgetItem *);
index a3aee435d4a3f0b37159c6e53ed4303948da4f21..110f4122c6fa6713b054e7b6905e19e4e048edb2 100644 (file)
@@ -519,7 +519,7 @@ void Render::getFileProperties(const QDomElement &xml, const QString &clipId, bo
 
     if (producer == NULL || producer->is_blank() || !producer->is_valid()) {
         kDebug() << " / / / / / / / / ERROR / / / / // CANNOT LOAD PRODUCER: ";
-        emit removeInvalidClip(clipId);
+        emit removeInvalidClip(clipId, replaceProducer);
         delete producer;
         return;
     }
@@ -828,11 +828,13 @@ void Render::setSceneList(QString playlist, int position)
     blockSignals(true);
     char *tmp = decodedString(playlist);
     m_mltProducer = new Mlt::Producer(*m_mltProfile, "westley-xml", tmp);
-    delete[] tmp;
 
     if (!m_mltProducer || !m_mltProducer->is_valid()) {
         kDebug() << " WARNING - - - - -INVALID PLAYLIST: " << tmp;
+        m_mltProducer = m_blackClip->cut(0, 50);
     }
+    delete[] tmp;
+
     m_mltProducer->optimise();
 
     /*if (KdenliveSettings::osdtimecode()) {
index 5943e0ae98e8d34751ace94a82be4f754b841d50..402def2ba6e7df69407c90c3309f8b6ce5b50ad7 100644 (file)
@@ -255,7 +255,7 @@ signals:   // Signals
     void durationChanged(int);
     void rendererPosition(int);
     void rendererStopped(int);
-    void removeInvalidClip(const QString &);
+    void removeInvalidClip(const QString &, bool replaceProducer);
     void refreshDocumentProducers();
 
 public slots:  // Public slots