]> git.sesse.net Git - kdenlive/commitdiff
Update effect stak stuff
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Fri, 22 Feb 2008 19:48:11 +0000 (19:48 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Fri, 22 Feb 2008 19:48:11 +0000 (19:48 +0000)
svn path=/branches/KDE4/; revision=1907

src/clipitem.cpp
src/clipitem.h
src/customtrackview.cpp
src/customtrackview.h
src/effectstackview.cpp
src/effectstackview.h
src/mainwindow.cpp
src/renderer.cpp

index 0bc7a5e9fca9f694e91a2f755e82fde0d218c1b5..549d34ef4fa1f9f87ab57c244a8829d525fa3d7d 100644 (file)
@@ -34,7 +34,7 @@
 #include "kdenlivesettings.h"
 
 ClipItem::ClipItem(DocClipBase *clip, int track, int startpos, const QRectF & rect, int duration)
-    : QGraphicsRectItem(rect), m_clip(clip), m_resizeMode(NONE), m_grabPoint(0), m_maxTrack(0), m_track(track), m_startPos(startpos), m_hasThumbs(false), startThumbTimer(NULL), endThumbTimer(NULL), m_startFade(0), m_endFade(0)
+    : QGraphicsRectItem(rect), m_clip(clip), m_resizeMode(NONE), m_grabPoint(0), m_maxTrack(0), m_track(track), m_startPos(startpos), m_hasThumbs(false), startThumbTimer(NULL), endThumbTimer(NULL), m_startFade(0), m_endFade(0), m_effectsCounter(0)
 {
   //setToolTip(name);
   kDebug()<<"*******  CREATING NEW TML CLIP, DUR: "<<duration;
@@ -470,6 +470,11 @@ void ClipItem::setTrack(int track)
   m_track = track;
 }
 
+int ClipItem::effectsCounter()
+{
+  return m_effectsCounter++;
+}
+
 int ClipItem::effectsCount()
 {
   return m_effectList.size();
@@ -477,13 +482,7 @@ int ClipItem::effectsCount()
 
 QStringList ClipItem::effectNames()
 {
-  QStringList result;
-  for (int i = 0; i < m_effectList.size(); ++i) {
-       QDomNode namenode = m_effectList.at(i).elementsByTagName("name").item(0);
-       if (!namenode.isNull()) result.append(namenode.toElement().text());
-  }
-  kDebug()<<"///  EFFECT LIST FOR CLIP IS: "<<result;
-  return result;
+  return m_effectList.effectNames();
 }
 
 QDomElement ClipItem::effectAt(int ix)
@@ -491,12 +490,20 @@ QDomElement ClipItem::effectAt(int ix)
   return m_effectList.at(ix);
 }
 
+void ClipItem::setEffectAt(int ix, QDomElement effect)
+{
+  kDebug()<<"CHange EFFECT AT: "<<ix<<", CURR: "<<m_effectList.at(ix).attribute("tag")<<", NEW: "<<effect.attribute("tag");
+  m_effectList.insert(ix, effect);
+  m_effectList.removeAt(ix + 1);
+  update(boundingRect());
+}
+
 QMap <QString, QString> ClipItem::addEffect(QDomElement effect)
 {
   QMap <QString, QString> effectParams;
-  effectParams["kdenlive_ix"] = QString::number(m_effectList.size());
   m_effectList.append(effect);
   effectParams["tag"] = effect.attribute("tag");
+  effectParams["kdenlive_ix"] = effect.attribute("kdenlive_ix");
   QDomNodeList params = effect.elementsByTagName("parameter");
   for (int i = 0; i < params.count(); i++) {
     QDomElement e = params.item(i).toElement();
@@ -510,8 +517,8 @@ QMap <QString, QString> ClipItem::addEffect(QDomElement effect)
 QMap <QString, QString> ClipItem::getEffectArgs(QDomElement effect)
 {
   QMap <QString, QString> effectParams;
-  effectParams["kdenlive_ix"] = effect.attribute("kdenlive_ix");
   effectParams["tag"] = effect.attribute("tag");
+  effectParams["kdenlive_ix"] = effect.attribute("kdenlive_ix");
   QDomNodeList params = effect.elementsByTagName("parameter");
   for (int i = 0; i < params.count(); i++) {
     QDomElement e = params.item(i).toElement();
@@ -521,10 +528,10 @@ QMap <QString, QString> ClipItem::getEffectArgs(QDomElement effect)
   return effectParams;
 }
 
-void ClipItem::deleteEffect(QString tag)
+void ClipItem::deleteEffect(QString index)
 {
   for (int i = 0; i < m_effectList.size(); ++i) {
-    if (m_effectList.at(i).attribute("kdenlive_ix") == tag) {
+    if (m_effectList.at(i).attribute("kdenlive_ix") == index) {
       m_effectList.removeAt(i);
       break;
     }
index f938d93f266167dca4cbfa1498bf433e209e1f46..e6c73855cd2565d821741e649939b5bef74ed626 100644 (file)
@@ -27,6 +27,7 @@
 
 #include "definitions.h"
 #include "gentime.h"
+#include "effectslist.h"
 #include "docclipbase.h"
 #include "kthumb.h"
 
@@ -62,12 +63,22 @@ class ClipItem : public QObject, public QGraphicsRectItem
     int fadeOut() const;
     void setFadeOut(int pos, double scale);
     void setFadeIn(int pos, double scale);
+    /** Give a string list of the clip's effect names */
     QStringList effectNames();
+    /** Add an effect to the clip and return the parameters that will be passed to Mlt */
     QMap <QString, QString> addEffect(QDomElement effect);
+    /** Get the effect parameters that will be passed to Mlt */
     QMap <QString, QString> getEffectArgs(QDomElement effect);
-    void deleteEffect(QString tag);
+    /** Delete effect with id index */
+    void deleteEffect(QString index);
+    /** return the number of effects in that clip */
     int effectsCount();
+    /** return a unique effect id */
+    int effectsCounter();
+    /** return the xml of effect at index ix in stack */
     QDomElement effectAt(int ix);
+    /** Replace effect at pos ix with given value */
+    void setEffectAt(int ix, QDomElement effect);
 
   protected:
     virtual void mouseMoveEvent ( QGraphicsSceneMouseEvent * event );
@@ -96,8 +107,10 @@ class ClipItem : public QObject, public QGraphicsRectItem
     QTimer *endThumbTimer;
     uint m_startFade;
     uint m_endFade;
+    /** counter used to provide a unique id to each effect */
+    int m_effectsCounter;
     
-    QList< QDomElement > m_effectList;
+    EffectsList m_effectList;
 
   private slots:
     void slotThumbReady(int frame, QPixmap pix);
index fc84608d5dfbd4706811dab170c553bf843e201a..a8f98a36355f168df56818d415b0c5d1444a3b3e 100644 (file)
@@ -329,6 +329,16 @@ void CustomTrackView::dragEnterEvent ( QDragEnterEvent * event )
   }
 }
 
+void CustomTrackView::slotRefreshEffects(ClipItem *clip)
+{
+  int track = m_tracksCount - clip->track();
+  GenTime pos = GenTime(clip->startPos(), m_document->fps());
+  m_document->renderer()->mltRemoveEffect(track, pos, "-1");
+  for (int i = 0; i < clip->effectsCount(); i++) {
+    m_document->renderer()->mltAddEffect(track, pos, clip->getEffectArgs(clip->effectAt(i)));
+  }
+}
+
 void CustomTrackView::addEffect(int track, GenTime pos, QDomElement effect)
 {
   ClipItem *clip = getClipItemAt(pos.frames(m_document->fps()) + 1, m_tracksCount - track);
@@ -356,8 +366,9 @@ void CustomTrackView::slotAddEffect(QDomElement effect)
   for (int i = 0; i < itemList.count(); i++) {
     if (itemList.at(i)->type() == 70000 && itemList.at(i)->isSelected()) {
       ClipItem *item = (ClipItem *)itemList.at(i);
-      // the kdenlive_ix int is used to identify an effect in the stack and in mlt's playlist
-      effect.setAttribute("kdenlive_ix", QString::number(item->effectsCount()));
+      // the kdenlive_ix int is used to identify an effect in mlt's playlist, should
+      // not be changed
+      effect.setAttribute("kdenlive_ix", QString::number(item->effectsCounter()));
       AddEffectCommand *command = new AddEffectCommand(this, m_tracksCount - item->track(),GenTime(item->startPos(), m_document->fps()), effect, true);
       m_commandStack->push(command);    
     }
index 9bee0bb4ba40aa44445aaf5e90fe0e2ba0e4666d..632681879764594a774abe8f92ea07fa9dbe6c0b 100644 (file)
@@ -58,6 +58,7 @@ class CustomTrackView : public QGraphicsView
     void setCursorPos(int pos, bool seek = true);
     void slotDeleteEffect(ClipItem *clip, QDomElement effect);
     void slotUpdateClipEffect(ClipItem *clip, QDomElement effect);
+    void slotRefreshEffects(ClipItem *clip);
 
   protected:
     virtual void drawBackground ( QPainter * painter, const QRectF & rect );
index 613aeae5ddba1412c68e5dbc79973b65e71d12b2..a33eb2e2c227336919eb3831af3d8752a4563a26 100644 (file)
@@ -31,7 +31,6 @@ EffectStackView::EffectStackView(EffectsList *audioEffectList, EffectsList *vide
        effectedit=new EffectStackEdit(ui.frame,this);
        //ui.effectlist->horizontalHeader()->setVisible(false);
        //ui.effectlist->verticalHeader()->setVisible(false);
-       activeRow=-1;
        clipref=NULL;
        
        ui.buttonNew->setIcon(KIcon("document-new"));
@@ -47,12 +46,12 @@ EffectStackView::EffectStackView(EffectsList *audioEffectList, EffectsList *vide
        
        ui.effectlist->setDragDropMode(QAbstractItemView::NoDragDrop);//use internal if drop is recognised right
        
-       connect (ui.effectlist, SIGNAL ( itemPressed(QListWidgetItem *)), this , SLOT( slotItemSelectionChanged() ));
+       connect (ui.effectlist, SIGNAL ( itemSelectionChanged()), this , SLOT( slotItemSelectionChanged() ));
        connect (ui.buttonNew, SIGNAL (clicked()), this, SLOT (slotNewEffect()) );
        connect (ui.buttonUp, SIGNAL (clicked()), this, SLOT (slotItemUp()) );
        connect (ui.buttonDown, SIGNAL (clicked()), this, SLOT (slotItemDown()) );
        connect (ui.buttonDel, SIGNAL (clicked()), this, SLOT (slotItemDel()) );
-       connect( this,SIGNAL (transferParamDesc(const QDomElement&,int ,int) ), effectedit , SLOT(transferParamDesc(const QDomElement&,int ,int)));
+       connect( this, SIGNAL (transferParamDesc(const QDomElement&,int ,int) ), effectedit , SLOT(transferParamDesc(const QDomElement&,int ,int)));
        connect(effectedit, SIGNAL (parameterChanged(const QDomElement&  ) ), this , SLOT (slotUpdateEffectParams(const QDomElement&)));
        effectLists["audio"]=audioEffectList;
        effectLists["video"]=videoEffectList;
@@ -64,7 +63,7 @@ EffectStackView::EffectStackView(EffectsList *audioEffectList, EffectsList *vide
 }
 
 void EffectStackView::slotUpdateEffectParams(const QDomElement& e){
-       effects[activeRow]=e;
+       //effects[ui.effectlist->currentRow()]=e;
        if (clipref)
                emit updateClipEffect(clipref, e);
 }
@@ -78,12 +77,8 @@ void EffectStackView::slotClipItemSelected(ClipItem* c)
        }
        setEnabled(true);
        //effects=clipref->effectNames();
-       effects.clear();
        for (int i=0;i<clipref->effectsCount();i++){
-
-               QDomElement element=clipref->effectAt(i);
-               effects[element.attribute("kdenlive_ix").toInt()]=element;
-               renumberEffects();
+               QDomElement element=clipref->effectAt(i);//kDebug()<<"// SET STACK :"<<element.attribute("kdenlive_ix")<<", ("<<i<<") = "<<element.attribute("tag");
        }
        setupListView();
        
@@ -92,80 +87,78 @@ void EffectStackView::slotClipItemSelected(ClipItem* c)
 void EffectStackView::setupListView(){
 
        ui.effectlist->clear();
-       foreach (QDomElement d,effects){
-               
+       for (int i=0;i<clipref->effectsCount();i++){
+               QDomElement d=clipref->effectAt(i);
                QDomNode namenode = d.elementsByTagName("name").item(0);
-               if (!namenode.isNull()) 
-                       ui.effectlist->addItem(namenode.toElement().text() );
-       }
-       //ui.effectlist->addItems(effects);
-       for (int i=0;i< ui.effectlist->count();i++){
-               QListWidgetItem* item=ui.effectlist->item(i);
-               item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsDragEnabled|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);
-               item->setCheckState(Qt::Checked);
-               if (activeRow==i){
-                       item->setSelected(true);
-                       ui.effectlist->setCurrentRow(activeRow);
+               if (!namenode.isNull()) {
+                       QListWidgetItem* item = new QListWidgetItem(namenode.toElement().text(), ui.effectlist);
+                       item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsDragEnabled|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);
+                       item->setCheckState(Qt::Checked);
                }
        }
-       slotItemSelectionChanged();
+       ui.effectlist->setCurrentRow(0);
 }
 
 void EffectStackView::slotItemSelectionChanged(){
-       
-       if (ui.effectlist->currentItem() && ui.effectlist->currentItem()->isSelected() ){
-               activeRow=ui.effectlist->row( ui.effectlist->currentItem() );
-               emit transferParamDesc(effects[activeRow] ,0,100);//minx max frame
-       }else{
-               activeRow=-1;
+       bool hasItem = ui.effectlist->currentItem();
+       int activeRow = ui.effectlist->currentRow();
+       if (hasItem && ui.effectlist->currentItem()->isSelected() ){
+               emit transferParamDesc(clipref->effectAt(activeRow) ,0,100);//minx max frame
        }
-       ui.buttonDel->setEnabled( activeRow!=-1);
+       ui.buttonDel->setEnabled( hasItem );
        ui.buttonUp->setEnabled( activeRow >0 );
-       ui.buttonDown->setEnabled( (activeRow<ui.effectlist->count()-1) && activeRow>=0 );
+       ui.buttonDown->setEnabled( (activeRow < ui.effectlist->count()-1) && hasItem );
 }
 
 void EffectStackView::slotItemUp(){
-       if (activeRow>0 && activeRow <effects.size() ){
-               QDomElement act=effects.take(activeRow);
-               QDomElement before=effects.take(activeRow-1);
-               effects[activeRow-1]=act;
-               effects[activeRow]=before;
-               renumberEffects();
+       int activeRow = ui.effectlist->currentRow();
+       if (activeRow>0){
+               QDomElement act = clipref->effectAt(activeRow).cloneNode().toElement();
+               QDomElement before = clipref->effectAt(activeRow-1).cloneNode().toElement();
+               clipref->setEffectAt(activeRow-1, act);
+               clipref->setEffectAt(activeRow, before);
+               //renumberEffects();
                //effects.swap(activeRow, activeRow-1);
        }
-       activeRow--;
-       setupListView();
-       
+       QListWidgetItem *item = ui.effectlist->takeItem(activeRow);
+       ui.effectlist->insertItem (activeRow-1, item);
+       ui.effectlist->setCurrentItem(item);
+       emit refreshEffectStack(clipref);
 }
 
 void EffectStackView::slotItemDown(){
-       if (activeRow<effects.size()-1  ){
-               QDomElement act=effects.take(activeRow);
-               QDomElement after=effects.take(activeRow+1);
-               effects[activeRow+1]=act;
-               effects[activeRow]=after;
-               renumberEffects();
+       int activeRow = ui.effectlist->currentRow();
+       if (activeRow < ui.effectlist->count()-1){
+               QDomElement act = clipref->effectAt(activeRow).cloneNode().toElement();
+               QDomElement after = clipref->effectAt(activeRow+1).cloneNode().toElement();
+               clipref->setEffectAt(activeRow+1, act);
+               clipref->setEffectAt(activeRow, after);
+               //renumberEffects();
                //effects.swap(activeRow, activeRow+1);
        }
-       activeRow++;
-       setupListView();
-       
+       QListWidgetItem *item = ui.effectlist->takeItem(activeRow);
+       ui.effectlist->insertItem (activeRow+1, item);
+       ui.effectlist->setCurrentItem(item);
+       emit refreshEffectStack(clipref);
 }
 
 void EffectStackView::slotItemDel(){
-       if (activeRow<effects.size() && activeRow>=0  ){
+       int activeRow = ui.effectlist->currentRow();
+       if ( activeRow>=0  ){
                emit removeEffect(clipref, clipref->effectAt(activeRow));
-               effects.take(activeRow);
-               renumberEffects();
+               //effects.take(activeRow);
+               //renumberEffects();
                //effects.removeAt(activeRow);
        }
-       if (effects.size()>0 && activeRow>0)
-       activeRow--;
-       setupListView();
+       /*if (effects.size()>0 && activeRow>0) {
+               QListWidgetItem *item = ui.effectlist->takeItem(activeRow);
+               kDebug()<<"777777   DELETING ITEM: "<<activeRow;
+               delete item;
+       }*/
        
 }
 
-void EffectStackView::renumberEffects(){
+void EffectStackView::renumberEffects(){/*
        QMap<int,QDomElement> tmplist=effects;
        QMapIterator<int,QDomElement> it(tmplist);
        effects.clear();
@@ -174,17 +167,18 @@ void EffectStackView::renumberEffects(){
        while (it.hasNext()){
                it.next();
                QDomElement item=it.value();
+               int currentVal = item.attributes().namedItem("kdenlive_ix").nodeValue().toInt();
                item.attributes().namedItem("kdenlive_ix").setNodeValue(QString::number(i));
-       
                effects[i]=item;
-               if (clipref)
+               if (clipref && i != currentVal)
                        emit updateClipEffect(clipref,item);
                QString outstr;
                QTextStream str(&outstr);
                item.save(str,2);
                kDebug() << "nummer: " << i << " " << outstr;
+               kDebug()<<"EFFECT "<<i<<" = "<<item.attribute("tag");
                i++;
-       }
+       }*/
        
 }
 
index 77f05ac2611a1623f6ca7ebc15eaca7d5a3e174a..987401155b1722697b17f9c61da0e2960f6ce7da 100644 (file)
@@ -33,8 +33,6 @@ class EffectStackView : public QWidget
                EffectStackView(EffectsList *audioEffectList, EffectsList *videoEffectList, EffectsList *customEffectList, QWidget *parent=0);
        
 private:
-       int activeRow;
-       QMap<int,QDomElement> effects;
        Ui::EffectStack_UI ui;
        ClipItem* clipref;
        void setupListView();
@@ -54,7 +52,11 @@ public slots:
 signals:
        void transferParamDesc(const QDomElement&,int ,int);
        void removeEffect(ClipItem*, QDomElement);
+       /**  Parameters for an effect changed, update the filter in playlist */
        void updateClipEffect(ClipItem*, QDomElement);
+       /** An effect in stack was moved, we need to regenerate 
+           all effects for this clip in the playlist */
+       void refreshEffectStack(ClipItem *);
 
 };
 
index 24dbd5170981db9433eacdeca22488ef496e1a88..e744e809c045c774d0c56d109b64c8e9716e3ab4 100644 (file)
@@ -444,7 +444,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //chang
   connect(trackView, SIGNAL(clipItemSelected(ClipItem*)), effectStack, SLOT(slotClipItemSelected(ClipItem*)));
   connect(effectStack, SIGNAL(updateClipEffect(ClipItem*, QDomElement)), trackView->projectView(), SLOT(slotUpdateClipEffect(ClipItem*, QDomElement)));
   connect(effectStack, SIGNAL(removeEffect(ClipItem*, QDomElement)), trackView->projectView(), SLOT(slotDeleteEffect(ClipItem*, QDomElement)));
-
+  connect(effectStack, SIGNAL(refreshEffectStack(ClipItem*)), trackView->projectView(), SLOT(slotRefreshEffects(ClipItem*)));
 
   m_projectList->setDocument(doc);
   m_monitorManager->setTimecode(doc->timecode());
index ebe916d307885ad12365cb1d56b57b305e948f58..93719a3af60c6e57e181c1f715114797aef6a8b3 100644 (file)
@@ -1026,7 +1026,7 @@ void Render::mltRemoveEffect(int track, GenTime position, QString index)
     int ct = 0;
        Mlt::Filter *filter = clipService.filter( ct );
        while (filter) {
-           if (filter->get("kdenlive_ix") == index) {// && filter->get("kdenlive_id") == id) {
+           if (index == "-1" || filter->get("kdenlive_ix") == index) {// && filter->get("kdenlive_id") == id) {
                clipService.detach(*filter);
                kDebug()<<" / / / DLEETED EFFECT: "<<ct;
            }
@@ -1124,8 +1124,21 @@ void Render::mltEditEffect(int track, GenTime position, QMap <QString, QString>
       m_isBlocked = false;
       return;
     }
+
     Mlt::Service clipService(clip->get_service());
-    Mlt::Filter *filter = clipService.filter( index.toInt() );
+
+//    if (tag.startsWith("ladspa")) tag = "ladspa";
+
+    int ct = 0;
+    Mlt::Filter *filter = clipService.filter( ct );
+    while (filter) {
+       if (filter->get("kdenlive_ix") == index) {
+         break;
+       }
+       ct++;
+       filter = clipService.filter( ct );
+    }
+
 
     if (!filter) {
        kDebug()<<"WARINIG, FILTER NOT FOUND!!!!!";