]> git.sesse.net Git - kdenlive/blobdiff - src/effectstackedit.cpp
Merge branch 'master' into audioAlign
[kdenlive] / src / effectstackedit.cpp
index a2d2b5ff1e07e45b81a26514f4d9f8ddee8d6241..8ec639f43889f63e0c1c59df571032e8fbcd6af3 100644 (file)
@@ -20,6 +20,8 @@
 #include "ui_boolval_ui.h"
 #include "ui_wipeval_ui.h"
 #include "ui_urlval_ui.h"
+#include "ui_keywordval_ui.h"
+#include "ui_fontval_ui.h"
 #include "complexparameter.h"
 #include "geometryval.h"
 #include "positionedit.h"
 #include "doubleparameterwidget.h"
 #include "cornerswidget.h"
 #include "beziercurve/beziersplinewidget.h"
-#ifdef QJSON
+#ifdef USE_QJSON
 #include "rotoscoping/rotowidget.h"
 #endif
 
 #include <KDebug>
 #include <KLocale>
 #include <KFileDialog>
-#include <KColorScheme>
 
 #include <QVBoxLayout>
 #include <QLabel>
 #include <QPushButton>
 #include <QCheckBox>
 #include <QScrollArea>
+#include <QScrollBar>
+#include <QProgressBar>
 
 // For QDomNode debugging (output into files); leaving here as sample code.
 //#define DEBUG_ESE
@@ -70,44 +73,39 @@ class Urlval: public QWidget, public Ui::Urlval_UI
 {
 };
 
+class Keywordval: public QWidget, public Ui::Keywordval_UI
+{
+};
+
+class Fontval: public QWidget, public Ui::Fontval_UI
+{
+};
+
 QMap<QString, QImage> EffectStackEdit::iconCache;
 
 EffectStackEdit::EffectStackEdit(Monitor *monitor, QWidget *parent) :
     QScrollArea(parent),
     m_in(0),
     m_out(0),
-    m_frameSize(QPoint()),
     m_keyframeEditor(NULL),
     m_monitor(monitor),
-    m_geometryWidget(NULL)
+    m_geometryWidget(NULL),
+    m_paramWidget(NULL)
 {
     m_baseWidget = new QWidget(this);
-    setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+    m_metaInfo.monitor = monitor;
+    m_metaInfo.trackMode = false;
+    setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
     setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
     setFrameStyle(QFrame::NoFrame);
     setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::MinimumExpanding));
     
-    QPalette p = palette();
-    KColorScheme scheme(p.currentColorGroup(), KColorScheme::View, KSharedConfig::openConfig(KdenliveSettings::colortheme()));
-    QColor dark_bg = scheme.shade(KColorScheme::DarkShade);
-    QColor selected_bg = scheme.decoration(KColorScheme::FocusColor).color();
-    QColor hover_bg = scheme.decoration(KColorScheme::HoverColor).color();    
-    QColor light_bg = scheme.shade(KColorScheme::LightShade);
-    
-    QString stylesheet(QString("QProgressBar:horizontal {border: 1px solid %1;border-radius:0px;border-top-left-radius: 4px;border-bottom-left-radius: 4px;border-right: 0px;background:%4;padding: 0px;text-align:left center}\
-                                QProgressBar:horizontal#dragOnly {background: %1} QProgressBar:horizontal:hover#dragOnly {background: %3} QProgressBar:horizontal:hover {border: 1px solid %3;border-right: 0px;}\
-                                QProgressBar::chunk:horizontal {background: %1;} QProgressBar::chunk:horizontal:hover {background: %3;}\
-                                QProgressBar:horizontal[inTimeline=\"true\"] { border: 1px solid %2;border-right: 0px;background: %4;padding: 0px;text-align:left center } QProgressBar::chunk:horizontal[inTimeline=\"true\"] {background: %2;}\
-                                QAbstractSpinBox#dragBox {border: 1px solid %1;border-top-right-radius: 4px;border-bottom-right-radius: 4px;padding-right:0px;} QAbstractSpinBox::down-button#dragBox {width:0px;padding:0px;}\
-                                QAbstractSpinBox::up-button#dragBox {width:0px;padding:0px;} QAbstractSpinBox[inTimeline=\"true\"]#dragBox { border: 1px solid %2;} QAbstractSpinBox:hover#dragBox {border: 1px solid %3;} ")
-                                .arg(dark_bg.name()).arg(selected_bg.name()).arg(hover_bg.name()).arg(light_bg.name()));
-    setStyleSheet(stylesheet);
-    
-    setWidget(m_baseWidget);
-    setWidgetResizable(true);
-    m_vbox = new QVBoxLayout(m_baseWidget);
+    setStyleSheet(CollapsibleEffect::getStyleSheet());
+    setWidget(m_baseWidget);   
+    /*m_vbox = new QVBoxLayout(m_baseWidget);
     m_vbox->setContentsMargins(0, 0, 0, 0);
-    m_vbox->setSpacing(2);
+    m_vbox->setSpacing(2);    */
+    setWidgetResizable(true);
 }
 
 EffectStackEdit::~EffectStackEdit()
