From e19f8a27245266dcc6c76ecdcea6c1c827f04399 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Mon, 4 May 2009 11:21:14 +0000 Subject: [PATCH] improve document checker svn path=/trunk/kdenlive/; revision=3354 --- src/docclipbase.cpp | 6 +-- src/docclipbase.h | 2 +- src/documentchecker.cpp | 94 +++++++++++++++++++++++++++++++---------- src/documentchecker.h | 2 + src/kdenlivedoc.cpp | 14 +++--- src/kdenlivedoc.h | 2 +- 6 files changed, 86 insertions(+), 34 deletions(-) diff --git a/src/docclipbase.cpp b/src/docclipbase.cpp index 181a4d91..4c6ccad4 100644 --- a/src/docclipbase.cpp +++ b/src/docclipbase.cpp @@ -33,7 +33,7 @@ #include -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()); diff --git a/src/docclipbase.h b/src/docclipbase.h index 82c0566b..0b453eec 100644 --- a/src/docclipbase.h +++ b/src/docclipbase.h @@ -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(); diff --git a/src/documentchecker.cpp b/src/documentchecker.cpp index 724cdf98..4aeafaf3 100644 --- a/src/documentchecker.cpp +++ b/src/documentchecker.cpp @@ -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" diff --git a/src/documentchecker.h b/src/documentchecker.h index ef8e4c51..57d3bf37 100644 --- a/src/documentchecker.h +++ b/src/documentchecker.h @@ -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(); diff --git a/src/kdenlivedoc.cpp b/src/kdenlivedoc.cpp index eb12c9f4..0b0db983 100644 --- a/src/kdenlivedoc.cpp +++ b/src/kdenlivedoc.cpp @@ -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); } diff --git a/src/kdenlivedoc.h b/src/kdenlivedoc.h index 01f103d5..bfaf3974 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); - void checkDocumentClips(); + bool checkDocumentClips(); public slots: void slotCreateTextClip(QString group, const QString &groupId); -- 2.39.2