]> git.sesse.net Git - kdenlive/commitdiff
Copy effects when cutting or pasting a clip
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 19 Jul 2008 17:57:51 +0000 (17:57 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 19 Jul 2008 17:57:51 +0000 (17:57 +0000)
svn path=/branches/KDE4/; revision=2323

src/addtimelineclipcommand.cpp
src/addtimelineclipcommand.h
src/clipitem.cpp
src/clipitem.h
src/customtrackview.cpp
src/customtrackview.h
src/effectslist.cpp
src/renderer.cpp

index 7827b25c5d5bccba1d47628d8bdf29c71b3f4c7e..f1d9d78fa4a160eaaca79e61e2e4797e06d2cb88 100644 (file)
@@ -22,7 +22,7 @@
 #include "addtimelineclipcommand.h"
 #include "customtrackview.h"
 
-AddTimelineClipCommand::AddTimelineClipCommand(CustomTrackView *view, QDomElement xml, int clipId, ItemInfo info, bool doIt, bool doRemove, QUndoCommand * parent) : QUndoCommand(parent), m_view(view), m_xml(xml), m_clipId(clipId), m_clipInfo(info), m_doIt(doIt), m_remove(doRemove) {
+AddTimelineClipCommand::AddTimelineClipCommand(CustomTrackView *view, QDomElement xml, int clipId, ItemInfo info, EffectsList effects, bool doIt, bool doRemove, QUndoCommand * parent) : QUndoCommand(parent), m_view(view), m_xml(xml), m_clipId(clipId), m_clipInfo(info), m_effects(effects),  m_doIt(doIt), m_remove(doRemove) {
     if (!m_remove) setText(i18n("Add timeline clip"));
     else setText(i18n("Delete timeline clip"));
 }
@@ -36,7 +36,7 @@ void AddTimelineClipCommand::undo() {
 // virtual
 void AddTimelineClipCommand::redo() {
     if (m_doIt) {
-        if (!m_remove) m_view->addClip(m_xml, m_clipId, m_clipInfo);
+        if (!m_remove) m_view->addClip(m_xml, m_clipId, m_clipInfo, m_effects);
         else m_view->deleteClip(m_clipInfo);
     }
     m_doIt = true;
index c09638c8fb8e97dd219b600c4601a63eb94c6e5b..9d596808b34c1ee0f167c8b87c8ccb67fa589ce3 100644 (file)
 
 #include "gentime.h"
 #include "definitions.h"
+#include "effectslist.h"
 
 class CustomTrackView;
 
 class AddTimelineClipCommand : public QUndoCommand {
 public:
-    AddTimelineClipCommand(CustomTrackView *view, QDomElement xml, int clipId, ItemInfo info, bool doIt, bool doRemove, QUndoCommand * parent = 0);
+    AddTimelineClipCommand(CustomTrackView *view, QDomElement xml, int clipId, ItemInfo info, EffectsList effects, bool doIt, bool doRemove, QUndoCommand * parent = 0);
     virtual void undo();
     virtual void redo();
 
 private:
     CustomTrackView *m_view;
     ItemInfo m_clipInfo;
+    EffectsList m_effects;
     int m_clipId;
     QDomElement m_xml;
     bool m_doIt;
index ef46cbaebe92f8c1b9f071abecd134bdf9645d44..33cc1473da9ae199077f6b3ce6445dfbc2701ef5 100644 (file)
@@ -104,7 +104,12 @@ ClipItem *ClipItem::clone(double scale) const {
 }
 
 void ClipItem::setEffectList(const EffectsList effectList) {
-    //m_effectList = effectList.clone();
+    m_effectList = effectList;
+    m_effectNames = m_effectList.effectNames().join(" / ");
+}
+
+const EffectsList ClipItem::effectList() {
+    return m_effectList;
 }
 
 int ClipItem::selectedEffectIndex() const {
index a52f7d12078e93fe15dd53769a869e56459af2b9..f05c866aa047499d84645bcfebd82a9eb056e6e1 100644 (file)
@@ -53,7 +53,7 @@ public:
     QString clipName() const;
     QDomElement xml() const;
     ClipItem *clone(double scale) const;
-
+    const EffectsList effectList();
     void setFadeOut(int pos, double scale);
     void setFadeIn(int pos, double scale);
     /** Give a string list of the clip's effect names */
index 2e7ba05810403dff7b720278a2de91b9cd1e1d83..be0a28f998356bd1c623b2d0949c4d95c0b305fc 100644 (file)
@@ -817,6 +817,7 @@ void CustomTrackView::cutClip(ItemInfo info, GenTime cutTime, bool cut) {
         newPos.track = info.track;
         item->resizeEnd(cutPos, m_scale);
         ClipItem *dup = new ClipItem(item->baseClip(), newPos, m_scale, m_document->fps());
+        dup->setEffectList(item->effectList());
         scene()->addItem(dup);
         m_document->renderer()->mltCutClip(m_tracksList.count() - info.track, cutTime);
         item->baseClip()->addReference();
@@ -928,7 +929,7 @@ void CustomTrackView::dragLeaveEvent(QDragLeaveEvent * event) {
 
 void CustomTrackView::dropEvent(QDropEvent * event) {
     if (m_dropItem) {
-        AddTimelineClipCommand *command = new AddTimelineClipCommand(this, m_dropItem->xml(), m_dropItem->clipProducer(), m_dropItem->info(), false, false);
+        AddTimelineClipCommand *command = new AddTimelineClipCommand(this, m_dropItem->xml(), m_dropItem->clipProducer(), m_dropItem->info(), m_dropItem->effectList(), false, false);
         m_commandStack->push(command);
         m_dropItem->baseClip()->addReference();
         m_document->updateClip(m_dropItem->baseClip()->getId());
@@ -1000,7 +1001,7 @@ void CustomTrackView::deleteClip(int clipId) {
         if (itemList.at(i)->type() == AVWIDGET) {
             ClipItem *item = (ClipItem *)itemList.at(i);
             if (item->clipProducer() == clipId) {
-                AddTimelineClipCommand *command = new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), true, true);
+                AddTimelineClipCommand *command = new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), true, true);
                 m_commandStack->push(command);
                 //delete item;
             }
@@ -1113,7 +1114,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) {
                     info.track = info.track - trackOffset;
                     if (item->type() == AVWIDGET) {
                         ClipItem *clip = static_cast <ClipItem*>(item);
-                        new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), info, false, true, moveClips);
+                        new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), info, clip->effectList(), false, true, moveClips);
                         m_document->renderer()->mltRemoveClip(m_tracksList.count() - info.track, info.startPos);
                     } else {
                         Transition *tr = static_cast <Transition*>(item);
@@ -1127,7 +1128,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) {
                     AbstractClipItem *item = m_selectedClipList.at(i);
                     if (item->type() == AVWIDGET) {
                         ClipItem *clip = static_cast <ClipItem*>(item);
-                        new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), item->info(), false, false, moveClips);
+                        new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), item->info(), clip->effectList(), false, false, moveClips);
                         ItemInfo info = item->info();
                         info.track = m_tracksList.count() - item->track();
                         m_document->renderer()->mltInsertClip(info, clip->xml(), clip->baseClip()->producer());
@@ -1263,7 +1264,7 @@ void CustomTrackView::deleteSelectedClips() {
     for (int i = 0; i < itemList.count(); i++) {
         if (itemList.at(i)->type() == AVWIDGET) {
             ClipItem *item = static_cast <ClipItem *>(itemList.at(i));
-            new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), true, true, deleteSelected);
+            new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), true, true, deleteSelected);
         } else if (itemList.at(i)->type() == TRANSITIONWIDGET) {
             Transition *item = static_cast <Transition *>(itemList.at(i));
             ItemInfo info;
@@ -1294,14 +1295,18 @@ void CustomTrackView::cutSelectedClips() {
     }
 }
 
