emit displayMessage(i18n("You must copy exactly one clip before pasting effects"), ErrorMessage);
return;
}
- ClipItem *clip = static_cast < ClipItem *> (m_copiedItems.at(0));
+ ClipItem *clip = static_cast < ClipItem *>(m_copiedItems.at(0));
EffectsList effects = clip->effectList();
QUndoCommand *paste = new QUndoCommand();
QList<QGraphicsItem *> clips = scene()->selectedItems();
for (int i = 0; i < clips.count(); ++i) {
- if (clips.at(i)->type() == AVWIDGET) {
- ClipItem *item = static_cast < ClipItem *> (clips.at(i));
- for (int i = 0; i < clip->effectsCount(); i++) {
- new AddEffectCommand(this, m_tracksList.count() - item->track(), item->startPos(), clip->effectAt(i), true, paste);
- }
- }
+ if (clips.at(i)->type() == AVWIDGET) {
+ ClipItem *item = static_cast < ClipItem *>(clips.at(i));
+ for (int i = 0; i < clip->effectsCount(); i++) {
+ new AddEffectCommand(this, m_tracksList.count() - item->track(), item->startPos(), clip->effectAt(i), true, paste);
+ }
+ }
}
m_commandStack->push(paste);
}
QDomNodeList params = effect.elementsByTagName("parameter");
for (int i = 0; i < params.count(); i++) {
QDomElement e = params.item(i).toElement();
- e.setAttribute("value", e.attribute("default"));
+ if (!e.hasAttribute("value"))
+ e.setAttribute("value", e.attribute("default"));
}
return effect;
}
QDomNodeList params = effect.elementsByTagName("parameter");
for (int i = 0; i < params.count(); i++) {
QDomElement e = params.item(i).toElement();
- e.setAttribute("value", e.attribute("default"));
+ if (!e.hasAttribute("value"))
+ e.setAttribute("value", e.attribute("default"));
}
return effect;
}
}
- for (int i = 0; i < this->size(); ++i) {
- QDomElement effect = this->at(i);
- if (effect.attribute("tag") == tag) {
- QDomNodeList params = effect.elementsByTagName("parameter");
- for (int i = 0; i < params.count(); i++) {
- QDomElement e = params.item(i).toElement();
- e.setAttribute("value", e.attribute("default"));
+ if (!tag.isEmpty()) for (int i = 0; i < this->size(); ++i) {
+ QDomElement effect = this->at(i);
+ if (effect.attribute("tag") == tag) {
+ QDomNodeList params = effect.elementsByTagName("parameter");
+ for (int i = 0; i < params.count(); i++) {
+ QDomElement e = params.item(i).toElement();
+ if (!e.hasAttribute("value"))
+ e.setAttribute("value", e.attribute("default"));
+ }
+ return effect;
}
- return effect;
}
- }
return QDomElement();
}
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
***************************************************************************/
+#include <QMenu>
+#include <QMenu>
+#include <QDir>
#include <KDebug>
#include <KLocale>
+#include <KStandardDirs>
#include "effectslistview.h"
#include "effectslistwidget.h"
EffectsListView::EffectsListView(QWidget *parent)
: QWidget(parent) {
- m_effectsList = new EffectsListWidget();
-
ui.setupUi(this);
+
+ QMenu *menu = new QMenu(this);
+ m_effectsList = new EffectsListWidget(menu);
QVBoxLayout *lyr = new QVBoxLayout(ui.effectlistframe);
lyr->addWidget(m_effectsList);
+ lyr->setContentsMargins(0, 0, 0, 0);
ui.search_effect->setListWidget(m_effectsList);
ui.buttonInfo->setIcon(KIcon("help-about"));
ui.infopanel->hide();
+ menu->addAction(KIcon("edit-delete"), i18n("Delete effect"), this, SLOT(slotRemoveEffect()));
connect(ui.type_combo, SIGNAL(currentIndexChanged(int)), this, SLOT(filterList(int)));
connect(ui.buttonInfo, SIGNAL(clicked()), this, SLOT(showInfoPanel()));
return m_effectsList;
}
+void EffectsListView::reloadEffectList() {
+ m_effectsList->initList();
+}
+
+void EffectsListView::slotRemoveEffect() {
+ QListWidgetItem *item = m_effectsList->currentItem();
+ QString effectId = item->text();
+ QString path = KStandardDirs::locateLocal("data", "kdenlive/effects/", true);
+
+ QDir directory = QDir(path);
+ QStringList fileList = directory.entryList(QDir::Files);
+ QString itemName;
+ foreach(QString filename, fileList) {
+ itemName = KUrl(path + filename).path();
+ if (itemName.endsWith(".xml")) {
+ QDomDocument doc;
+ QFile file(itemName);
+ doc.setContent(&file, false);
+ file.close();
+ QDomNodeList effects = doc.elementsByTagName("effect");
+ if (effects.count() != 1) {
+ kDebug() << "More than one effect in file " << itemName << ", NOT SUPPORTED YET";
+ } else {
+ QDomElement e = effects.item(0).toElement();
+ if (e.attribute("id") == effectId) {
+ QFile::remove(itemName);
+ break;
+ }
+ }
+ }
+ }
+ emit reloadEffects();
+}
+
#include "effectslistview.moc"
public:
EffectsListView(QWidget *parent = 0);
KListWidget *listView();
+ void reloadEffectList();
//void slotAddEffect(GenTime pos, int track, QString name);
private:
void slotUpdateInfo();
void showInfoPanel();
void slotEffectSelected();
+ void slotRemoveEffect();
public slots:
signals:
void addEffect(QDomElement);
+ void reloadEffects();
};
#endif
#include "QApplication"
#include "QMouseEvent"
+#include <QMenu>
#include "KDebug"
#define EFFECT_AUDIO 2
#define EFFECT_CUSTOM 3
-EffectsListWidget::EffectsListWidget(QWidget *parent)
- : KListWidget(parent) {
+EffectsListWidget::EffectsListWidget(QMenu *menu, QWidget *parent)
+ : KListWidget(parent), m_menu(menu) {
//setSelectionMode(QAbstractItemView::ExtendedSelection);
//setDragDropMode(QAbstractItemView::DragDrop);
setDropIndicatorShown(true);
//}
}
-
+//virtual
+void EffectsListWidget::contextMenuEvent(QContextMenuEvent * event) {
+ QListWidgetItem *item = itemAt(event->pos());
+ if (item && item->data(Qt::UserRole).toInt() == EFFECT_CUSTOM) m_menu->popup(event->globalPos());
+}
#include "effectslistwidget.moc"
Q_OBJECT
public:
- EffectsListWidget(QWidget *parent = 0);
+ EffectsListWidget(QMenu *menu, QWidget *parent = 0);
virtual ~EffectsListWidget();
QDomElement currentEffect();
QString currentInfo();
QDomElement itemEffect(QListWidgetItem *item);
+ void initList();
protected:
virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseMoveEvent(QMouseEvent *event);
virtual void dragMoveEvent(QDragMoveEvent *event);
+ virtual void contextMenuEvent(QContextMenuEvent * event);
private:
bool m_dragStarted;
QPoint m_DragStartPosition;
- void initList();
-
+ QMenu *m_menu;
};
#endif
* *
***************************************************************************/
+#include <QHeaderView>
+#include <QMenu>
+#include <QInputDialog>
+#include <QTextStream>
+#include <QFile>
+
#include <KDebug>
#include <KLocale>
+#include <KMessageBox>
+#include <KStandardDirs>
#include "effectstackview.h"
#include "effectslist.h"
#include "clipitem.h"
#include "mainwindow.h"
-#include <QHeaderView>
-#include <QMenu>
+
EffectStackView::EffectStackView(QWidget *parent)
: QWidget(parent) {
ui.buttonDown->setToolTip(i18n("Move effect down"));
ui.buttonDel->setIcon(KIcon("trash-empty"));
ui.buttonDel->setToolTip(i18n("Delete effect"));
+ ui.buttonSave->setIcon(KIcon("document-save"));
+ ui.buttonSave->setToolTip(i18n("Save effect"));
ui.buttonReset->setIcon(KIcon("view-refresh"));
ui.buttonReset->setToolTip(i18n("Reset effect"));
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(ui.buttonSave, SIGNAL(clicked()), this, SLOT(slotSaveEffect()));
connect(ui.buttonReset, SIGNAL(clicked()), this, SLOT(slotResetEffect()));
connect(this, SIGNAL(transferParamDesc(const QDomElement&, int , int)), effectedit , SLOT(transferParamDesc(const QDomElement&, int , int)));
connect(effectedit, SIGNAL(parameterChanged(const QDomElement&, const QDomElement&)), this , SLOT(slotUpdateEffectParams(const QDomElement&, const QDomElement&)));
setEnabled(false);
}
+void EffectStackView::slotSaveEffect() {
+ QString name = QInputDialog::getText(this, i18n("Save Effect"), i18n("Name for saved effect: "));
+ if (name.isEmpty()) return;
+ QString path = KStandardDirs::locateLocal("data", "kdenlive/effects/", true);
+ path = path + name + ".xml";
+ if (QFile::exists(path)) if (KMessageBox::questionYesNo(this, i18n("File already exists.\nDo you want to overwrite it ?")) == KMessageBox::No) return;
+
+ int i = ui.effectlist->currentRow();
+ QDomDocument doc;
+ QDomElement effect = clipref->effectAt(i).cloneNode().toElement();
+ doc.appendChild(doc.importNode(effect, true));
+ effect = doc.firstChild().toElement();
+ effect.removeAttribute("kdenlive_ix");
+ effect.setAttribute("id", name);
+ QDomElement effectname = effect.firstChildElement("name");
+ effect.removeChild(effectname);
+ effectname = doc.createElement("name");
+ QDomText nametext = doc.createTextNode(name);
+ effectname.appendChild(nametext);
+ effect.insertBefore(effectname, QDomNode());
+ QDomElement effectprops = effect.firstChildElement("properties");
+ effectprops.setAttribute("id", name);
+ effectprops.setAttribute("type", "custom");
+
+
+ QFile file(path);
+ if (file.open(QFile::WriteOnly | QFile::Truncate)) {
+ QTextStream out(&file);
+ out << doc.toString();
+ }
+ file.close();
+ emit reloadEffects();
+}
+
void EffectStackView::slotUpdateEffectParams(const QDomElement& old, const QDomElement& e) {
if (clipref)
emit updateClipEffect(clipref, old, e, ui.effectlist->currentRow());
else item->setCheckState(Qt::Checked);
}
}
- if (clipref->effectsCount() == 0)
+ if (clipref->effectsCount() == 0) {
emit transferParamDesc(QDomElement(), 0, 100);
- if (ix < 0) ix = 0;
- ui.effectlist->setCurrentRow(ix);
+ ui.buttonDel->setEnabled(false);
+ ui.buttonSave->setEnabled(false);
+ ui.buttonReset->setEnabled(false);
+ ui.buttonUp->setEnabled(false);
+ ui.buttonDown->setEnabled(false);
+ } else {
+ if (ix < 0) ix = 0;
+ ui.effectlist->setCurrentRow(ix);
+ ui.buttonDel->setEnabled(true);
+ ui.buttonSave->setEnabled(true);
+ ui.buttonReset->setEnabled(true);
+ ui.buttonUp->setEnabled(ix > 0);
+ ui.buttonDown->setEnabled(ix < clipref->effectsCount() - 1);
+ }
}
void EffectStackView::slotItemSelectionChanged() {
bool hasItem = ui.effectlist->currentItem();
int activeRow = ui.effectlist->currentRow();
- bool isChecked = ui.effectlist->currentItem()->checkState() == Qt::Checked;
+ bool isChecked = false;
+ if (hasItem && ui.effectlist->currentItem()->checkState() == Qt::Checked) isChecked = true;
if (hasItem && ui.effectlist->currentItem()->isSelected()) {
emit transferParamDesc(clipref->effectAt(activeRow), 0, 100);//minx max frame
}
if (clipref) clipref->setSelectedEffect(activeRow);
ui.buttonDel->setEnabled(hasItem);
+ ui.buttonSave->setEnabled(hasItem);
ui.buttonReset->setEnabled(hasItem && isChecked);
ui.buttonUp->setEnabled(activeRow > 0);
ui.buttonDown->setEnabled((activeRow < ui.effectlist->count() - 1) && hasItem);
void EffectStackView::slotResetEffect() {
int activeRow = ui.effectlist->currentRow();
+ if (activeRow < 0) return;
QDomElement old = clipref->effectAt(activeRow).cloneNode().toElement();
QDomElement dom;
QString effectName = ui.effectlist->currentItem()->text();
QMap<QString, EffectsList*> effectLists;
EffectStackEdit* effectedit;
void setupListView(int ix);
- void updateButtonStatus();
+ //void updateButtonStatus();
public slots:
void slotClipItemSelected(ClipItem*);
void slotNewEffect();
void slotResetEffect();
void slotItemChanged(QListWidgetItem *item);
+ void slotSaveEffect();
signals:
void transferParamDesc(const QDomElement&, int , int);
void changeEffectState(ClipItem*, int, bool);
/** An effect in stack was moved */
void changeEffectPosition(ClipItem*, int, int);
+ /** an effect was saved, reload list */
+ void reloadEffects();
};
fileList = directory.entryList(QDir::Files);
for (it = fileList.begin() ; it != fileList.end() ; ++it) {
itemName = KUrl(*more + *it).path();
- parseEffectFile(&MainWindow::audioEffects, &MainWindow::videoEffects, itemName, filtersList, producersList);
+ if (itemName.endsWith(".xml"))
+ parseEffectFile(&MainWindow::customEffects, &MainWindow::audioEffects, &MainWindow::videoEffects, itemName, filtersList, producersList);
// kDebug()<<"// FOUND EFFECT FILE: "<<itemName<<endl;
}
}
}
// static
-void initEffects::parseEffectFile(EffectsList *audioEffectList, EffectsList *videoEffectList, QString name, QStringList filtersList, QStringList producersList) {
+void initEffects::parseCustomEffectsFile() {
+ MainWindow::customEffects.clear();
+ QString path = KStandardDirs::locateLocal("data", "kdenlive/effects/", true);
+ QDir directory = QDir(path);
+ QStringList fileList = directory.entryList(QDir::Files);
+ QString itemName;
+ foreach(QString filename, fileList) {
+ itemName = KUrl(path + filename).path();
+ if (itemName.endsWith(".xml")) {
+ QDomDocument doc;
+ QFile file(itemName);
+ doc.setContent(&file, false);
+ file.close();
+ QDomNodeList effects = doc.elementsByTagName("effect");
+ if (effects.count() != 1) {
+ kDebug() << "More than one effect in file " << itemName << ", NOT SUPPORTED YET";
+ } else {
+ QDomElement e = effects.item(0).toElement();
+ MainWindow::customEffects.append(e);
+ }
+ }
+ }
+}
+
+// static
+void initEffects::parseEffectFile(EffectsList *customEffectList, EffectsList *audioEffectList, EffectsList *videoEffectList, QString name, QStringList filtersList, QStringList producersList) {
QDomDocument doc;
QFile file(name);
doc.setContent(&file, false);
+ file.close();
QDomElement documentElement = doc.documentElement();
QDomNodeList effects = doc.elementsByTagName("effect");
QDomNode propsnode = documentElement.elementsByTagName("properties").item(0);
if (!propsnode.isNull()) {
QDomElement propselement = propsnode.toElement();
-// id = propselement.attribute("id", QString::null);
-// effectTag = propselement.attribute("tag", QString::null);
- if (propselement.attribute("type", QString::null) == "audio") isAudioEffect = true;
- //else if (propselement.attribute("type", QString::null) == "custom") type = CUSTOMEFFECT;
- //else type = VIDEOEFFECT;
- }
- if (isAudioEffect) audioEffectList->append(documentElement);
- else videoEffectList->append(documentElement);
+ QString type = propselement.attribute("type", QString::null);
+ if (type == "audio") audioEffectList->append(documentElement);
+ else if (type == "custom") customEffectList->append(documentElement);
+ else videoEffectList->append(documentElement);
+ } else videoEffectList->append(documentElement);
}
/*
//thumbnailer.prepareThumbnailsCall(imagelist);
} else if (name == "composite") {
- paramList.append(quickParameterFill(ret, "Geometry", "geometry", "geometry", "0;0;100;100;100", "0;0;100;100;100", "0;0;100;100;100"));
+ paramList.append(quickParameterFill(ret, "Geometry", "geometry", "geometry", "0;0;100;100;100", "-500;-500;-500;-500;0", "500;500;500;500;100"));
tname.appendChild(ret.createTextNode("Composite"));
QDomDocument ret1;
*/
}
- QString wipetrans = "<ktransition tag=\"composite\" ><name>Wipe</name> <parameter tag=\"geometry\" type=\"wipe\" default=\"-100%,0%:100%x100%;-1=0%,0%:100%x100%\" name=\"geometry\"><name>Direction</name> </parameter><parameter tag=\"reverse\" default=\"0\" type=\"bool\" min=\"0\" name=\"reverse\" max=\"1\" ><name>Reverse Transition</name></parameter></ktransition>";
+ QString wipetrans = "<ktransition tag=\"composite\" ><name>Wipe</name><parameter tag=\"geometry\" type=\"wipe\" default=\"-100%,0%:100%x100%;-1=0%,0%:100%x100%\" name=\"geometry\"><name>Direction</name> </parameter><parameter tag=\"aligned\" default=\"0\" type=\"bool\" name=\"aligned\" ><name>Align</name></parameter></ktransition>";
QDomDocument ret;
ret.setContent(wipetrans);
transitions->append(ret.documentElement());
}
+
QDomElement initEffects::quickParameterFill(QDomDocument & doc, QString name, QString tag, QString type, QString def, QString min, QString max, QString list, QString listdisplaynames, QString factor, QString namedesc, QString format) {
QDomElement parameter = doc.createElement("parameter");
parameter.setAttribute("tag", tag);
static QDomDocument createDescriptionFromMlt(Mlt::Repository* repository, const QString& type, const QString& name);
static void fillTransitionsList(Mlt::Repository *, EffectsList* transitions, QStringList names);
static QDomElement quickParameterFill(QDomDocument & doc, QString name, QString tag, QString type, QString def = QString(), QString min = QString(), QString max = QString(), QString list = QString(), QString listdisplaynames = QString(), QString factor = QString(), QString namedesc = QString(), QString format = QString());
- static void parseEffectFile(EffectsList *audioEffectList, EffectsList *videoEffectList, QString name, QStringList filtersList, QStringList producersList);
+ static void parseEffectFile(EffectsList *customEffectList, EffectsList *audioEffectList, EffectsList *videoEffectList, QString name, QStringList filtersList, QStringList producersList);
+ static void parseCustomEffectsFile();
static char* ladspaEffectString(int ladspaId, QStringList params);
static void ladspaEffectFile(const QString & fname, int ladspaId, QStringList params);
action->setData(name);
audioEffectsMenu->addAction(action);
}
- QMenu *customEffectsMenu = static_cast<QMenu*>(factory()->container("custom_effects_menu", this));
+ m_customEffectsMenu = static_cast<QMenu*>(factory()->container("custom_effects_menu", this));
effects = customEffects.effectNames();
foreach(const QString &name, effects) {
action = new QAction(name, this);
action->setData(name);
- customEffectsMenu->addAction(action);
+ m_customEffectsMenu->addAction(action);
}
QMenu *viewMenu = static_cast<QMenu*>(factory()->container("dockwindows", this));
connect(videoEffectsMenu, SIGNAL(triggered(QAction *)), this, SLOT(slotAddVideoEffect(QAction *)));
connect(audioEffectsMenu, SIGNAL(triggered(QAction *)), this, SLOT(slotAddAudioEffect(QAction *)));
- connect(customEffectsMenu, SIGNAL(triggered(QAction *)), this, SLOT(slotAddCustomEffect(QAction *)));
+ connect(m_customEffectsMenu, SIGNAL(triggered(QAction *)), this, SLOT(slotAddCustomEffect(QAction *)));
m_timelineContextMenu = new QMenu(this);
m_timelineContextClipMenu = new QMenu(this);
m_timelineContextClipMenu->addMenu(transitionsMenu);
m_timelineContextClipMenu->addMenu(videoEffectsMenu);
m_timelineContextClipMenu->addMenu(audioEffectsMenu);
- m_timelineContextClipMenu->addMenu(customEffectsMenu);
+ m_timelineContextClipMenu->addMenu(m_customEffectsMenu);
m_timelineContextTransitionMenu->addAction(actionCollection()->action("delete_timeline_clip"));
m_timelineContextTransitionMenu->addAction(actionCollection()->action(KStandardAction::name(KStandardAction::Copy)));
//connect(m_monitorManager, SIGNAL(connectMonitors()), this, SLOT(slotConnectMonitors()));
connect(m_monitorManager, SIGNAL(raiseClipMonitor(bool)), this, SLOT(slotRaiseMonitor(bool)));
connect(m_effectList, SIGNAL(addEffect(QDomElement)), this, SLOT(slotAddEffect(QDomElement)));
+ connect(m_effectList, SIGNAL(reloadEffects()), this, SLOT(slotReloadEffects()));
+
m_monitorManager->initMonitors(m_clipMonitor, m_projectMonitor);
slotConnectMonitors();
openFile(KUrl(Lastproject));
}
+void MainWindow::slotReloadEffects() {
+ initEffects::parseCustomEffectsFile();
+ m_customEffectsMenu->clear();
+ QStringList effects = customEffects.effectNames();
+ QAction *action;
+ foreach(const QString &name, effects) {
+ action = new QAction(name, this);
+ action->setData(name);
+ m_customEffectsMenu->addAction(action);
+ }
+ m_effectList->reloadEffectList();
+}
+
void MainWindow::activateShuttleDevice() {
if (m_jogProcess) delete m_jogProcess;
m_jogProcess = NULL;
disconnect(effectStack, SIGNAL(changeEffectState(ClipItem*, int, bool)), m_activeTimeline->projectView(), SLOT(slotChangeEffectState(ClipItem*, int, bool)));
disconnect(effectStack, SIGNAL(changeEffectPosition(ClipItem*, int, int)), trackView->projectView(), SLOT(slotChangeEffectPosition(ClipItem*, int, int)));
disconnect(effectStack, SIGNAL(refreshEffectStack(ClipItem*)), m_activeTimeline->projectView(), SLOT(slotRefreshEffects(ClipItem*)));
+ disconnect(effectStack, SIGNAL(reloadEffects()), this, SLOT(slotReloadEffects()));
disconnect(transitionConfig, SIGNAL(transitionUpdated(Transition *, QDomElement)), trackView->projectView() , SLOT(slotTransitionUpdated(Transition *, QDomElement)));
disconnect(m_activeTimeline->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(activateMonitor()));
}
connect(effectStack, SIGNAL(changeEffectPosition(ClipItem*, int, int)), trackView->projectView(), SLOT(slotChangeEffectPosition(ClipItem*, int, int)));
connect(effectStack, SIGNAL(refreshEffectStack(ClipItem*)), trackView->projectView(), SLOT(slotRefreshEffects(ClipItem*)));
connect(transitionConfig, SIGNAL(transitionUpdated(Transition *, QDomElement)), trackView->projectView() , SLOT(slotTransitionUpdated(Transition *, QDomElement)));
+ connect(effectStack, SIGNAL(reloadEffects()), this, SLOT(slotReloadEffects()));
+
connect(trackView->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(activateMonitor()));
trackView->projectView()->setContextMenu(m_timelineContextMenu, m_timelineContextClipMenu, m_timelineContextTransitionMenu);
m_activeTimeline = trackView;
QDockWidget *overviewDock;
CustomTrackView *m_overView;
+ QMenu *m_customEffectsMenu;
QMenu *m_timelineContextMenu;
QMenu *m_timelineContextClipMenu;
QMenu *m_timelineContextTransitionMenu;
void slotCopy();
void slotPaste();
void slotPasteEffects();
+ void slotReloadEffects();
+
};
}
// get effect standard tags
- QDomElement clipeffect = MainWindow::videoEffects.getEffectByTag(effecttag, effectid);
+ QDomElement clipeffect = MainWindow::customEffects.getEffectByTag(QString(), effectid);
+ if (clipeffect.isNull()) clipeffect = MainWindow::videoEffects.getEffectByTag(effecttag, effectid);
if (clipeffect.isNull()) clipeffect = MainWindow::audioEffects.getEffectByTag(effecttag, effectid);
- if (clipeffect.isNull()) clipeffect = MainWindow::customEffects.getEffectByTag(effecttag, effectid);
+
clipeffect.setAttribute("kdenlive_ix", effectindex);
QDomNodeList clipeffectparams = clipeffect.childNodes();