- }
-#endif
- 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);
-
- bool stretch = true;
-
-
- for (int i = 0; i < namenode.count() ; i++) {
- QDomElement pa = namenode.item(i).toElement();
- QDomElement na = pa.firstChildElement("name");
- QDomElement commentElem = pa.firstChildElement("comment");
- QString type = pa.attribute("type");
- QString paramName = na.isNull() ? pa.attribute("name") : i18n(na.text().toUtf8().data());
- QString comment;
- if (!commentElem.isNull())
- comment = i18n(commentElem.text().toUtf8().data());
- QString value = pa.attribute("value").isNull() ?
- pa.attribute("default") : pa.attribute("value");
-
-
-
-
- if (type == "double" || type == "constant") {
- double min;
- double max;
- 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").contains('%'))
- max = ProfilesDialog::getStringEval(m_profile, pa.attribute("max"), m_frameSize);
- else
- max = pa.attribute("max").toDouble();
-
- 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(double)), this, SLOT(collectAllParameters()));
- 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);
- 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 (listitemsdisplay.count() != listitems.count())
- listitemsdisplay = listitems;
- lsval->list->setIconSize(QSize(30, 30));
- 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"))) {
- if (!EffectStackEdit::iconCache.contains(entry)) {
- QImage pix(entry);
- EffectStackEdit::iconCache[entry] = pix.scaled(30, 30);
- }
- lsval->list->setItemIcon(i, QPixmap::fromImage(iconCache[entry]));
- }
- }
- if (!value.isEmpty()) lsval->list->setCurrentIndex(listitems.indexOf(value));
- lsval->name->setText(paramName);
- lsval->labelComment->setText(comment);
- lsval->widgetComment->setHidden(true);
- m_valueItems[paramName] = lsval;
- connect(lsval->list, SIGNAL(currentIndexChanged(int)) , this, SLOT(collectAllParameters()));
- if (!comment.isEmpty())
- connect(this, SIGNAL(showComments(bool)), lsval->widgetComment, SLOT(setVisible(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);
- bval->widgetComment->setHidden(true);
- m_valueItems[paramName] = bval;
- connect(bval->checkBox, SIGNAL(stateChanged(int)) , this, SLOT(collectAllParameters()));
- if (!comment.isEmpty())
- connect(this, SIGNAL(showComments(bool)), bval->widgetComment, SLOT(setVisible(bool)));
- m_uiItems.append(bval);
- } else if (type == "complex") {
- ComplexParameter *pl = new ComplexParameter;
- pl->setupParam(d, pa.attribute("name"), 0, 100);
- m_vbox->addWidget(pl);
- m_valueItems[paramName+"complex"] = pl;
- connect(pl, SIGNAL(parameterChanged()), this, SLOT(collectAllParameters()));
- } else if (type == "geometry") {
- if (KdenliveSettings::on_monitor_effects()) {
- 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
- connect(m_geometryWidget, SIGNAL(checkMonitorPosition(int)), this, SIGNAL(checkMonitorPosition(int)));
- connect(m_geometryWidget, SIGNAL(parameterChanged()), this, SLOT(collectAllParameters()));
- if (minFrame == maxFrame)
- m_geometryWidget->setupParam(pa, m_in, m_out);
- 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(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, isEffect ? 0 : qMax(0, (int)info.startPos.frames(KdenliveSettings::project_fps())));
- if (minFrame == maxFrame)
- geo->setupParam(pa, m_in, m_out);
- else
- geo->setupParam(pa, minFrame, maxFrame);
- m_vbox->addWidget(geo);
- m_valueItems[paramName+"geometry"] = geo;
- connect(geo, SIGNAL(parameterChanged()), this, SLOT(collectAllParameters()));
- connect(geo, SIGNAL(seekToPos(int)), this, SIGNAL(seekTimeline(int)));
- connect(this, SIGNAL(syncEffectsPos(int)), geo, SLOT(slotSyncPosition(int)));
- }
- } else if (type == "addedgeometry") {
- // this is a parameter that should be linked to the geometry widget, for example rotation, shear, ...
- if (m_geometryWidget) m_geometryWidget->addParameter(pa);
- } else if (type == "keyframe" || type == "simplekeyframe") {
- // keyframe editor widget
- if (m_keyframeEditor == NULL) {
- 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, 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, d.attribute("active_keyframe", "-1").toInt());
- }
- m_vbox->addWidget(geo);
- m_valueItems[paramName+"keyframe"] = geo;
- m_keyframeEditor = geo;
- connect(geo, SIGNAL(parameterChanged()), this, SLOT(collectAllParameters()));
- connect(geo, SIGNAL(seekToPos(int)), this, SIGNAL(seekTimeline(int)));
- connect(this, SIGNAL(showComments(bool)), geo, SIGNAL(showComments(bool)));
- } else {
- // we already have a keyframe editor, so just add another column for the new param
- m_keyframeEditor->addParameter(pa);
- }
- } else if (type == "color") {
- 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)));
- connect(choosecolor, SIGNAL(modified()) , this, SLOT(collectAllParameters()));
- } else if (type == "position") {
- int pos = value.toInt();
- if (d.attribute("id") == "fadein" || d.attribute("id") == "fade_from_black") {
- pos = pos - m_in;
- } else if (d.attribute("id") == "fadeout" || d.attribute("id") == "fade_to_black") {
- // fadeout position starts from clip end
- pos = m_out - pos;
- }
- PositionEdit *posedit = new PositionEdit(paramName, pos, 0, m_out - m_in, m_timecode);
- m_vbox->addWidget(posedit);
- m_valueItems[paramName+"position"] = posedit;
- connect(posedit, SIGNAL(parameterChanged()), this, SLOT(collectAllParameters()));
- } else if (type == "curve") {
- KisCurveWidget *curve = new KisCurveWidget(this);
- curve->setMaxPoints(pa.attribute("max").toInt());
- QList<QPointF> points;
- 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();
- for (int j = start; j <= number; j++) {
- QString in = inName;
- in.replace("%i", QString::number(j));
- QString out = outName;
- out.replace("%i", QString::number(j));
- points << QPointF(EffectsList::parameter(d, in).toDouble(), EffectsList::parameter(d, out).toDouble());
- }
- if (!points.isEmpty())
- curve->setCurve(KisCubicCurve(points));
- QSpinBox *spinin = new QSpinBox();
- spinin->setRange(0, 1000);
- QSpinBox *spinout = new QSpinBox();
- spinout->setRange(0, 1000);
- curve->setupInOutControls(spinin, spinout, 0, 1000);
- m_vbox->addWidget(curve);
- m_vbox->addWidget(spinin);
- m_vbox->addWidget(spinout);
-
- connect(curve, SIGNAL(modified()), this, SLOT(collectAllParameters()));
- m_valueItems[paramName] = curve;
-
- QString depends = pa.attribute("depends");
- if (!depends.isEmpty())
- meetDependency(paramName, type, EffectsList::parameter(d, depends));
- } else if (type == "bezier_spline") {
- BezierSplineWidget *widget = new BezierSplineWidget(value, this);
- stretch = false;
- m_vbox->addWidget(widget);
- m_valueItems[paramName] = widget;
- connect(widget, SIGNAL(modified()), this, SLOT(collectAllParameters()));
- QString depends = pa.attribute("depends");
- if (!depends.isEmpty())
- 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);
- connect(roto, SIGNAL(valueChanged()), this, SLOT(collectAllParameters()));
- connect(roto, SIGNAL(checkMonitorPosition(int)), this, SIGNAL(checkMonitorPosition(int)));
- connect(roto, SIGNAL(seekToPos(int)), this, SIGNAL(seekTimeline(int)));
- connect(this, SIGNAL(syncEffectsPos(int)), roto, SLOT(slotSyncPosition(int)));
- connect(this, SIGNAL(effectStateChanged(bool)), roto, SLOT(slotShowScene(bool)));
- m_vbox->addWidget(roto);
- m_valueItems[paramName] = roto;
-#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:
- wpval->start_up->setChecked(true);
- break;
- case DOWN:
- wpval->start_down->setChecked(true);
- break;
- case RIGHT:
- wpval->start_right->setChecked(true);
- break;
- case LEFT:
- wpval->start_left->setChecked(true);
- break;
- default:
- wpval->start_center->setChecked(true);
- break;
- }
- switch (w.end) {
- case UP:
- wpval->end_up->setChecked(true);
- break;
- case DOWN:
- wpval->end_down->setChecked(true);
- break;
- case RIGHT:
- wpval->end_right->setChecked(true);
- break;
- case LEFT:
- wpval->end_left->setChecked(true);
- break;
- default:
- wpval->end_center->setChecked(true);
- break;
- }
- wpval->start_transp->setValue(w.startTransparency);
- wpval->end_transp->setValue(w.endTransparency);
- m_valueItems[paramName] = wpval;
- connect(wpval->end_up, SIGNAL(clicked()), this, SLOT(collectAllParameters()));
- connect(wpval->end_down, SIGNAL(clicked()), this, SLOT(collectAllParameters()));
- connect(wpval->end_left, SIGNAL(clicked()), this, SLOT(collectAllParameters()));
- connect(wpval->end_right, SIGNAL(clicked()), this, SLOT(collectAllParameters()));
- connect(wpval->end_center, SIGNAL(clicked()), this, SLOT(collectAllParameters()));
- connect(wpval->start_up, SIGNAL(clicked()), this, SLOT(collectAllParameters()));
- connect(wpval->start_down, SIGNAL(clicked()), this, SLOT(collectAllParameters()));
- connect(wpval->start_left, SIGNAL(clicked()), this, SLOT(collectAllParameters()));
- connect(wpval->start_right, SIGNAL(clicked()), this, SLOT(collectAllParameters()));
- connect(wpval->start_center, SIGNAL(clicked()), this, SLOT(collectAllParameters()));
- connect(wpval->start_transp, SIGNAL(valueChanged(int)), this, SLOT(collectAllParameters()));
- connect(wpval->end_transp, SIGNAL(valueChanged(int)), this, SLOT(collectAllParameters()));
- //wpval->title->setTitle(na.toElement().text());
- 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;
- cval->urlwidget->setUrl(KUrl(value));
- connect(cval->urlwidget, SIGNAL(returnPressed()) , this, SLOT(collectAllParameters()));
- connect(cval->urlwidget, SIGNAL(urlSelected(const KUrl&)) , this, SLOT(collectAllParameters()));
- m_uiItems.append(cval);
- } 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;