]> git.sesse.net Git - kdenlive/blobdiff - src/effectstack/parametercontainer.cpp
Integrate with the required MLT hooks for getting Movit to work.
[kdenlive] / src / effectstack / parametercontainer.cpp
index 8bd9f709c374dda5f5f6eff70d7bf98841dbb559..e1e12c4a984763415f7ba9f222b70682b1fa0eb5 100644 (file)
 #include "complexparameter.h"
 #include "geometryval.h"
 #include "positionedit.h"
-#include "kis_curve_widget.h"
+#include "widgets/kis_curve_widget.h"
 #include "kis_cubic_curve.h"
-#include "choosecolorwidget.h"
-#include "geometrywidget.h"
+#include "widgets/choosecolorwidget.h"
+#include "widgets/geometrywidget.h"
 #include "colortools.h"
-#include "doubleparameterwidget.h"
-#include "cornerswidget.h"
+#include "widgets/doubleparameterwidget.h"
+#include "widgets/cornerswidget.h"
 #include "dragvalue.h"
 #include "beziercurve/beziersplinewidget.h"
 #ifdef USE_QJSON
@@ -43,6 +43,7 @@
 #include "projectlist.h"
 #include "mainwindow.h"
 #include "parametercontainer.h"
+#include "../customtrackview.h"
 
 #include <KUrlRequester>
 #include <KFileDialog>
@@ -94,7 +95,7 @@ class Fontval: public QWidget, public Ui::Fontval_UI
 };
 
 
-ParameterContainer::ParameterContainer(QDomElement effect, ItemInfo info, EffectMetaInfo *metaInfo, QWidget * parent) :
+ParameterContainer::ParameterContainer(const QDomElement &effect, const ItemInfo &info, EffectMetaInfo *metaInfo, QWidget * parent) :
         m_keyframeEditor(NULL),
         m_geometryWidget(NULL),
         m_metaInfo(metaInfo),