@@ -116,8 +114,21 @@ EffectStackEdit::~EffectStackEdit()
     delete m_baseWidget;
 }
 
+Monitor *EffectStackEdit::monitor()
+{
+    return m_metaInfo.monitor;
+}
+
+void EffectStackEdit::updateProjectFormat(MltVideoProfile profile, Timecode t)
+{
+    m_metaInfo.profile = profile;
+    m_metaInfo.timecode = t;
+}
+
 void EffectStackEdit::setFrameSize(QPoint p)
 {
+    m_metaInfo.frameSize = p;
+    /*
     m_frameSize = p;
     QDomNodeList namenode = m_params.elementsByTagName("parameter");
     for (int i = 0; i < namenode.count() ; i++) {
@@ -137,38 +148,12 @@ void EffectStackEdit::setFrameSize(QPoint p)
                 break;
             }
         }
-    }
+    }*/
 }
 
 void EffectStackEdit::updateTimecodeFormat()
 {
-    if (m_keyframeEditor)
-        m_keyframeEditor->updateTimecodeFormat();
-
-    QDomNodeList namenode = m_params.elementsByTagName("parameter");
-    for (int i = 0; i < namenode.count() ; i++) {
-        QDomNode pa = namenode.item(i);
-        QDomElement na = pa.firstChildElement("name");
-        QString type = pa.attributes().namedItem("type").nodeValue();
-        QString paramName = na.isNull() ? pa.attributes().namedItem("name").nodeValue() : i18n(na.text().toUtf8().data());
-
-        if (type == "geometry") {
-            if (KdenliveSettings::on_monitor_effects()) {
-                if (m_geometryWidget) m_geometryWidget->updateTimecodeFormat();
-            } else {
-                Geometryval *geom = ((Geometryval*)m_valueItems[paramName+"geometry"]);
-                geom->updateTimecodeFormat();
-            }
-            break;
-        } else if (type == "position") {
-            PositionEdit *posi = ((PositionEdit*)m_valueItems[paramName+"position"]);
-            posi->updateTimecodeFormat();
-            break;
-        } else if (type == "roto-spline") {
-            RotoWidget *widget = static_cast<RotoWidget *>(m_valueItems[paramName]);
-            widget->updateTimecodeFormat();
-        }
-    }
+    if (m_paramWidget) m_paramWidget->updateTimecodeFormat();
 }
 
 void EffectStackEdit::meetDependency(const QString& name, QString type, QString value)
@@ -187,12 +172,6 @@ void EffectStackEdit::meetDependency(const QString& name, QString type, QString
     }
 }
 
-void EffectStackEdit::updateProjectFormat(MltVideoProfile profile, Timecode t)
-{
-    m_profile = profile;
-    m_timecode = t;
-}
-
 void EffectStackEdit::updateParameter(const QString &name, const QString &value)
 {
     m_params.setAttribute(name, value);
@@ -205,9 +184,84 @@ void EffectStackEdit::updateParameter(const QString &name, const QString &value)
     }
 }
 
