#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
{
};
+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) :
m_out(0),
m_frameSize(QPoint()),
m_keyframeEditor(NULL),
- m_monitor(monitor)
+ m_monitor(monitor),
+ m_geometryWidget(NULL)
{
m_baseWidget = new QWidget(this);
- setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
setFrameStyle(QFrame::NoFrame);
setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::MinimumExpanding));
QColor selected_bg = scheme.decoration(KColorScheme::FocusColor).color();
QColor hover_bg = scheme.decoration(KColorScheme::HoverColor).color();
QColor light_bg = scheme.shade(KColorScheme::LightShade);
- QColor mid_bg = scheme.shade(KColorScheme::DarkShade);
- QString stylesheet(QString("QProgressBar:horizontal {border: 1px solid %5;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: %5} QProgressBar:horizontal:hover#dragOnly {background: %3} QProgressBar:horizontal:hover {border: 1px solid %3;border-right: 0px;} QProgressBar::chunk:horizontal {background: %5;} 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;} QSpinBox#dragBox {border: 1px solid %1;border-top-right-radius: 4px;border-bottom-right-radius: 4px;padding-right:0px;} QSpinBox::down-button#dragBox {width:0px;padding:0px;} QSpinBox::up-button#dragBox {width:0px;padding:0px;} QSpinBox[inTimeline=\"true\"]#dragBox { border: 1px solid %2;} QSpinBox:hover#dragBox {border: 1px solid %3;} ").arg(dark_bg.name()).arg(selected_bg.name()).arg(hover_bg.name()).arg(light_bg.name()).arg(mid_bg.name()));
+ 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);
QDomNodeList namenode = m_params.elementsByTagName("parameter");
for (int i = 0; i < namenode.count() ; i++) {
QDomNode pa = namenode.item(i);
- QDomNode na = pa.firstChildElement("name");
+ QDomElement na = pa.firstChildElement("name");
QString type = pa.attributes().namedItem("type").nodeValue();
- QString paramName = i18n(na.toElement().text().toUtf8().data());
+ QString paramName = na.isNull() ? pa.attributes().namedItem("name").nodeValue() : i18n(na.text().toUtf8().data());
if (type == "geometry") {
if (!KdenliveSettings::on_monitor_effects()) {
break;
}
else {
- GeometryWidget *geom = ((GeometryWidget*)m_valueItems[paramName+"geometry"]);
- geom->setFrameSize(m_frameSize);
+ if (m_geometryWidget) m_geometryWidget->setFrameSize(m_frameSize);
break;
}
}
QDomNodeList namenode = m_params.elementsByTagName("parameter");
for (int i = 0; i < namenode.count() ; i++) {
QDomNode pa = namenode.item(i);
- QDomNode na = pa.firstChildElement("name");
+ QDomElement na = pa.firstChildElement("name");
QString type = pa.attributes().namedItem("type").nodeValue();
- QString paramName = i18n(na.toElement().text().toUtf8().data());
+ QString paramName = na.isNull() ? pa.attributes().namedItem("name").nodeValue() : i18n(na.text().toUtf8().data());
if (type == "geometry") {
if (KdenliveSettings::on_monitor_effects()) {
- GeometryWidget *geom = (GeometryWidget*)m_valueItems[paramName+"geometry"];
- geom->updateTimecodeFormat();
+ if (m_geometryWidget) m_geometryWidget->updateTimecodeFormat();
} else {
Geometryval *geom = ((Geometryval*)m_valueItems[paramName+"geometry"]);
geom->updateTimecodeFormat();
}
break;
- }
- if (type == "position") {
+ } 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();
}
}
}
}
}
-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";
+// kDebug() << "// EMPTY EFFECT STACK";
return;
}
}
}
#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);
QDomElement na = pa.firstChildElement("name");
QDomElement commentElem = pa.firstChildElement("comment");
QString type = pa.attribute("type");
- QString paramName = i18n(na.text().toUtf8().data());
+ 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");
- /** 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;
- if (pa.attribute("min").startsWith('%'))
- min = (int) ProfilesDialog::getStringEval(m_profile, pa.attribute("min"));
+ double min;
+ double max;
+ if (pa.attribute("min").contains('%'))
+ min = ProfilesDialog::getStringEval(m_profile, pa.attribute("min"), m_frameSize);
else
- min = pa.attribute("min").toInt();
- if (pa.attribute("max").startsWith('%'))
- max = (int) ProfilesDialog::getStringEval(m_profile, pa.attribute("max"));
+ 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").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;
lsval->setupUi(toFillin);
- QStringList listitems = pa.attribute("paramlist").split(',');
+ 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));
connect(pl, SIGNAL(parameterChanged()), this, SLOT(collectAllParameters()));
} else if (type == "geometry") {
if (KdenliveSettings::on_monitor_effects()) {
- GeometryWidget *geometry = new GeometryWidget(m_monitor, m_timecode, pos, isEffect, this);
- geometry->setFrameSize(m_frameSize);
- geometry->slotShowScene(!disable);
+ 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(geometry, SIGNAL(checkMonitorPosition(int)), this, SIGNAL(checkMonitorPosition(int)));
- connect(geometry, SIGNAL(parameterChanged()), this, SLOT(collectAllParameters()));
+ connect(m_geometryWidget, SIGNAL(checkMonitorPosition(int)), this, SIGNAL(checkMonitorPosition(int)));
+ connect(m_geometryWidget, SIGNAL(parameterChanged()), this, SLOT(collectAllParameters()));
if (minFrame == maxFrame)
- geometry->setupParam(pa, m_in, m_out);
+ m_geometryWidget->setupParam(pa, m_in, m_out);
else
- geometry->setupParam(pa, minFrame, maxFrame);
- m_vbox->addWidget(geometry);
- m_valueItems[paramName+"geometry"] = geometry;
- connect(geometry, SIGNAL(seekToPos(int)), this, SIGNAL(seekTimeline(int)));
- connect(this, SIGNAL(syncEffectsPos(int)), geometry, SLOT(slotSyncPosition(int)));
- connect(this, SIGNAL(effectStateChanged(bool)), geometry, SLOT(slotShowScene(bool)));
+ 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, 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
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_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_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;
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)));
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();
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));
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;
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, 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)));
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;
+ kval->setupUi(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;
+ fval->setupUi(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 {
delete toFillin;
toFillin = NULL;
wipeInfo EffectStackEdit::getWipeInfo(QString value)
{
wipeInfo info;
+ // Convert old geometry values that used a comma as separator
+ if (value.contains(',')) value.replace(',','/');
QString start = value.section(';', 0, 0);
QString end = value.section(';', 1, 1).section('=', 1, 1);
-
- if (start.startsWith("-100%,0"))
+ if (start.startsWith("-100%/0"))
info.start = LEFT;
- else if (start.startsWith("100%,0"))
+ else if (start.startsWith("100%/0"))
info.start = RIGHT;
- else if (start.startsWith("0%,100%"))
+ else if (start.startsWith("0%/100%"))
info.start = DOWN;
- else if (start.startsWith("0%,-100%"))
+ else if (start.startsWith("0%/-100%"))
info.start = UP;
else
info.start = CENTER;
else
info.startTransparency = 100;
- if (end.startsWith("-100%,0"))
+ if (end.startsWith("-100%/0"))
info.end = LEFT;
- else if (end.startsWith("100%,0"))
+ else if (end.startsWith("100%/0"))
info.end = RIGHT;
- else if (end.startsWith("0%,100%"))
+ else if (end.startsWith("0%/100%"))
info.end = DOWN;
- else if (end.startsWith("0%,-100%"))
+ else if (end.startsWith("0%/-100%"))
info.end = UP;
else
info.end = CENTER;
QString end;
switch (info.start) {
case LEFT:
- start = "-100%,0%:100%x100%";
+ start = "-100%/0%:100%x100%";
break;
case RIGHT:
- start = "100%,0%:100%x100%";
+ start = "100%/0%:100%x100%";
break;
case DOWN:
- start = "0%,100%:100%x100%";
+ start = "0%/100%:100%x100%";
break;
case UP:
- start = "0%,-100%:100%x100%";
+ start = "0%/-100%:100%x100%";
break;
default:
- start = "0%,0%:100%x100%";
+ start = "0%/0%:100%x100%";
break;
}
start.append(':' + QString::number(info.startTransparency));
switch (info.end) {
case LEFT:
- end = "-100%,0%:100%x100%";
+ end = "-100%/0%:100%x100%";
break;
case RIGHT:
- end = "100%,0%:100%x100%";
+ end = "100%/0%:100%x100%";
break;
case DOWN:
- end = "0%,100%:100%x100%";
+ end = "0%/100%:100%x100%";
break;
case UP:
- end = "0%,-100%:100%x100%";
+ end = "0%/-100%:100%x100%";
break;
default:
- end = "0%,0%:100%x100%";
+ end = "0%/0%:100%x100%";
break;
}
end.append(':' + QString::number(info.endTransparency));
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);
- QDomNode na = pa.firstChildElement("name");
+ QDomElement na = pa.firstChildElement("name");
QString type = pa.attributes().namedItem("type").nodeValue();
- QString paramName = i18n(na.toElement().text().toUtf8().data());
+ QString paramName = na.isNull() ? pa.attributes().namedItem("name").nodeValue() : i18n(na.text().toUtf8().data());
if (type == "complex")
paramName.append("complex");
else if (type == "position")
paramName.append("geometry");
else if (type == "keyframe")
paramName.append("keyframe");
- if (type != "simplekeyframe" && !m_valueItems.contains(paramName)) {
+ if (type != "simplekeyframe" && type != "fixed" && type != "addedgeometry" && !m_valueItems.contains(paramName)) {
kDebug() << "// Param: " << paramName << " NOT FOUND";
continue;
}
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();
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();
} else if (type == "geometry") {
if (KdenliveSettings::on_monitor_effects()) {
- GeometryWidget *geometry = ((GeometryWidget*)m_valueItems.value(paramName));
- namenode.item(i).toElement().setAttribute("value", geometry->getValue());
+ if (m_geometryWidget) namenode.item(i).toElement().setAttribute("value", m_geometryWidget->getValue());
} else {
Geometryval *geom = ((Geometryval*)m_valueItems.value(paramName));
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")));
} else if (type == "position") {
PositionEdit *pedit = ((PositionEdit*)m_valueItems.value(paramName));
int pos = pedit->getPosition();
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())
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();
} 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())
if (wid) delete wid;
}
m_keyframeEditor = NULL;
+ m_geometryWidget = NULL;
blockSignals(false);
}