From 05d5da65489ab125958e4f62ded8987bcf4989aa Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Mon, 4 May 2009 20:28:51 +0000 Subject: [PATCH] Improve handling of missing clips: http://www.kdenlive.org/mantis/view.php?id=805 svn path=/trunk/kdenlive/; revision=3357 --- src/documentchecker.cpp | 27 ++++----------------------- src/documentchecker.h | 9 +-------- src/kdenlivedoc.cpp | 24 +++++++++++++++++++++--- src/kdenlivedoc.h | 2 +- src/mainwindow.cpp | 2 +- src/projectlist.cpp | 13 +++++++++---- src/projectlist.h | 4 ++-- src/renderer.cpp | 6 ++++-- src/renderer.h | 2 +- 9 files changed, 44 insertions(+), 45 deletions(-) diff --git a/src/documentchecker.cpp b/src/documentchecker.cpp index a39f1037..3444503f 100644 --- a/src/documentchecker.cpp +++ b/src/documentchecker.cpp @@ -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 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 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++) { diff --git a/src/documentchecker.h b/src/documentchecker.h index d162e294..e6341e3c 100644 --- a/src/documentchecker.h +++ b/src/documentchecker.h @@ -26,7 +26,6 @@ #include #include -#include #include @@ -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 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(); }; diff --git a/src/kdenlivedoc.cpp b/src/kdenlivedoc.cpp index 0b0db983..f10e6caa 100644 --- a/src/kdenlivedoc.cpp +++ b/src/kdenlivedoc.cpp @@ -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 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); } diff --git a/src/kdenlivedoc.h b/src/kdenlivedoc.h index bfaf3974..e92c0a81 100644 --- a/src/kdenlivedoc.h +++ b/src/kdenlivedoc.h @@ -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); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index a4667f0b..c96c644c 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -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 &))); diff --git a/src/projectlist.cpp b/src/projectlist.cpp index 0a311341..20ab1d4b 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -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 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 %1
is invalid, will be removed from project.", path)); + if (!path.isEmpty()) { + if (replace) KMessageBox::sorry(this, i18n("Clip %1
is invalid, will be removed from project.", path)); + else { + if (KMessageBox::questionYesNo(this, i18n("Clip %1
is missing or invalid. Remove it from project?", path), i18n("Invalid clip")) == KMessageBox::Yes) replace = true; + } + } QList 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); diff --git a/src/projectlist.h b/src/projectlist.h index 879ddd11..b046757a 100644 --- a/src/projectlist.h +++ b/src/projectlist.h @@ -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 givenList = QList (), 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 *); diff --git a/src/renderer.cpp b/src/renderer.cpp index a3aee435..110f4122 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -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()) { diff --git a/src/renderer.h b/src/renderer.h index 5943e0ae..402def2b 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -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 -- 2.39.2