]> git.sesse.net Git - kdenlive/commitdiff
Fix effects deleted from timeline when a clip is reloaded, fix effects disappearing...
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Thu, 17 Sep 2009 12:10:52 +0000 (12:10 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Thu, 17 Sep 2009 12:10:52 +0000 (12:10 +0000)
svn path=/trunk/kdenlive/; revision=3905

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

index 728f6bd0c0666f4f1222e050b4e54b6c36eb8502..5621fda98a331a61aabb70544e7254f68113b704 100644 (file)
@@ -49,7 +49,8 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg
         m_tc(tc),
         m_fps(fps),
         m_count(0),
-        m_clipNeedsRefresh(false)
+        m_clipNeedsRefresh(false),
+        m_clipNeedsReLoad(false)
 {
     setFont(KGlobalSettings::toolBarFont());
     m_view.setupUi(this);
@@ -388,7 +389,7 @@ QMap <QString, QString> ClipProperties::properties()
     } else if (t == IMAGE) {
         if ((int) m_view.image_transparency->isChecked() != old_props.value("transparency").toInt()) {
             props["transparency"] = QString::number((int)m_view.image_transparency->isChecked());
-            m_clipNeedsRefresh = true;
+            //m_clipNeedsRefresh = true;
         }
         int duration = m_tc.getFrameCount(m_view.clip_duration->text());
         if (duration != m_clip->duration().frames(m_fps)) {
@@ -419,7 +420,7 @@ QMap <QString, QString> ClipProperties::properties()
         }
         QString new_path = m_view.clip_path->text() + extension;
         if (new_path != old_props.value("resource")) {
-            m_clipNeedsRefresh = true;
+            m_clipNeedsReLoad = true;
             props["resource"] = new_path;
             kDebug() << "////  SLIDE EDIT, NEW:" << new_path << ", OLD; " << old_props.value("resource");
         }
@@ -469,6 +470,11 @@ bool ClipProperties::needsTimelineRefresh() const
     return m_clipNeedsRefresh;
 }
 
+bool ClipProperties::needsTimelineReload() const
+{
+    return m_clipNeedsReLoad;
+}
+
 void ClipProperties::parseFolder()
 {
 
index bcf971420d5f3fbc3a414926c6e73cef02781405..b32517e4506443b4f0d6ce2513452611b28a8c8f 100644 (file)
@@ -36,6 +36,7 @@ public:
     QMap <QString, QString> properties();
     const QString &clipId() const;
     bool needsTimelineRefresh() const;
+    bool needsTimelineReload() const;
 
 private slots:
     void parseFolder();
@@ -55,7 +56,10 @@ private:
     double m_fps;
     /** used to count images in slideshow clip */
     int m_count;
+    /** some visual properties changed, reload thumbnails */
     bool m_clipNeedsRefresh;
+    /** clip resource changed, reload it */
+    bool m_clipNeedsReLoad;
 
 signals:
     void addMarker(const QString &, GenTime, QString);
index dbe7cb4377b136e930d1fadffa7db9120cc69fd2..17d6cf9ea175b8cc08b6679c8cd50ce64fda3557 100644 (file)
@@ -3263,7 +3263,7 @@ void CustomTrackView::addClip(QDomElement xml, const QString &clipId, ItemInfo i
     m_thumbsTimer.start();
 }
 
-void CustomTrackView::slotUpdateClip(const QString &clipId)
+void CustomTrackView::slotUpdateClip(const QString &clipId, bool reload)
 {
     QList<QGraphicsItem *> list = scene()->items();
     ClipItem *clip = NULL;
@@ -3273,7 +3273,7 @@ void CustomTrackView::slotUpdateClip(const QString &clipId)
             if (clip->clipProducer() == clipId) {
                 ItemInfo info = clip->info();
                 info.track = m_document->tracksCount() - clip->track();
-                m_document->renderer()->mltUpdateClip(info, clip->xml(), clip->baseClip()->producer());
+                if (reload) m_document->renderer()->mltUpdateClip(info, clip->xml(), clip->baseClip()->producer());
                 clip->refreshClip(true);
                 clip->update();
             }
index fecbcfaa1035bc8a51095bcb96cb5ba3b19745ba..f024351d02d2337b08c491a1148af6b4134603e7 100644 (file)
@@ -141,7 +141,7 @@ public slots:
     void slotSwitchTrackAudio(int ix);
     void slotSwitchTrackVideo(int ix);
     void slotSwitchTrackLock(int ix);
-    void slotUpdateClip(const QString &clipId);
+    void slotUpdateClip(const QString &clipId, bool reload = true);
     void slotAddClipMarker(const QString &id, GenTime t, QString c);
     bool addGuide(const GenTime pos, const QString &comment);
     void slotAddGuide();
index 71cfacb37d4b60a1dfba63dbd8cf4af1a50e3243..d5339ab647034671f0ec82a19471221583883549 100644 (file)
@@ -793,6 +793,7 @@ void DocClipBase::setProperty(const QString &key, const QString &value)
     } else if (key == "force_aspect_ratio") {
         if (value.isEmpty()) {
             m_properties.remove("force_aspect_ratio");
+            //TODO: find a was to remove the "force_aspect_ratio" property from producer, currently does not work
             setProducerProperty("force_aspect_ratio", 0);
         } else setProducerProperty("force_aspect_ratio", value.toDouble());
     } else if (key == "threads") {
index d76aa59bb8390ac0c548a15bd72150abb585ef6e..76575c079f76ed604cf27e9535a4e29ba7c0a050 100644 (file)
@@ -257,7 +257,6 @@ int KdenliveDoc::setSceneList()
     m_documentProperties.remove("position");
     // m_document xml is now useless, clear it
     m_document.clear();
-    checkProjectClips();
     return 0;
 }
 
index bfa90cb7ca293031dd6c8518b424b9a1cd8a6c75..a3ac44fb05a8010a92e5ded6f036557ce3ef8545 100644 (file)
@@ -637,7 +637,7 @@ void MainWindow::slotConnectMonitors()
 {
 
     m_projectList->setRenderer(m_projectMonitor->render);
-    connect(m_projectList, SIGNAL(receivedClipDuration(const QString &)), this, SLOT(slotUpdateClip(const QString &)));
+    //connect(m_projectList, SIGNAL(receivedClipDuration(const QString &)), this, SLOT(slotUpdateClip(const QString &)));
     connect(m_projectList, SIGNAL(showClipProperties(DocClipBase *)), this, SLOT(slotShowClipProperties(DocClipBase *)));
     connect(m_projectList, SIGNAL(getFileProperties(const QDomElement, const QString &, bool)), m_projectMonitor->render, SLOT(getFileProperties(const QDomElement, const QString &, bool)));
     connect(m_projectMonitor->render, SIGNAL(replyGetImage(const QString &, const QPixmap &)), m_projectList, SLOT(slotReplyGetImage(const QString &, const QPixmap &)));
@@ -2344,10 +2344,9 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip)
         EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->properties(), dia.properties(), true);
         m_activeDocument->commandStack()->push(command);
 
-        //m_projectList->slotUpdateClipProperties(dia.clipId(), dia.properties());
         if (dia.needsTimelineRefresh()) {
             // update clip occurences in timeline
-            m_activeTimeline->projectView()->slotUpdateClip(clip->getId());
+            m_activeTimeline->projectView()->slotUpdateClip(clip->getId(), dia.needsTimelineReload());
         }
     }
 }
