]> git.sesse.net Git - kdenlive/commitdiff
Effects can now be saved
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 19 Jul 2008 23:33:58 +0000 (23:33 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 19 Jul 2008 23:33:58 +0000 (23:33 +0000)
svn path=/branches/KDE4/; revision=2327

13 files changed:
src/customtrackview.cpp
src/effectslist.cpp
src/effectslistview.cpp
src/effectslistview.h
src/effectslistwidget.cpp
src/effectslistwidget.h
src/effectstackview.cpp
src/effectstackview.h
src/initeffects.cpp
src/initeffects.h
src/mainwindow.cpp
src/mainwindow.h
src/trackview.cpp

index dbbd4547f7a49ab56bcda5426b2f0c636c455db8..6b315792132faf896808ac1f21c74e1b00032e23 100644 (file)
@@ -2055,7 +2055,7 @@ void CustomTrackView::pasteClipEffects() {
         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();
@@ -2063,12 +2063,12 @@ void CustomTrackView::pasteClipEffects() {
 
     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);
 }
index 92ea77c33013f3e67d66f02a2299806ff4cfdf9a..91deb31ab5be956eb63065a0c62c48bb2f0a4407 100644 (file)
@@ -56,7 +56,8 @@ QDomElement EffectsList::getEffectByName(const QString & name) const {
             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;
         }
@@ -73,23 +74,25 @@ QDomElement EffectsList::getEffectByTag(const QString & tag, const QString & id)
                 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();
 }
index 9778fcda94109908f0dab0cef71fdf2b771e9204..36a26afdeeffd5680707407a42ef654bf130dc05 100644 (file)
  *   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()));
@@ -87,4 +94,38 @@ KListWidget *EffectsListView::listView() {
     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"
index cc6fc3f03310cfd5d3a62d6ea672b96961e01385..25cf985939f52e0a443c87f9ec77e0f3c2a2cff9 100644 (file)
@@ -37,6 +37,7 @@ class EffectsListView : public QWidget {
 public:
     EffectsListView(QWidget *parent = 0);
     KListWidget *listView();
+    void reloadEffectList();
     //void slotAddEffect(GenTime pos, int track, QString name);
 
 private:
@@ -48,11 +49,13 @@ private slots:
     void slotUpdateInfo();
     void showInfoPanel();
     void slotEffectSelected();
+    void slotRemoveEffect();
 
 public slots:
 
 signals:
     void addEffect(QDomElement);
+    void reloadEffects();
 };
 
 #endif
index 9a821c98121aa199286b46a308b9453916b0bdff..be32d4c2b1515f675b4a3aed0b37ed59c0a1c50c 100644 (file)
@@ -19,6 +19,7 @@
 
 #include "QApplication"
 #include "QMouseEvent"
+#include <QMenu>
 
 #include "KDebug"
 
@@ -30,8 +31,8 @@
 #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);
@@ -157,6 +158,10 @@ void EffectsListWidget::dragMoveEvent(QDragMoveEvent * event) {
     //}
 }
 
-
+//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"
index 92dc14548577bbe599085f7700a38ce5cc98a7e1..8cfcdf00bc1b661fad27e23172c464fc4b233681 100644 (file)
@@ -30,22 +30,23 @@ class EffectsListWidget : public KListWidget {
     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
index 9888d307d88f11a7a1f8174884e980fa5f2c2ba9..36eb1f8afd7f736cad873ea03cae52ec69abee33 100644 (file)
  *                                                                         *
  ***************************************************************************/
 
+#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) {
@@ -41,6 +48,8 @@ EffectStackView::EffectStackView(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"));
 
@@ -53,6 +62,7 @@ EffectStackView::EffectStackView(QWidget *parent)
     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&)));
@@ -64,6 +74,40 @@ EffectStackView::EffectStackView(QWidget *parent)
     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());
@@ -109,21 +153,35 @@ void EffectStackView::setupListView(int ix) {
             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);
