#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;
m_track = track;
}
+int ClipItem::effectsCounter()
+{
+ return m_effectsCounter++;
+}
+
int ClipItem::effectsCount()
{
return m_effectList.size();
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)
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();
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();
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;
}
#include "definitions.h"
#include "gentime.h"
+#include "effectslist.h"
#include "docclipbase.h"
#include "kthumb.h"
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 );
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);
}
}
+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);
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);
}
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 );
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"));
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;
}
void EffectStackView::slotUpdateEffectParams(const QDomElement& e){
- effects[activeRow]=e;
+ //effects[ui.effectlist->currentRow()]=e;
if (clipref)
emit updateClipEffect(clipref, e);
}
}
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();
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();
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++;
- }
+ }*/
}
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();
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 *);
};
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());
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;
}
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!!!!!";