]> git.sesse.net Git - kdenlive/blobdiff - src/effectstackedit.cpp
Workaround empty .yml metadata in MLT effects
[kdenlive] / src / effectstackedit.cpp
index 3971fcc8b4b7d79f9b71aca2e04b151ac0c99ba8..6a9ab4dd3267d0db61e65b608874962887ff568a 100644 (file)
@@ -205,14 +205,14 @@ void EffectStackEdit::updateParameter(const QString &name, const QString &value)
     }
 }
 
-void EffectStackEdit::transferParamDesc(const QDomElement d, int pos, int in, int out, bool isEffect)
+void EffectStackEdit::transferParamDesc(const QDomElement d, ItemInfo info, bool isEffect)
 {
     clearAllItems();
     if (m_keyframeEditor) delete m_keyframeEditor;
     m_keyframeEditor = NULL;
     m_params = d;
-    m_in = in;
-    m_out = out;
+    m_in = isEffect ? info.cropStart.frames(KdenliveSettings::project_fps()) : info.startPos.frames(KdenliveSettings::project_fps());
+    m_out = isEffect ? (info.cropStart + info.cropDuration).frames(KdenliveSettings::project_fps()) - 1 : info.endPos.frames(KdenliveSettings::project_fps());
     if (m_params.isNull()) {
 //         kDebug() << "// EMPTY EFFECT STACK";
         return;
@@ -255,36 +255,26 @@ void EffectStackEdit::transferParamDesc(const QDomElement d, int pos, int in, in
         QString value = pa.attribute("value").isNull() ?
                         pa.attribute("default") : pa.attribute("value");
 
-        /** Currently supported parameter types are:
-            * constant (=double): a slider with an integer value (use the "factor" attribute to divide the value so that you can get a double
-            * list: a combobox containing a list of values to choose
-            * bool: a checkbox
-            * complex: designed for keyframe parameters, but old and not finished, do not use
-            * geometry: a rectangle that can be moved & resized, with possible keyframes, used in composite transition
-            * keyframe: a list widget with a list of entries (position and value)
-            * color: a color chooser button
-            * position: a slider representing the position of a frame in the current clip
-            * curve: a single curve representing multiple points
-            * wipe: a widget designed for the wipe transition, allowing to choose a position (left, right, top,...)
-        */
+
+        /** See effects/README for info on the different types */
 
         if (type == "double" || type == "constant") {
-            int min;
-            int max;
+            double min;
+            double max;
             if (pa.attribute("min").startsWith('%'))
-                min = (int) ProfilesDialog::getStringEval(m_profile, pa.attribute("min"));
+                min = ProfilesDialog::getStringEval(m_profile, pa.attribute("min"));
             else
-                min = pa.attribute("min").toInt();
+                min = pa.attribute("min").toDouble();
             if (pa.attribute("max").startsWith('%'))
-                max = (int) ProfilesDialog::getStringEval(m_profile, pa.attribute("max"));
+                max = ProfilesDialog::getStringEval(m_profile, pa.attribute("max"));
             else
-                max = pa.attribute("max").toInt();
+                max = pa.attribute("max").toDouble();
 
-            DoubleParameterWidget *doubleparam = new DoubleParameterWidget(paramName, (int)(value.toDouble() + 0.5), min, max,
-                    pa.attribute("default").toInt(), comment, -1, pa.attribute("suffix"), this);
+            DoubleParameterWidget *doubleparam = new DoubleParameterWidget(paramName, value.toDouble(), min, max,
+                    pa.attribute("default").toDouble(), comment, -1, pa.attribute("suffix"), pa.attribute("decimals").toInt(), this);
             m_vbox->addWidget(doubleparam);
             m_valueItems[paramName] = doubleparam;
-            connect(doubleparam, SIGNAL(valueChanged(int)), this, SLOT(collectAllParameters()));
+            connect(doubleparam, SIGNAL(valueChanged(double)), this, SLOT(collectAllParameters()));
             connect(this, SIGNAL(showComments(bool)), doubleparam, SLOT(slotShowComment(bool)));
         } else if (type == "list") {
             Listval *lsval = new Listval;
@@ -337,7 +327,7 @@ void EffectStackEdit::transferParamDesc(const QDomElement d, int pos, int in, in
             connect(pl, SIGNAL(parameterChanged()), this, SLOT(collectAllParameters()));
         } else if (type == "geometry") {
             if (KdenliveSettings::on_monitor_effects()) {
-                m_geometryWidget = new GeometryWidget(m_monitor, m_timecode, pos, isEffect, m_params.hasAttribute("showrotation"), this);
+                m_geometryWidget = new GeometryWidget(m_monitor, m_timecode, isEffect ? 0 : qMax(0, (int)info.startPos.frames(KdenliveSettings::project_fps())), isEffect, m_params.hasAttribute("showrotation"), this);
                 m_geometryWidget->setFrameSize(m_frameSize);
                 m_geometryWidget->slotShowScene(!disable);
                 // connect this before setupParam to make sure the monitor scene shows up at startup
@@ -353,7 +343,7 @@ void EffectStackEdit::transferParamDesc(const QDomElement d, int pos, int in, in
                 connect(this, SIGNAL(syncEffectsPos(int)), m_geometryWidget, SLOT(slotSyncPosition(int)));
                 connect(this, SIGNAL(effectStateChanged(bool)), m_geometryWidget, SLOT(slotShowScene(bool)));
             } else {
-                Geometryval *geo = new Geometryval(m_profile, m_timecode, m_frameSize, pos);
+                Geometryval *geo = new Geometryval(m_profile, m_timecode, m_frameSize, isEffect ? 0 : qMax(0, (int)info.startPos.frames(KdenliveSettings::project_fps())));
                 if (minFrame == maxFrame)
                     geo->setupParam(pa, m_in, m_out);
                 else
@@ -373,14 +363,14 @@ void EffectStackEdit::transferParamDesc(const QDomElement d, int pos, int in, in
                 KeyframeEdit *geo;
                 if (pa.attribute("widget") == "corners") {
                     // we want a corners-keyframe-widget
-                    CornersWidget *corners = new CornersWidget(m_monitor, pa, m_in, 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, e.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_in + m_out, m_timecode, e.attribute("active_keyframe", "-1").toInt());
+                    geo = new KeyframeEdit(pa, m_in, m_out, m_timecode, e.attribute("active_keyframe", "-1").toInt());
                 }
                 m_vbox->addWidget(geo);
                 m_valueItems[paramName+"keyframe"] = geo;
@@ -456,7 +446,7 @@ void EffectStackEdit::transferParamDesc(const QDomElement d, int pos, int in, in
                 meetDependency(paramName, type, EffectsList::parameter(e, depends));
 #ifdef QJSON
         } else if (type == "roto-spline") {
-            RotoWidget *roto = new RotoWidget(value, m_monitor, m_in, m_out, m_timecode, this);
+            RotoWidget *roto = new RotoWidget(value, m_monitor, info, m_timecode, this);
             roto->slotShowScene(!disable);
             connect(roto, SIGNAL(valueChanged()), this, SLOT(collectAllParameters()));
             connect(roto, SIGNAL(checkMonitorPosition(int)), this, SIGNAL(checkMonitorPosition(int)));