-void CustomTrackView::addClip(QDomElement xml, int clipId, ItemInfo info) {
+void CustomTrackView::addClip(QDomElement xml, int clipId, ItemInfo info, EffectsList effects) {
     DocClipBase *baseclip = m_document->clipManager()->getClipById(clipId);
     ClipItem *item = new ClipItem(baseclip, info, m_scale, m_document->fps());
+    item->setEffectList(effects);
     scene()->addItem(item);
     baseclip->addReference();
     m_document->updateClip(baseclip->getId());
     info.track = m_tracksList.count() - info.track;
     m_document->renderer()->mltInsertClip(info, xml, baseclip->producer());
+    for (int i = 0; i < item->effectsCount(); i++) {
+        m_document->renderer()->mltAddEffect(info.track, info.startPos, item->getEffectArgs(item->effectAt(i)), false);
+    }
     m_document->renderer()->doRefresh();
 }
 
@@ -2029,7 +2034,7 @@ void CustomTrackView::pasteClip() {
             info.cropStart = clip->cropStart();
             info.track = clip->track() + trackOffset;
             if (canBePastedTo(info, AVWIDGET)) {
-                new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), info, true, false, pasteClips);
+                new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), info, clip->effectList(), true, false, pasteClips);
             } else emit displayMessage(i18n("Cannot paste clip to selected place"), ErrorMessage);
         } else if (m_copiedItems.at(i) && m_copiedItems.at(i)->type() == TRANSITIONWIDGET) {
             Transition *tr = static_cast <Transition *>(m_copiedItems.at(i));
index 1cbdca002691e65aa97788196a668280158a3486..991936f3ca16d670a018af1127089f57ef8e3289 100644 (file)
@@ -31,6 +31,7 @@
 #include "kdenlivedoc.h"
 #include "docclipbase.h"
 #include "guide.h"
+#include "effectslist.h"
 
 class ClipItem;
 class AbstractClipItem;
@@ -54,7 +55,7 @@ public:
     /** move transition, startPos = (old start, old end), endPos = (new start, new end) */
     void moveTransition(const ItemInfo start, const ItemInfo end);
     void resizeClip(const ItemInfo start, const ItemInfo end);
-    void addClip(QDomElement xml, int clipId, ItemInfo info);
+    void addClip(QDomElement xml, int clipId, ItemInfo info, EffectsList list = EffectsList());
     void deleteClip(ItemInfo info);
     void slotAddClipMarker();
     void slotEditClipMarker();
index c9586801a364bbdd46f0c1bb9f8870c70e31a8c7..92ea77c33013f3e67d66f02a2299806ff4cfdf9a 100644 (file)
@@ -45,6 +45,7 @@ QMap <QString, QString> EffectsList::effect(const QString & name) {
     return filter;
 }
 
+
 QDomElement EffectsList::getEffectByName(const QString & name) const {
     QString effectName;
     for (int i = 0; i < this->size(); ++i) {
index cc0b15db4782ed7a5a76e7e83a5afbd7bc290dc8..860ccd0c52e359478c81873d75949c1cb9a6c21c 100644 (file)
@@ -1145,7 +1145,19 @@ void Render::mltCutClip(int track, GenTime position) {
     Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
     trackPlaylist.split_at((int) position.frames(m_fps));
     trackPlaylist.consolidate_blanks(0);
-    m_isBlocked = false;
+    // duplicate effects
+    Mlt::Producer *original = trackPlaylist.get_clip_at((int) position.frames(m_fps) - 1);
+    Mlt::Producer *clip = trackPlaylist.get_clip_at((int) position.frames(m_fps) + 1);
+    Mlt::Service clipService(original->get_service());
+    Mlt::Service dupService(clip->get_service());
+    int ct = 0;
+    Mlt::Filter *filter = clipService.filter(ct);
+    while (filter) {
+        Mlt::Filter *dup = new Mlt::Filter(filter->get_filter());
+        dupService.attach(*dup);
+        ct++;
+        filter = clipService.filter(ct);
+    }
 }
 
 void Render::mltUpdateClip(ItemInfo info, QDomElement element, Mlt::Producer *prod) {