@@ -166,6 +224,7 @@ void EffectStackView::slotItemDel() {
 
 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();
index a754d024bf2ece81d29ac850112c9de135695095..7b15c54de37a70c1f6feb1190f76611951bd52ab 100644 (file)
@@ -35,7 +35,7 @@ private:
     QMap<QString, EffectsList*> effectLists;
     EffectStackEdit* effectedit;
     void setupListView(int ix);
-    void updateButtonStatus();
+    //void updateButtonStatus();
 
 public slots:
     void slotClipItemSelected(ClipItem*);
@@ -49,6 +49,7 @@ private slots:
     void slotNewEffect();
     void slotResetEffect();
     void slotItemChanged(QListWidgetItem *item);
+    void slotSaveEffect();
 
 signals:
     void transferParamDesc(const QDomElement&, int , int);
@@ -62,6 +63,8 @@ signals:
     void changeEffectState(ClipItem*, int, bool);
     /** An effect in stack was moved */
     void changeEffectPosition(ClipItem*, int, int);
+    /** an effect was saved, reload list */
+    void reloadEffects();
 
 };
 
index e2ba6872dad1a9b4bcd3e17290443fce17ab0d87..a7fde3134949ff1b170b47b8d46e7953d1de0b69 100644 (file)
@@ -121,7 +121,8 @@ Mlt::Repository *initEffects::parseEffectFiles() {
         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;
         }
     }
@@ -134,10 +135,36 @@ Mlt::Repository *initEffects::parseEffectFiles() {
 }
 
 // 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");
 
@@ -167,14 +194,11 @@ void initEffects::parseEffectFile(EffectsList *audioEffectList, EffectsList *vid
             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);
         }
 
         /*
@@ -521,7 +545,7 @@ void initEffects::fillTransitionsList(Mlt::Repository * repository, EffectsList*
                 //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;
@@ -574,11 +598,12 @@ void initEffects::fillTransitionsList(Mlt::Repository * repository, EffectsList*
         */
     }
 
-    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);
index 026765f36818036089c2fb083f96886eff9a21a9..01b3852de055cf8249b85656fd066f790daf25be 100644 (file)
@@ -51,7 +51,8 @@ public:
     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);
 
index 7899c653dafa4c378c9478baca26bbf58f47921a..d390f31da6e3692d70cbf6a35083d2f5cdd48dd9 100644 (file)
@@ -210,12 +210,12 @@ MainWindow::MainWindow(QWidget *parent)
         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));
@@ -224,7 +224,7 @@ MainWindow::MainWindow(QWidget *parent)
 
     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);
@@ -252,7 +252,7 @@ MainWindow::MainWindow(QWidget *parent)
     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)));
@@ -262,6 +262,8 @@ MainWindow::MainWindow(QWidget *parent)
     //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();
 
@@ -309,6 +311,19 @@ void MainWindow::readProperties(KConfig *config) {
     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;
@@ -1012,6 +1027,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) { //cha
             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()));
         }
@@ -1057,6 +1073,8 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) { //cha
     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;
index d26407083c88b2d1a93ffc90fd85097366d48f9e..7f1f3f52a28670f1025a9f7811397becb86f64a7 100644 (file)
@@ -123,6 +123,7 @@ private:
     QDockWidget *overviewDock;
     CustomTrackView *m_overView;
 
+    QMenu *m_customEffectsMenu;
     QMenu *m_timelineContextMenu;
     QMenu *m_timelineContextClipMenu;
     QMenu *m_timelineContextTransitionMenu;
@@ -229,6 +230,8 @@ private slots:
     void slotCopy();
     void slotPaste();
     void slotPasteEffects();
+    void slotReloadEffects();
+
 };
 
 
index 333d2aacd56bb902fed8a508607303943cb3f9b2..3011964923c46e8fb033b3dda593f1cbee2ef66c 100644 (file)
@@ -370,9 +370,10 @@ int TrackView::slotAddProjectTrack(int ix, QDomElement xml, bool videotrack) {
                         }
 
                         // 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();