-void EffectStackEdit::transferParamDesc(const QDomElement d, ItemInfo info, bool isEffect)
+bool EffectStackEdit::eventFilter( QObject * o, QEvent * e ) 
+{
+    if (e->type() == QEvent::Wheel) {
+       QWheelEvent *we = static_cast<QWheelEvent *>(e);
+       bool filterWheel = verticalScrollBar() && verticalScrollBar()->isVisible();
+       if (!filterWheel || we->modifiers() != Qt::NoModifier) {
+           e->accept();
+           return false;
+       }
+       if (qobject_cast<QAbstractSpinBox*>(o)) {
+           if(qobject_cast<QAbstractSpinBox*>(o)->focusPolicy() == Qt::WheelFocus)
+           {
+               e->accept();
+               return false;
+           }
+           else
+           {
+               e->ignore();
+               return true;
+           }
+       }
+       if (qobject_cast<KComboBox*>(o)) {
+           if(qobject_cast<KComboBox*>(o)->focusPolicy() == Qt::WheelFocus)
+           {
+               e->accept();
+               return false;
+           }
+           else
+           {
+               e->ignore();
+               return true;
+           }
+       }
+       if (qobject_cast<QProgressBar*>(o)) {
+           if(qobject_cast<QProgressBar*>(o)->focusPolicy() == Qt::WheelFocus)
+           {
+               e->accept();
+               return false;
+           }
+           else
+           {
+               e->ignore();
+               return true;
+           }
+       }
+    }
+    return QWidget::eventFilter(o, e);
+}
+
+void EffectStackEdit::transferParamDesc(const QDomElement &d, ItemInfo info, bool /*isEffect*/)
 {
-    clearAllItems();
+    if (m_paramWidget) delete m_paramWidget;
+    m_paramWidget = new ParameterContainer(d, info, &m_metaInfo, m_baseWidget);
+    connect (m_paramWidget, SIGNAL(parameterChanged(const QDomElement, const QDomElement, int)), this, SIGNAL(parameterChanged(const QDomElement, const QDomElement, int)));
+    
+    connect(m_paramWidget, SIGNAL(startFilterJob(QString,QString,QString,QString,QString,QString)), this, SIGNAL(startFilterJob(QString,QString,QString,QString,QString,QString)));
+    
+    connect (this, SIGNAL(syncEffectsPos(int)), m_paramWidget, SIGNAL(syncEffectsPos(int)));
+    connect (m_paramWidget, SIGNAL(checkMonitorPosition(int)), this, SIGNAL(checkMonitorPosition(int)));
+    connect (m_paramWidget, SIGNAL(seekTimeline(int)), this, SIGNAL(seekTimeline(int)));
+    
+    
+    Q_FOREACH( QSpinBox * sp, m_baseWidget->findChildren<QSpinBox*>() ) {
+        sp->installEventFilter( this );
+        sp->setFocusPolicy( Qt::StrongFocus );
+    }
+    Q_FOREACH( KComboBox * cb, m_baseWidget->findChildren<KComboBox*>() ) {
+       cb->installEventFilter( this );
+        cb->setFocusPolicy( Qt::StrongFocus );
+    }
+    Q_FOREACH( QProgressBar * cb, m_baseWidget->findChildren<QProgressBar*>() ) {
+       cb->installEventFilter( this );
+        cb->setFocusPolicy( Qt::StrongFocus );
+    }
+    
+    return;
+    /*
+    //clearAllItems();
     if (m_keyframeEditor) delete m_keyframeEditor;
     m_keyframeEditor = NULL;
     m_params = d;
@@ -232,9 +286,10 @@ void EffectStackEdit::transferParamDesc(const QDomElement d, ItemInfo info, bool
         }
     }
 #endif
-    QDomElement e = m_params.toElement();
-    const int minFrame = e.attribute("start").toInt();
-    const int maxFrame = e.attribute("end").toInt();
+    int minFrame = d.attribute("start").toInt();
+    int maxFrame = d.attribute("end").toInt();
+    // In transitions, maxFrame is in fact one frame after the end of transition
+    if (maxFrame > 0) maxFrame --;
 
     bool disable = d.attribute("disable") == "1" && KdenliveSettings::disable_effect_parameters();
     setEnabled(!disable);
@@ -251,22 +306,21 @@ void EffectStackEdit::transferParamDesc(const QDomElement d, ItemInfo info, bool
         QString comment;
         if (!commentElem.isNull())
             comment = i18n(commentElem.text().toUtf8().data());
-        QWidget * toFillin = new QWidget(m_baseWidget);
         QString value = pa.attribute("value").isNull() ?
                         pa.attribute("default") : pa.attribute("value");
 
 
-        /** See effects/README for info on the different types */
+      
 
         if (type == "double" || type == "constant") {
             double min;
             double max;
-            if (pa.attribute("min").startsWith('%'))
-                min = ProfilesDialog::getStringEval(m_profile, pa.attribute("min"));
+            if (pa.attribute("min").contains('%'))
+                min = ProfilesDialog::getStringEval(m_profile, pa.attribute("min"), m_frameSize);
             else
                 min = pa.attribute("min").toDouble();
-            if (pa.attribute("max").startsWith('%'))
-                max = ProfilesDialog::getStringEval(m_profile, pa.attribute("max"));
+            if (pa.attribute("max").contains('%'))
+                max = ProfilesDialog::getStringEval(m_profile, pa.attribute("max"), m_frameSize);
             else
                 max = pa.attribute("max").toDouble();
 
@@ -278,12 +332,21 @@ void EffectStackEdit::transferParamDesc(const QDomElement d, ItemInfo info, bool
             connect(this, SIGNAL(showComments(bool)), doubleparam, SLOT(slotShowComment(bool)));
         } else if (type == "list") {
             Listval *lsval = new Listval;
+            QWidget * toFillin = new QWidget(m_baseWidget);
             lsval->setupUi(toFillin);
-            QStringList listitems = pa.attribute("paramlist").split(',');
+            m_vbox->addWidget(toFillin);
+            QStringList listitems = pa.attribute("paramlist").split(';');
+            if (listitems.count() == 1) {
+                // probably custom effect created before change to ';' as separator
+                listitems = pa.attribute("paramlist").split(',');
+            }
             QDomElement list = pa.firstChildElement("paramlistdisplay");
             QStringList listitemsdisplay;
-            if (!list.isNull()) listitemsdisplay = i18n(list.text().toUtf8().data()).split(',');
-            else listitemsdisplay = i18n(pa.attribute("paramlistdisplay").toUtf8().data()).split(',');
+            if (!list.isNull()) {
+                listitemsdisplay = i18n(list.text().toUtf8().data()).split(',');
+            } else {
+                listitemsdisplay = i18n(pa.attribute("paramlistdisplay").toUtf8().data()).split(',');
+            }
             if (listitemsdisplay.count() != listitems.count())
                 listitemsdisplay = listitems;
             lsval->list->setIconSize(QSize(30, 30));
@@ -309,7 +372,9 @@ void EffectStackEdit::transferParamDesc(const QDomElement d, ItemInfo info, bool
             m_uiItems.append(lsval);
         } else if (type == "bool") {
             Boolval *bval = new Boolval;
+            QWidget * toFillin = new QWidget(m_baseWidget);
             bval->setupUi(toFillin);
+            m_vbox->addWidget(toFillin);
             bval->checkBox->setCheckState(value == "0" ? Qt::Unchecked : Qt::Checked);
             bval->name->setText(paramName);
             bval->labelComment->setText(comment);
@@ -363,14 +428,14 @@ void EffectStackEdit::transferParamDesc(const QDomElement d, ItemInfo info, bool
                 KeyframeEdit *geo;
                 if (pa.attribute("widget") == "corners") {
                     // we want a corners-keyframe-widget
-                    CornersWidget *corners = new CornersWidget(m_monitor, pa, m_in, m_out, m_timecode, e.attribute("active_keyframe", "-1").toInt(), this);
+                    CornersWidget *corners = new CornersWidget(m_monitor, pa, m_in, m_out, m_timecode, d.attribute("active_keyframe", "-1").toInt(), this);
                     corners->slotShowScene(!disable);
                     connect(corners, SIGNAL(checkMonitorPosition(int)), this, SIGNAL(checkMonitorPosition(int)));
                     connect(this, SIGNAL(effectStateChanged(bool)), corners, SLOT(slotShowScene(bool)));
                     connect(this, SIGNAL(syncEffectsPos(int)), corners, SLOT(slotSyncPosition(int)));
                     geo = static_cast<KeyframeEdit *>(corners);
                 } else {
-                    geo = new KeyframeEdit(pa, m_in, m_out, m_timecode, e.attribute("active_keyframe", "-1").toInt());
+                    geo = new KeyframeEdit(pa, m_in, m_out, m_timecode, d.attribute("active_keyframe", "-1").toInt());
                 }
                 m_vbox->addWidget(geo);
                 m_valueItems[paramName+"keyframe"] = geo;
@@ -383,10 +448,8 @@ void EffectStackEdit::transferParamDesc(const QDomElement d, ItemInfo info, bool
                 m_keyframeEditor->addParameter(pa);
             }
         } else if (type == "color") {
-            if (value.startsWith('#'))
-                value = value.replace('#', "0x");
-            bool ok;
-            ChooseColorWidget *choosecolor = new ChooseColorWidget(paramName, QColor(value.toUInt(&ok, 16)), this);
+            ChooseColorWidget *choosecolor = new ChooseColorWidget(paramName, value, this);
+            choosecolor->setAlphaChannelEnabled(pa.attribute("alpha") == "1");
             m_vbox->addWidget(choosecolor);
             m_valueItems[paramName] = choosecolor;
             connect(choosecolor, SIGNAL(displayMessage(const QString&, int)), this, SIGNAL(displayMessage(const QString&, int)));
@@ -407,7 +470,12 @@ void EffectStackEdit::transferParamDesc(const QDomElement d, ItemInfo info, bool
             KisCurveWidget *curve = new KisCurveWidget(this);
             curve->setMaxPoints(pa.attribute("max").toInt());
             QList<QPointF> points;
-            int number = EffectsList::parameter(e, pa.attribute("number")).toInt();
+            int number;
+            if (d.attribute("version").toDouble() > 0.2) {
+                number = EffectsList::parameter(d, pa.attribute("number")).toDouble() * 10;
+            } else {
+                number = EffectsList::parameter(d, pa.attribute("number")).toInt();
+            }
             QString inName = pa.attribute("inpoints");
             QString outName = pa.attribute("outpoints");
             int start = pa.attribute("min").toInt();
@@ -416,7 +484,7 @@ void EffectStackEdit::transferParamDesc(const QDomElement d, ItemInfo info, bool
                 in.replace("%i", QString::number(j));
                 QString out = outName;
                 out.replace("%i", QString::number(j));
-                points << QPointF(EffectsList::parameter(e, in).toDouble(), EffectsList::parameter(e, out).toDouble());
+                points << QPointF(EffectsList::parameter(d, in).toDouble(), EffectsList::parameter(d, out).toDouble());
             }
             if (!points.isEmpty())
                 curve->setCurve(KisCubicCurve(points));
@@ -434,7 +502,7 @@ void EffectStackEdit::transferParamDesc(const QDomElement d, ItemInfo info, bool
 
             QString depends = pa.attribute("depends");
             if (!depends.isEmpty())
-                meetDependency(paramName, type, EffectsList::parameter(e, depends));
+                meetDependency(paramName, type, EffectsList::parameter(d, depends));
         } else if (type == "bezier_spline") {
             BezierSplineWidget *widget = new BezierSplineWidget(value, this);
             stretch = false;
@@ -443,8 +511,8 @@ void EffectStackEdit::transferParamDesc(const QDomElement d, ItemInfo info, bool
             connect(widget, SIGNAL(modified()), this, SLOT(collectAllParameters()));
             QString depends = pa.attribute("depends");
             if (!depends.isEmpty())
-                meetDependency(paramName, type, EffectsList::parameter(e, depends));
-#ifdef QJSON
+                meetDependency(paramName, type, EffectsList::parameter(d, depends));
+#ifdef USE_QJSON
         } else if (type == "roto-spline") {
             RotoWidget *roto = new RotoWidget(value, m_monitor, info, m_timecode, this);
             roto->slotShowScene(!disable);
@@ -458,7 +526,9 @@ void EffectStackEdit::transferParamDesc(const QDomElement d, ItemInfo info, bool
 #endif
         } else if (type == "wipe") {
             Wipeval *wpval = new Wipeval;
+            QWidget * toFillin = new QWidget(m_baseWidget);
             wpval->setupUi(toFillin);
+            m_vbox->addWidget(toFillin);
             wipeInfo w = getWipeInfo(value);
             switch (w.start) {
             case UP:
@@ -513,7 +583,9 @@ void EffectStackEdit::transferParamDesc(const QDomElement d, ItemInfo info, bool
             m_uiItems.append(wpval);
         } else if (type == "url") {
             Urlval *cval = new Urlval;
+            QWidget * toFillin = new QWidget(m_baseWidget);
             cval->setupUi(toFillin);
+            m_vbox->addWidget(toFillin);
             cval->label->setText(paramName);
             cval->urlwidget->fileDialog()->setFilter(ProjectList::getExtensions());
             m_valueItems[paramName] = cval;
@@ -521,13 +593,51 @@ void EffectStackEdit::transferParamDesc(const QDomElement d, ItemInfo info, bool
             connect(cval->urlwidget, SIGNAL(returnPressed()) , this, SLOT(collectAllParameters()));
             connect(cval->urlwidget, SIGNAL(urlSelected(const KUrl&)) , this, SLOT(collectAllParameters()));
             m_uiItems.append(cval);
-        } else {
-            delete toFillin;
-            toFillin = NULL;
-        }
-
-        if (toFillin)
+        } else if (type == "keywords") {
+            Keywordval* kval = new Keywordval;
+            QWidget * toFillin = new QWidget(m_baseWidget);
+            kval->setupUi(toFillin);
+            m_vbox->addWidget(toFillin);
+            kval->label->setText(paramName);
+            kval->lineeditwidget->setText(value);
+            QDomElement klistelem = pa.firstChildElement("keywords");
+            QDomElement kdisplaylistelem = pa.firstChildElement("keywordsdisplay");
+            QStringList keywordlist;
+            QStringList keyworddisplaylist;
+            if (!klistelem.isNull()) {
+                keywordlist = klistelem.text().split(';');
+                keyworddisplaylist = i18n(kdisplaylistelem.text().toUtf8().data()).split(';');
+            }
+            if (keyworddisplaylist.count() != keywordlist.count()) {
+                keyworddisplaylist = keywordlist;
+            }
+            for (int i = 0; i < keywordlist.count(); i++) {
+                kval->comboboxwidget->addItem(keyworddisplaylist.at(i), keywordlist.at(i));
+            }
+            // Add disabled user prompt at index 0
+            kval->comboboxwidget->insertItem(0, i18n("<select a keyword>"), "");
+            kval->comboboxwidget->model()->setData( kval->comboboxwidget->model()->index(0,0), QVariant(Qt::NoItemFlags), Qt::UserRole -1);
+            kval->comboboxwidget->setCurrentIndex(0);
+            m_valueItems[paramName] = kval;
+            connect(kval->lineeditwidget, SIGNAL(editingFinished()) , this, SLOT(collectAllParameters()));
+            connect(kval->comboboxwidget, SIGNAL(activated (const QString&)), this, SLOT(collectAllParameters()));
+            m_uiItems.append(kval);
+        } else if (type == "fontfamily") {
+            Fontval* fval = new Fontval;
+            QWidget * toFillin = new QWidget(m_baseWidget);
+            fval->setupUi(toFillin);
             m_vbox->addWidget(toFillin);
+            fval->name->setText(paramName);
+            fval->fontfamilywidget->setCurrentFont(QFont(value));
+            m_valueItems[paramName] = fval;
+            connect(fval->fontfamilywidget, SIGNAL(currentFontChanged(const QFont &)), this, SLOT(collectAllParameters())) ;
+            m_uiItems.append(fval);
+        } else if (type == "filterjob") {
+            QPushButton *button = new QPushButton(paramName, m_baseWidget);
+            m_vbox->addWidget(button);
+            m_valueItems[paramName] = button;
+            connect(button, SIGNAL(pressed()), this, SLOT(slotStartFilterJobAction()));   
+        }
     }
 
     if (stretch)
@@ -544,101 +654,17 @@ void EffectStackEdit::transferParamDesc(const QDomElement d, ItemInfo info, bool
     }
     for (int i = 0; i < allWidgets.count(); i++) {
         allWidgets.at(i)->setSpinSize(minSize);
-    }
-}
-
-wipeInfo EffectStackEdit::getWipeInfo(QString value)
-{
-    wipeInfo info;
-    QString start = value.section(';', 0, 0);
-    QString end = value.section(';', 1, 1).section('=', 1, 1);
-
-    if (start.startsWith("-100%,0"))
-        info.start = LEFT;
-    else if (start.startsWith("100%,0"))
-        info.start = RIGHT;
-    else if (start.startsWith("0%,100%"))
-        info.start = DOWN;
-    else if (start.startsWith("0%,-100%"))
-        info.start = UP;
-    else
-        info.start = CENTER;
-
-    if (start.count(':') == 2)
-        info.startTransparency = start.section(':', -1).toInt();
-    else
-        info.startTransparency = 100;
-
-    if (end.startsWith("-100%,0"))
-        info.end = LEFT;
-    else if (end.startsWith("100%,0"))
-        info.end = RIGHT;
-    else if (end.startsWith("0%,100%"))
-        info.end = DOWN;
-    else if (end.startsWith("0%,-100%"))
-        info.end = UP;
-    else
-        info.end = CENTER;
-
-    if (end.count(':') == 2)
-        info.endTransparency = end.section(':', -1).toInt();
-    else
-        info.endTransparency = 100;
-
-    return info;
-}
-
-QString EffectStackEdit::getWipeString(wipeInfo info)
-{
-
-    QString start;
-    QString end;
-    switch (info.start) {
-    case LEFT:
-        start = "-100%,0%:100%x100%";
-        break;
-    case RIGHT:
-        start = "100%,0%:100%x100%";
-        break;
-    case DOWN:
-        start = "0%,100%:100%x100%";
-        break;
-    case UP:
-        start = "0%,-100%:100%x100%";
-        break;
-    default:
-        start = "0%,0%:100%x100%";
-        break;
-    }
-    start.append(':' + QString::number(info.startTransparency));
-
-    switch (info.end) {
-    case LEFT:
-        end = "-100%,0%:100%x100%";
-        break;
-    case RIGHT:
-        end = "100%,0%:100%x100%";
-        break;
-    case DOWN:
-        end = "0%,100%:100%x100%";
-        break;
-    case UP:
-        end = "0%,-100%:100%x100%";
-        break;
-    default:
-        end = "0%,0%:100%x100%";
-        break;
-    }
-    end.append(':' + QString::number(info.endTransparency));
-    return QString(start + ";-1=" + end);
+    }*/
 }
 
 void EffectStackEdit::collectAllParameters()
 {
+  /*
     if (m_valueItems.isEmpty() || m_params.isNull()) return;
     const QDomElement oldparam = m_params.cloneNode().toElement();
     QDomElement newparam = oldparam.cloneNode().toElement();
     QDomNodeList namenode = newparam.elementsByTagName("parameter");
+    QLocale locale;
 
     for (int i = 0; i < namenode.count() ; i++) {
         QDomNode pa = namenode.item(i);
@@ -661,7 +687,7 @@ void EffectStackEdit::collectAllParameters()
         QString setValue;
         if (type == "double" || type == "constant") {
             DoubleParameterWidget *doubleparam = (DoubleParameterWidget*)m_valueItems.value(paramName);
-            setValue = QString::number(doubleparam->getValue());
+            setValue = locale.toString(doubleparam->getValue());
         } else if (type == "list") {
             KComboBox *box = ((Listval*)m_valueItems.value(paramName))->list;
             setValue = box->itemData(box->currentIndex()).toString();
@@ -670,7 +696,7 @@ void EffectStackEdit::collectAllParameters()
             setValue = box->checkState() == Qt::Checked ? "1" : "0" ;
         } else if (type == "color") {
             ChooseColorWidget *choosecolor = ((ChooseColorWidget*)m_valueItems.value(paramName));
-            setValue = choosecolor->getColor().name();
+            setValue = choosecolor->getColor();
         } else if (type == "complex") {
             ComplexParameter *complex = ((ComplexParameter*)m_valueItems.value(paramName));
             namenode.item(i) = complex->getParamDesc();
@@ -689,19 +715,13 @@ void EffectStackEdit::collectAllParameters()
             setValue = QString::number(pos);
             if (newparam.attribute("id") == "fadein" || newparam.attribute("id") == "fade_from_black") {
                 // Make sure duration is not longer than clip
-                /*if (pos > m_out) {
-                    pos = m_out;
-                    pedit->setPosition(pos);
-                }*/
+
                 EffectsList::setParameter(newparam, "in", QString::number(m_in));
                 EffectsList::setParameter(newparam, "out", QString::number(m_in + pos));
                 setValue.clear();
             } else if (newparam.attribute("id") == "fadeout" || newparam.attribute("id") == "fade_to_black") {
                 // Make sure duration is not longer than clip
-                /*if (pos > m_out) {
-                    pos = m_out;
-                    pedit->setPosition(pos);
-                }*/
+
                 EffectsList::setParameter(newparam, "in", QString::number(m_out - pos));
                 EffectsList::setParameter(newparam, "out", QString::number(m_out));
                 setValue.clear();
@@ -714,14 +734,18 @@ void EffectStackEdit::collectAllParameters()
             QString outName = pa.attributes().namedItem("outpoints").nodeValue();
             int off = pa.attributes().namedItem("min").nodeValue().toInt();
             int end = pa.attributes().namedItem("max").nodeValue().toInt();
-            EffectsList::setParameter(newparam, number, QString::number(points.count()));
+            if (oldparam.attribute("version").toDouble() > 0.2) {
+                EffectsList::setParameter(newparam, number, locale.toString(points.count() / 10.));
+            } else {
+                EffectsList::setParameter(newparam, number, QString::number(points.count()));
+            }
             for (int j = 0; (j < points.count() && j + off <= end); j++) {
                 QString in = inName;
                 in.replace("%i", QString::number(j + off));
                 QString out = outName;
                 out.replace("%i", QString::number(j + off));
-                EffectsList::setParameter(newparam, in, QString::number(points.at(j).x()));
-                EffectsList::setParameter(newparam, out, QString::number(points.at(j).y()));
+                EffectsList::setParameter(newparam, in, locale.toString(points.at(j).x()));
+                EffectsList::setParameter(newparam, out, locale.toString(points.at(j).y()));
             }
             QString depends = pa.attributes().namedItem("depends").nodeValue();
             if (!depends.isEmpty())
@@ -732,7 +756,7 @@ void EffectStackEdit::collectAllParameters()
             QString depends = pa.attributes().namedItem("depends").nodeValue();
             if (!depends.isEmpty())
                 meetDependency(paramName, type, EffectsList::parameter(newparam, depends));
-#ifdef QJSON
+#ifdef USE_QJSON
         } else if (type == "roto-spline") {
             RotoWidget *widget = static_cast<RotoWidget *>(m_valueItems.value(paramName));
             setValue = widget->getSpline();
@@ -782,13 +806,26 @@ void EffectStackEdit::collectAllParameters()
         } else if (type == "url") {
             KUrlRequester *req = ((Urlval*)m_valueItems.value(paramName))->urlwidget;
             setValue = req->url().path();
+        } else if (type == "keywords"){
+            QLineEdit *line = ((Keywordval*)m_valueItems.value(paramName))->lineeditwidget;
+            QComboBox *combo = ((Keywordval*)m_valueItems.value(paramName))->comboboxwidget;
+            if(combo->currentIndex())
+            {
+                QString comboval = combo->itemData(combo->currentIndex()).toString();
+                line->insert(comboval);
+                combo->setCurrentIndex(0);
+            }
+            setValue = line->text();
+        } else if (type == "fontfamily") {
+            QFontComboBox* fontfamily = ((Fontval*)m_valueItems.value(paramName))->fontfamilywidget;
+            setValue = fontfamily->currentFont().family();
         }
 
         if (!setValue.isNull())
             pa.attributes().namedItem("value").setNodeValue(setValue);
 
     }
-    emit parameterChanged(oldparam, newparam);
+    emit parameterChanged(oldparam, newparam);*/
 }
 
 void EffectStackEdit::clearAllItems()
@@ -817,3 +854,19 @@ void EffectStackEdit::slotSyncEffectsPos(int pos)
 {
     emit syncEffectsPos(pos);
 }
+
+void EffectStackEdit::slotStartFilterJobAction()
+{
+    QDomNodeList namenode = m_params.elementsByTagName("parameter");
+    for (int i = 0; i < namenode.count() ; i++) {
+        QDomElement pa = namenode.item(i).toElement();
+        QString type = pa.attribute("type");
+        if (type == "filterjob") {
+            emit startFilterJob(pa.attribute("filtertag"), pa.attribute("filterparams"), pa.attribute("finalfilter"), pa.attribute("consumer"), pa.attribute("consumerparams"), pa.attribute("wantedproperties"));
+            kDebug()<<" - - -PROPS:\n"<<pa.attribute("filtertag")<<"-"<< pa.attribute("filterparams")<<"-"<< pa.attribute("consumer")<<"-"<< pa.attribute("consumerparams")<<"-"<< pa.attribute("wantedproperties");
+            break;
+        }
+    }
+}
+
+