]> git.sesse.net Git - kdenlive/commitdiff
* Rewrite the way documents are loaded. Fixes lots of issue with disappearing clips...
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 1 Oct 2008 22:42:28 +0000 (22:42 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 1 Oct 2008 22:42:28 +0000 (22:42 +0000)
svn path=/branches/KDE4/; revision=2424

src/clipitem.cpp
src/customtrackview.cpp
src/customtrackview.h
src/docclipbase.cpp
src/kdenlivedoc.cpp
src/kdenlivedoc.h
src/mainwindow.cpp
src/projectlist.cpp
src/projectlist.h
src/renderer.cpp
src/renderer.h

index 82ec280c84852d6b8ccf0d1e431e62149b45e76a..7c6fab53806bbee039ddca8e4bc845ab5722f5f5 100644 (file)
@@ -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);
index 71393346b370d27818f43ee63d98c3811f28fb07..be2539f0270097d2bea0e49e5a941b984dae5480 100644 (file)
@@ -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<QGraphicsItem *> itemList = items();
+    ClipItem *item;
+    Transition *transitionitem;
+    for (int i = 0; i < itemList.count(); i++) {
+        if (itemList.at(i)->type() == AVWIDGET) {
+            item = static_cast <ClipItem *>(itemList.at(i));
+            item->refreshClip();
+            qApp->processEvents();
+        }
+    }
+}
+
 #include "customtrackview.moc"
index c56dc09a64b9b3559266a58078e4c28d0cefd342..b0c5c0e844f5ad79a67c863f941ec44bd5526840 100644 (file)
@@ -98,6 +98,7 @@ public:
     void setDocumentModified();
     void setInPoint();
     void setOutPoint();
+    void updateAllThumbs();
 
 public slots:
     void setCursorPos(int pos, bool seek = true);
index 18e900bdaf31ea8dcbacbf2bfa08b3e8d054e845..e57bca60a67757f03a2eb72b7923b1cd3fc75c4e 100644 (file)
@@ -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);
index 353e117f20a0a17de9a031709100edae191fe7d7..043953d84b7786f8e58acabee6f16833bfeb1da5 100644 (file)
@@ -25,6 +25,8 @@
 #include <KIO/NetAccess>
 #include <KApplication>
 
+#include <mlt++/Mlt.h>
+
 #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 <Mlt::Producer *> 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 <DocClipBase*> 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);
 }
index 331e03484c82a7170580b00e5413db93c0d35c90..5a9d3990a3f934ae039f58b17dacbb0f02e28df4 100644 (file)
@@ -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 <Guide *> 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);
index 47629c58524935d16aba5a6561266957a10228eb..b050f603bd587a1f2ddcac09924d58dc0584f349 100644 (file)
@@ -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());
index 4e0a2397a40c220c70df7ca631d9b036394787ad..217e0b1ba9364d1e4ca4c31830cd9e47c1536afc 100644 (file)
@@ -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 <ProjectItem *>(*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 <DocClipBase*> 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();
     }
 }
 
index 7f93191067d96a568fc4400041181302a52dd6a0..7a63cd9c0b38645e74961464ac721f98461d9f10 100644 (file)
@@ -108,16 +108,17 @@ public:
     QDomElement producersList();
     void setRenderer(Render *projectRender);
     void slotUpdateClipProperties(const QString &id, QMap <QString, QString> 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);
 
index 2a5ffedfe80de49aba5843556b8edb926d5bbb1d..ce690ac9e2dd0288d847d9b086d16ce61bd08472 100644 (file)
@@ -2308,5 +2308,31 @@ void Render::mltSavePlaylist() {
     fileConsumer.start();
 }
 
+QList <Mlt::Producer *> Render::producersList() {
+    QList <Mlt::Producer *> 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: "<<nprod->get("producer")<<", ID: "<<nprod->get("id")<<nprod->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"
 
index d74c51835608f097fd2e0c9371d52dfb455cc094..6d8d84275ae2f02d6d26b63f88c77413d09300ff 100644 (file)
@@ -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 <Mlt::Producer *> 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;