index e534180c6172f1108d45b1e9e97dd8bbd40d5a77..99cc712b80333f45da96d72ba205efd3417a4eaa 100644 (file)
@@ -363,7 +363,6 @@ void ProjectList::slotItemEdited(QTreeWidgetItem *item, int column)
                 oldprops.insert("templatetext", clip->referencedClip()->getProperty("templatetext"));
                 newprops.insert("templatetext", item->text(2));
             }
-
             slotUpdateClipProperties(clip->clipId(), newprops);
             EditClipCommand *command = new EditClipCommand(this, clip->clipId(), oldprops, newprops, false);
             m_commandStack->push(command);
@@ -934,7 +933,7 @@ void ProjectList::slotReplyGetFileProperties(const QString &clipId, Mlt::Produce
         item->setProperties(properties, metadata);
         Q_ASSERT_X(item->referencedClip(), "void ProjectList::slotReplyGetFileProperties", QString("Item with groupName %1 does not have a clip associated").arg(item->groupName()).toLatin1());
         item->referencedClip()->setProducer(producer, replace);
-        emit receivedClipDuration(clipId);
+        //emit receivedClipDuration(clipId);
         if (m_listView->isEnabled() && replace) {
             // update clip in clip monitor
             emit clipSelected(NULL);
index 5387ab4eccb0156e141f220b71458bad3a514aa1..183cbaea314cb19c474d846ca24ef961ff293f0b 100644 (file)
@@ -278,7 +278,8 @@ int Render::resetProfile()
     }
     //kDebug() << "//RESET WITHSCENE: " << scene;
     setSceneList(scene, pos);
-
+    // producers have changed (different profile), so reset them...
+    emit refreshDocumentProducers();
     /*char *tmp = decodedString(scene);
     Mlt::Producer *producer = new Mlt::Producer(*m_mltProfile , "xml-string", tmp);
     delete[] tmp;
@@ -1015,7 +1016,7 @@ int Render::setSceneList(QString playlist, int position)
 
     m_isBlocked = false;
     blockSignals(false);
-    emit refreshDocumentProducers();
+
     return error;
     //kDebug()<<"// SETSCN LST, POS: "<<position;
     //if (position != 0) emit rendererPosition(position);
@@ -1685,8 +1686,40 @@ void Render::mltCutClip(int track, GenTime position)
 void Render::mltUpdateClip(ItemInfo info, QDomElement element, Mlt::Producer *prod)
 {
     // TODO: optimize
+    Mlt::Service service(m_mltProducer->parent().get_service());
+    if (service.type() != tractor_type) {
+        kWarning() << "// TRACTOR PROBLEM";
+        return;
+    }
+    Mlt::Tractor tractor(service);
+    Mlt::Producer trackProducer(tractor.track(info.track));
+    Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
+    int startPos = info.startPos.frames(m_fps);
+    int clipIndex = trackPlaylist.get_clip_index_at(startPos);
+    Mlt::Producer *clip = trackPlaylist.get_clip(clipIndex);
+
+    // keep effects
+    QList <Mlt::Filter *> filtersList;
+    Mlt::Service sourceService(clip->get_service());
+    int ct = 0;
+    Mlt::Filter *filter = sourceService.filter(ct);
+    while (filter) {
+        if (filter->get("kdenlive_ix") != 0) {
+            filtersList.append(filter);
+        }
+        ct++;
+        filter = sourceService.filter(ct);
+    }    
     mltRemoveClip(info.track, info.startPos);
     mltInsertClip(info, element, prod);
+    if (!filtersList.isEmpty()) {
+        clipIndex = trackPlaylist.get_clip_index_at(startPos);
+        Mlt::Producer *destclip = trackPlaylist.get_clip(clipIndex);
+        Mlt::Service destService(destclip->get_service());
+        delete destclip;
+        for (int i = 0; i < filtersList.count(); i++)
+            destService.attach(*(filtersList.at(i)));
+    }
 }