@@ -120,7 +121,7 @@ ParameterContainer::ParameterContainer(QDomElement effect, ItemInfo info, Effect
     m_vbox->setContentsMargins(4, 0, 4, 0);
     m_vbox->setSpacing(2);
 
-    for (int i = 0; i < namenode.count() ; i++) {
+    for (int i = 0; i < namenode.count() ; ++i) {
         QDomElement pa = namenode.item(i).toElement();
         if (pa.tagName() != "parameter") continue;
         QDomElement na = pa.firstChildElement("name");
@@ -175,7 +176,7 @@ ParameterContainer::ParameterContainer(QDomElement effect, ItemInfo info, Effect
             if (listitemsdisplay.count() != listitems.count())
                 listitemsdisplay = listitems;
             lsval->list->setIconSize(QSize(30, 30));
-            for (int i = 0; i < listitems.count(); i++) {
+            for (int i = 0; i < listitems.count(); ++i) {
                 lsval->list->addItem(listitemsdisplay.at(i), listitems.at(i));
                 QString entry = listitems.at(i);
                 if (!entry.isEmpty() && (entry.endsWith(".png") || entry.endsWith(".pgm"))) {
@@ -188,6 +189,7 @@ ParameterContainer::ParameterContainer(QDomElement effect, ItemInfo info, Effect
             }
             if (!value.isEmpty()) lsval->list->setCurrentIndex(listitems.indexOf(value));
             lsval->name->setText(paramName);
+           lsval->setToolTip(comment);
             lsval->labelComment->setText(comment);
             lsval->widgetComment->setHidden(true);
             m_valueItems[paramName] = lsval;
@@ -200,6 +202,7 @@ ParameterContainer::ParameterContainer(QDomElement effect, ItemInfo info, Effect
             bval->setupUi(toFillin);
             bval->checkBox->setCheckState(value == "0" ? Qt::Unchecked : Qt::Checked);
             bval->name->setText(paramName);
+           bval->name->setToolTip(comment);
             bval->labelComment->setText(comment);
             bval->widgetComment->setHidden(true);
             m_valueItems[paramName] = bval;
@@ -219,18 +222,23 @@ ParameterContainer::ParameterContainer(QDomElement effect, ItemInfo info, Effect
                 m_geometryWidget = new GeometryWidget(m_metaInfo->monitor, m_metaInfo->timecode, 0, true, effect.hasAttribute("showrotation"), parent);
                 m_geometryWidget->setFrameSize(m_metaInfo->frameSize);
                 connect(m_geometryWidget, SIGNAL(parameterChanged()), this, SLOT(slotCollectAllParameters()));
-                if (minFrame == maxFrame)
+                if (minFrame == maxFrame) {
                     m_geometryWidget->setupParam(pa, m_in, m_out);
+                   connect(this, SIGNAL(updateRange(int,int)), m_geometryWidget, SLOT(slotUpdateRange(int,int)));
+               }
                 else
                     m_geometryWidget->setupParam(pa, minFrame, maxFrame);
                 m_vbox->addWidget(m_geometryWidget);
                 m_valueItems[paramName+"geometry"] = m_geometryWidget;
                 connect(m_geometryWidget, SIGNAL(seekToPos(int)), this, SIGNAL(seekTimeline(int)));
+               connect(m_geometryWidget, SIGNAL(importClipKeyframes()), this, SIGNAL(importClipKeyframes()));
                 connect(this, SIGNAL(syncEffectsPos(int)), m_geometryWidget, SLOT(slotSyncPosition(int)));
             } else {
                 Geometryval *geo = new Geometryval(m_metaInfo->profile, m_metaInfo->timecode, m_metaInfo->frameSize, 0);
-                if (minFrame == maxFrame)
+                if (minFrame == maxFrame) {
                     geo->setupParam(pa, m_in, m_out);
+                   connect(this, SIGNAL(updateRange(int,int)), geo, SLOT(slotUpdateRange(int,int)));
+               }
                 else
                     geo->setupParam(pa, minFrame, maxFrame);
                 m_vbox->addWidget(geo);
@@ -249,11 +257,13 @@ ParameterContainer::ParameterContainer(QDomElement effect, ItemInfo info, Effect
                 if (pa.attribute("widget") == "corners") {
                     // we want a corners-keyframe-widget
                     CornersWidget *corners = new CornersWidget(m_metaInfo->monitor, pa, m_in, m_out, m_metaInfo->timecode, e.attribute("active_keyframe", "-1").toInt(), parent);
+                   connect(this, SIGNAL(updateRange(int,int)), corners, SLOT(slotUpdateRange(int,int)));
                    m_needsMonitorEffectScene = true;
                     connect(this, SIGNAL(syncEffectsPos(int)), corners, SLOT(slotSyncPosition(int)));
                     geo = static_cast<KeyframeEdit *>(corners);
                 } else {
                     geo = new KeyframeEdit(pa, m_in, m_out, m_metaInfo->timecode, e.attribute("active_keyframe", "-1").toInt());
+                   connect(this, SIGNAL(updateRange(int,int)), geo, SLOT(slotUpdateRange(int,int)));
                 }
                 m_vbox->addWidget(geo);
                 m_valueItems[paramName+"keyframe"] = geo;
@@ -270,9 +280,10 @@ ParameterContainer::ParameterContainer(QDomElement effect, ItemInfo info, Effect
             if (value.startsWith('#'))
                 value = value.replace('#', "0x");
             ChooseColorWidget *choosecolor = new ChooseColorWidget(paramName, value, pa.hasAttribute("alpha"), parent);
+           choosecolor->setToolTip(comment);
             m_vbox->addWidget(choosecolor);
             m_valueItems[paramName] = choosecolor;
-            connect(choosecolor, SIGNAL(displayMessage(const QString&, int)), this, SIGNAL(displayMessage(const QString&, int)));
+            connect(choosecolor, SIGNAL(displayMessage(QString,int)), this, SIGNAL(displayMessage(QString,int)));
             connect(choosecolor, SIGNAL(modified()) , this, SLOT(slotCollectAllParameters()));
            connect(choosecolor, SIGNAL(disableCurrentFilter(bool)) , this, SIGNAL(disableCurrentFilter(bool)));
         } else if (type == "position") {
@@ -284,6 +295,8 @@ ParameterContainer::ParameterContainer(QDomElement effect, ItemInfo info, Effect
                 pos = m_out - pos;
             }
             PositionEdit *posedit = new PositionEdit(paramName, pos, 0, m_out - m_in, m_metaInfo->timecode);
+           posedit->setToolTip(comment);
+           connect(this, SIGNAL(updateRange(int,int)), posedit, SLOT(setRange(int,int)));
             m_vbox->addWidget(posedit);
             m_valueItems[paramName+"position"] = posedit;
             connect(posedit, SIGNAL(parameterChanged()), this, SLOT(slotCollectAllParameters()));
@@ -403,17 +416,19 @@ ParameterContainer::ParameterContainer(QDomElement effect, ItemInfo info, Effect
             Urlval *cval = new Urlval;
             cval->setupUi(toFillin);
             cval->label->setText(paramName);
+           cval->setToolTip(comment);
             cval->urlwidget->fileDialog()->setFilter(ProjectList::getExtensions());
             m_valueItems[paramName] = cval;
             cval->urlwidget->setUrl(KUrl(value));
             connect(cval->urlwidget, SIGNAL(returnPressed()) , this, SLOT(slotCollectAllParameters()));
-            connect(cval->urlwidget, SIGNAL(urlSelected(const KUrl&)) , this, SLOT(slotCollectAllParameters()));
+            connect(cval->urlwidget, SIGNAL(urlSelected(KUrl)) , this, SLOT(slotCollectAllParameters()));
             m_uiItems.append(cval);
        } else if (type == "keywords") {
             Keywordval* kval = new Keywordval;
             kval->setupUi(toFillin);
             kval->label->setText(paramName);
             kval->lineeditwidget->setText(value);
+           kval->setToolTip(comment);
             QDomElement klistelem = pa.firstChildElement("keywords");
             QDomElement kdisplaylistelem = pa.firstChildElement("keywordsdisplay");
             QStringList keywordlist;
@@ -425,7 +440,7 @@ ParameterContainer::ParameterContainer(QDomElement effect, ItemInfo info, Effect
             if (keyworddisplaylist.count() != keywordlist.count()) {
                 keyworddisplaylist = keywordlist;
             }
-            for (int i = 0; i < keywordlist.count(); i++) {
+            for (int i = 0; i < keywordlist.count(); ++i) {
                 kval->comboboxwidget->addItem(keyworddisplaylist.at(i), keywordlist.at(i));
             }
             // Add disabled user prompt at index 0
@@ -433,8 +448,8 @@ ParameterContainer::ParameterContainer(QDomElement effect, ItemInfo info, Effect
             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()));
+            connect(kval->lineeditwidget, SIGNAL(editingFinished()) , this, SLOT(slotCollectAllParameters()));
+            connect(kval->comboboxwidget, SIGNAL(activated(QString)), this, SLOT(slotCollectAllParameters()));
             m_uiItems.append(kval);
         } else if (type == "fontfamily") {
             Fontval* fval = new Fontval;
@@ -442,7 +457,7 @@ ParameterContainer::ParameterContainer(QDomElement effect, ItemInfo info, Effect
             fval->name->setText(paramName);
             fval->fontfamilywidget->setCurrentFont(QFont(value));
             m_valueItems[paramName] = fval;
-            connect(fval->fontfamilywidget, SIGNAL(currentFontChanged(const QFont &)), this, SLOT(collectAllParameters())) ;
+            connect(fval->fontfamilywidget, SIGNAL(currentFontChanged(QFont)), this, SLOT(slotCollectAllParameters())) ;
             m_uiItems.append(fval);
         } else if (type == "filterjob") {
            QVBoxLayout *l= new QVBoxLayout(toFillin);
@@ -468,10 +483,10 @@ ParameterContainer::ParameterContainer(QDomElement effect, ItemInfo info, Effect
     // Make sure all doubleparam spinboxes have the same width, looks much better
     QList<DoubleParameterWidget *> allWidgets = findChildren<DoubleParameterWidget *>();
     int minSize = 0;
-    for (int i = 0; i < allWidgets.count(); i++) {
+    for (int i = 0; i < allWidgets.count(); ++i) {
         if (minSize < allWidgets.at(i)->spinSize()) minSize = allWidgets.at(i)->spinSize();
     }
-    for (int i = 0; i < allWidgets.count(); i++) {
+    for (int i = 0; i < allWidgets.count(); ++i) {
         allWidgets.at(i)->setSpinSize(minSize);
     }
 }
@@ -482,12 +497,12 @@ ParameterContainer::~ParameterContainer()
     delete m_vbox;
 }
 
-void ParameterContainer::meetDependency(const QString& name, QString type, QString value)
+void ParameterContainer::meetDependency(const QString& name, const QString &type, const QString &value)
 {
     if (type == "curve") {
         KisCurveWidget *curve = (KisCurveWidget*)m_valueItems[name];
         if (curve) {
-            int color = value.toInt();
+            const int color = value.toInt();
             curve->setPixmap(QPixmap::fromImage(ColorTools::rgbCurvePlane(curve->size(), (ColorTools::ColorsRGB)(color == 3 ? 4 : color), 0.8)));
         }
     } else if (type == "bezier_spline") {
@@ -546,7 +561,7 @@ void ParameterContainer::updateTimecodeFormat()
         m_keyframeEditor->updateTimecodeFormat();
 
     QDomNodeList namenode = m_effect.elementsByTagName("parameter");
-    for (int i = 0; i < namenode.count() ; i++) {
+    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();
@@ -582,7 +597,7 @@ void ParameterContainer::slotCollectAllParameters()
     //QDomElement newparam = oldparam.cloneNode().toElement();
     QDomNodeList namenode = m_effect.elementsByTagName("parameter");
 
-    for (int i = 0; i < namenode.count() ; i++) {
+    for (int i = 0; i < namenode.count() ; ++i) {
         QDomElement pa = namenode.item(i).toElement();
         QDomElement na = pa.firstChildElement("name");
         QString type = pa.attribute("type");
@@ -625,7 +640,7 @@ void ParameterContainer::slotCollectAllParameters()
                 namenode.item(i).toElement().setAttribute("value", geom->getValue());
             }
         } else if (type == "addedgeometry") {
-            namenode.item(i).toElement().setAttribute("value", m_geometryWidget->getExtraValue(namenode.item(i).toElement().attribute("name")));
+            if (m_geometryWidget) namenode.item(i).toElement().setAttribute("value", m_geometryWidget->getExtraValue(namenode.item(i).toElement().attribute("name")));
         } else if (type == "position") {
             PositionEdit *pedit = ((PositionEdit*)m_valueItems.value(paramName));
             int pos = pedit->getPosition();
@@ -725,7 +740,7 @@ void ParameterContainer::slotCollectAllParameters()
                 pa.setAttribute("intimeline", "1");
            }
             else if (pa.hasAttribute("intimeline"))
-                pa.removeAttribute("intimeline");
+                pa.setAttribute("intimeline", "0");
         } else if (type == "url") {
             KUrlRequester *req = ((Urlval*)m_valueItems.value(paramName))->urlwidget;
             setValue = req->url().path();
@@ -803,23 +818,33 @@ void ParameterContainer::updateParameter(const QString &key, const QString &valu
 void ParameterContainer::slotStartFilterJobAction()
 {
     QDomNodeList namenode = m_effect.elementsByTagName("parameter");
-    for (int i = 0; i < namenode.count() ; i++) {
+    for (int i = 0; i < namenode.count() ; ++i) {
         QDomElement pa = namenode.item(i).toElement();
         QString type = pa.attribute("type");
         if (type == "filterjob") {
-           QString filtertag = pa.attribute("filtertag");
-           if (filtertag.contains("%geometry")) {
+           QString filterparams = pa.attribute("filterparams");
+           if (filterparams.contains("%position")) {
+               if (m_geometryWidget) filterparams.replace("%position", QString::number(m_geometryWidget->currentPosition()));
+           }
+           if (filterparams.contains("%params")) {
                // Replace with current geometry
-               if (m_geometryWidget) {
-                   QString data = m_geometryWidget->getValue();
-                   filtertag.replace("%geometry", data);
-                   kDebug()<<"// Setting geometry: "<<data<<", RES: "<<filtertag;
-               }
+               EffectsParameterList parameters;
+               QDomNodeList params = m_effect.elementsByTagName("parameter");
+               CustomTrackView::adjustEffectParameters(parameters, params, m_metaInfo->profile);
+               QString paramData;
+               for (int j = 0; j < parameters.count(); j++)
+                   paramData.append(parameters.at(j).name()+"="+parameters.at(j).value()+" ");
+               filterparams.replace("%params", paramData);
            }
-           QStringList extra;
-           extra = pa.attribute("extraparams").split(' ', QString::SkipEmptyParts);
-            emit startFilterJob(filtertag, pa.attribute("filterparams"), pa.attribute("finalfilter"), pa.attribute("consumer"), pa.attribute("consumerparams"), pa.attribute("wantedproperties"), extra);
-            kDebug()<<" - - -PROPS:\n"<<"filtertag"<<"-"<< pa.attribute("filterparams")<<"-"<< pa.attribute("consumer")<<"-"<< pa.attribute("consumerparams")<<"-"<< pa.attribute("wantedproperties");
+           QMap <QString, QString> extraParams;
+           QDomNodeList jobparams = pa.elementsByTagName("jobparam");
+           for (int j = 0; j < jobparams.count(); j++) {
+                QDomElement e = jobparams.item(j).toElement();
+               extraParams.insert(e.attribute("name"), e.text().toUtf8());
+           }
+           extraParams.insert("offset", QString::number(m_in));
+            emit startFilterJob(pa.attribute("filtertag"), filterparams, pa.attribute("consumer"), pa.attribute("consumerparams"), extraParams);
+            kDebug()<<" - - -PROPS:\n"<<pa.attribute("filtertag")<<"-"<< filterparams<<"-"<< pa.attribute("consumer")<<"-"<< pa.attribute("consumerparams")<<"-"<< pa.attribute("extraparams");
             break;
         }
     }
@@ -845,3 +870,24 @@ bool ParameterContainer::needsMonitorEffectScene() const
 {
     return m_needsMonitorEffectScene;
 }
+
+void ParameterContainer::setKeyframes(const QString &data, int maximum)
+{
+    if (!m_geometryWidget) {
+       kDebug()<<" / / NO GEOMETRY WIDGET FOUND FOR IMPORTING DATA";
+       return;
+    }
+    m_geometryWidget->importKeyframes(data, maximum);
+    
+}
+
+void ParameterContainer::setRange(int inPoint, int outPoint)
+{
+    m_in = inPoint;
+    m_out = outPoint;
+    emit updateRange(m_in, m_out);
+}
+
+
+
+#include "parametercontainer.moc"