From 999131544a6b1f89ca48f741ae7f89ddd1c42e88 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Wed, 1 Oct 2008 22:42:28 +0000 Subject: [PATCH] * Rewrite the way documents are loaded. Fixes lots of issue with disappearing clips after save svn path=/branches/KDE4/; revision=2424 --- src/clipitem.cpp | 2 +- src/customtrackview.cpp | 15 ++++++++++++++- src/customtrackview.h | 1 + src/docclipbase.cpp | 1 + src/kdenlivedoc.cpp | 27 +++++++++++++++++++-------- src/kdenlivedoc.h | 2 +- src/mainwindow.cpp | 3 ++- src/projectlist.cpp | 28 ++++++++++++++++++++++------ src/projectlist.h | 5 +++-- src/renderer.cpp | 26 ++++++++++++++++++++++++++ src/renderer.h | 2 ++ 11 files changed, 92 insertions(+), 20 deletions(-) diff --git a/src/clipitem.cpp b/src/clipitem.cpp index 82ec280c..7c6fab53 100644 --- a/src/clipitem.cpp +++ b/src/clipitem.cpp @@ -930,7 +930,7 @@ QVariant ClipItem::itemChange(GraphicsItemChange change, const QVariant &value) // calculate new position. if (group() != 0) return pos(); QPointF newPos = value.toPointF(); - kDebug() << "/// MOVING CLIP ITEM.------------"; + //kDebug() << "/// MOVING CLIP ITEM.------------"; int xpos = projectScene()->getSnapPointForPos((int) newPos.x(), KdenliveSettings::snaptopoints()); xpos = qMax(xpos, 0); newPos.setX(xpos); diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index 71393346..be2539f0 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -185,7 +185,7 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) { if (event->buttons() != Qt::NoButton) { if (m_dragItem && m_tool == SELECTTOOL) { if (m_operationMode == MOVE) { - QGraphicsView::mouseMoveEvent(event); + if ((event->pos() - m_clickEvent).manhattanLength() >= QApplication::startDragDistance()) QGraphicsView::mouseMoveEvent(event); /*&& (event->pos() - m_clickEvent).manhattanLength() >= QApplication::startDragDistance()) { double snappedPos = getSnapPointForPos(mapToScene(event->pos()).x() - m_clickPoint.x()); @@ -2296,4 +2296,17 @@ void CustomTrackView::setOutPoint() { m_commandStack->push(command); } +void CustomTrackView::updateAllThumbs() { + QList itemList = items(); + ClipItem *item; + Transition *transitionitem; + for (int i = 0; i < itemList.count(); i++) { + if (itemList.at(i)->type() == AVWIDGET) { + item = static_cast (itemList.at(i)); + item->refreshClip(); + qApp->processEvents(); + } + } +} + #include "customtrackview.moc" diff --git a/src/customtrackview.h b/src/customtrackview.h index c56dc09a..b0c5c0e8 100644 --- a/src/customtrackview.h +++ b/src/customtrackview.h @@ -98,6 +98,7 @@ public: void setDocumentModified(); void setInPoint(); void setOutPoint(); + void updateAllThumbs(); public slots: void setCursorPos(int pos, bool seek = true); diff --git a/src/docclipbase.cpp b/src/docclipbase.cpp index 18e900bd..e57bca60 100644 --- a/src/docclipbase.cpp +++ b/src/docclipbase.cpp @@ -361,6 +361,7 @@ QString DocClipBase::markerComment(GenTime t) { } void DocClipBase::setProducer(Mlt::Producer *producer) { + if (producer == NULL) return; m_clipProducer = producer; m_clipProducer->set("transparency", m_properties.value("transparency").toInt()); if (m_thumbProd) m_thumbProd->setProducer(producer); diff --git a/src/kdenlivedoc.cpp b/src/kdenlivedoc.cpp index 353e117f..043953d8 100644 --- a/src/kdenlivedoc.cpp +++ b/src/kdenlivedoc.cpp @@ -25,6 +25,8 @@ #include #include +#include + #include "kdenlivedoc.h" #include "docclipbase.h" #include "profilesdialog.h" @@ -405,7 +407,6 @@ void KdenliveDoc::convertDocument(double version) { max = producers.count(); for (int i = 0; i < max; i++) { QDomElement prod = producers.at(i).toElement(); - if (prod.attribute("mlt_service") == "framebuffer") { QString slowmotionprod = prod.attribute("resource"); slowmotionprod.replace(':', '?'); @@ -628,10 +629,26 @@ void KdenliveDoc::setRenderer(Render *render) { m_render = render; emit progressInfo(i18n("Loading playlist..."), 0); qApp->processEvents(); - if (m_render) m_render->setSceneList(m_document.toString(), m_startPos); + if (m_render) { + m_render->setSceneList(m_document.toString(), m_startPos); + checkProjectClips(); + } emit progressInfo(QString(), -1); } +void KdenliveDoc::checkProjectClips() { + if (m_render == NULL) return; + QList prods = m_render->producersList(); + QString id ; + for (int i = 0; i < prods.count(); i++) { + id = prods.at(i)->get("id"); + DocClipBase *clip = m_clipManager->getClipById(id); + if (clip && clip->producer() == NULL) { + clip->setProducer(prods.at(i)); + } + } +} + Render *KdenliveDoc::renderer() { return m_render; } @@ -640,12 +657,6 @@ void KdenliveDoc::updateClip(const QString &id) { emit updateClipDisplay(id); } -void KdenliveDoc::updateAllProjectClips() { - QList list = m_clipManager->documentClipList(); - for (int i = 0; i < list.count(); i++) - emit updateClipDisplay(list.at(i)->getId()); -} - int KdenliveDoc::getFramePos(QString duration) { return m_timecode.getFrameCount(duration, m_fps); } diff --git a/src/kdenlivedoc.h b/src/kdenlivedoc.h index 331e0348..5a9d3990 100644 --- a/src/kdenlivedoc.h +++ b/src/kdenlivedoc.h @@ -99,7 +99,6 @@ Q_OBJECT public: KUrl projectFolder() const; /** Used to inform main app of the current document loading progress */ void loadingProgressed(); - void updateAllProjectClips(); void syncGuides(QList guides); void setZoom(int factor); int zoom() const; @@ -133,6 +132,7 @@ private: void convertDocument(double version); QDomDocument createEmptyDocument(const int videotracks, const int audiotracks); QString colorToString(const QColor& c); + void checkProjectClips(); public slots: void slotCreateTextClip(QString group, const QString &groupId); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 47629c58..b050f603 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1221,7 +1221,8 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) { //cha doc->setRenderer(m_projectMonitor->render); m_commandStack->setActiveStack(doc->commandStack()); KdenliveSettings::setProject_display_ratio(doc->dar()); - doc->updateAllProjectClips(); + m_projectList->updateAllClips(); + trackView->projectView()->updateAllThumbs(); //m_overView->setScene(trackView->projectScene()); diff --git a/src/projectlist.cpp b/src/projectlist.cpp index 4e0a2397..217e0b1b 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -277,7 +277,7 @@ void ProjectList::slotAddFolder(const QString foldername, const QString &clipId, } } -void ProjectList::slotAddClip(DocClipBase *clip) { +void ProjectList::slotAddClip(DocClipBase *clip, bool getProperties) { const QString parent = clip->toXML().attribute("groupid"); ProjectItem *item = NULL; if (parent != 0) { @@ -302,7 +302,7 @@ void ProjectList::slotAddClip(DocClipBase *clip) { } if (!annotation.isEmpty()) item->setText(2, annotation); } - emit getFileProperties(clip->toXML(), clip->getId()); + if (getProperties) emit getFileProperties(clip->toXML(), clip->getId()); } void ProjectList::slotUpdateClip(const QString &id) { @@ -310,6 +310,23 @@ void ProjectList::slotUpdateClip(const QString &id) { item->setData(1, UsageRole, QString::number(item->numReferences())); } +void ProjectList::updateAllClips() { + QTreeWidgetItemIterator it(listView); + while (*it) { + ProjectItem *item = static_cast (*it); + if (!item->isGroup()) { + if (item->referencedClip()->producer() == NULL) emit getFileProperties(item->referencedClip()->toXML(), item->referencedClip()->getId()); + else { + slotRefreshClipThumbnail(item, false); + item->changeDuration(item->referencedClip()->producer()->get_playtime()); + } + item->setData(1, UsageRole, QString::number(item->numReferences())); + qApp->processEvents(); + } + ++it; + } +} + void ProjectList::slotAddClip(QUrl givenUrl, QString group) { if (!m_commandStack) kDebug() << "!!!!!!!!!!!!!!!!  NO CMD STK"; KUrl::List list; @@ -426,7 +443,7 @@ void ProjectList::setDocument(KdenliveDoc *doc) { listView->clear(); QList list = doc->clipManager()->documentClipList(); for (int i = 0; i < list.count(); i++) { - slotAddClip(list.at(i)); + slotAddClip(list.at(i), false); } m_fps = doc->fps(); @@ -457,14 +474,13 @@ void ProjectList::slotRefreshClipThumbnail(const QString &clipId) { if (item) slotRefreshClipThumbnail(item); } -void ProjectList::slotRefreshClipThumbnail(ProjectItem *item) { +void ProjectList::slotRefreshClipThumbnail(ProjectItem *item, bool update) { if (item) { - kDebug() << " / / / /PROJECT LIST, REFRESH THMB"; int height = 50; int width = (int)(height * m_render->dar()); QPixmap pix = item->referencedClip()->thumbProducer()->extractImage(item->referencedClip()->getClipThumbFrame(), width, height); item->setIcon(0, pix); - emit projectModified(); + if (update) emit projectModified(); } } diff --git a/src/projectlist.h b/src/projectlist.h index 7f931910..7a63cd9c 100644 --- a/src/projectlist.h +++ b/src/projectlist.h @@ -108,16 +108,17 @@ public: QDomElement producersList(); void setRenderer(Render *projectRender); void slotUpdateClipProperties(const QString &id, QMap properties); + void updateAllClips(); public slots: void setDocument(KdenliveDoc *doc); void slotReplyGetImage(const QString &clipId, int pos, const QPixmap &pix, int w, int h); void slotReplyGetFileProperties(const QString &clipId, Mlt::Producer *producer, const QMap < QString, QString > &properties, const QMap < QString, QString > &metadata); - void slotAddClip(DocClipBase *clip); + void slotAddClip(DocClipBase *clip, bool getProperties = true); void slotDeleteClip(const QString &clipId); void slotUpdateClip(const QString &id); void slotRefreshClipThumbnail(const QString &clipId); - void slotRefreshClipThumbnail(ProjectItem *item); + void slotRefreshClipThumbnail(ProjectItem *item, bool update = true); void slotRemoveInvalidClip(const QString &id); void slotSelectClip(const QString &ix); diff --git a/src/renderer.cpp b/src/renderer.cpp index 2a5ffedf..ce690ac9 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -2308,5 +2308,31 @@ void Render::mltSavePlaylist() { fileConsumer.start(); } +QList Render::producersList() { + QList prods; + QStringList ids; + Mlt::Service service(m_mltProducer->parent().get_service()); + Mlt::Tractor tractor(service); + Mlt::Field *field = tractor.field(); + + int trackNb = tractor.count(); + for (int t = 1; t < trackNb; t++) { + Mlt::Producer trackProducer(tractor.track(t)); + Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service()); + int clipNb = trackPlaylist.count(); + kDebug() << "// PARSING SCENE TRACK: " << t << ", CLIPS: " << clipNb; + for (int i = 0; i < clipNb; i++) { + Mlt::Producer *prod = trackPlaylist.get_clip(i); + Mlt::Producer *nprod = new Mlt::Producer(prod->get_parent()); + //kDebug()<<"PROD: "<get("producer")<<", ID: "<get("id")<get("resource"); + if (nprod && !nprod->is_blank() && !ids.contains(nprod->get("id"))) { + ids.append(nprod->get("id")); + prods.append(nprod); + } + } + } + return prods; +} + #include "renderer.moc" diff --git a/src/renderer.h b/src/renderer.h index d74c5183..6d8d8427 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -177,6 +177,8 @@ Q_OBJECT public: in the ClipManager list and speed is the current speed */ int mltChangeClipSpeed(ItemInfo info, double speed, Mlt::Producer *prod); + QList producersList(); + private: // Private attributes & methods /** The name of this renderer - useful to identify the renderes by what they do - e.g. background rendering, workspace monitor, etc... */ QString m_name; -- 2.39.2