<label>Height</label>
<label>Averaging</label>
<properties id="obscure" tag="obscure" />
- <parameter type="complex" name="X;Y;Width;Height;Averaging" max="MAX_WIDTH;MAX_HEIGHT;1000;1000;100" min="0;0;0;0;3" default="MID_WIDTH;MID_HEIGHT;100;100;20" format="%d,%d:%dx%d">
+ <parameter type="complex" namedesc="X;Y;Width;Height;Averaging" max="MAX_WIDTH;MAX_HEIGHT;1000;1000;100" min="0;0;0;0;3" default="MID_WIDTH;MID_HEIGHT;100;100;20" format="%d,%d:%dx%d">
<name>Region</name>
</parameter>
</effect>
QDomNodeList params = effect.elementsByTagName("parameter");
for (int i = 0; i < params.count(); i++) {
QDomElement e = params.item(i).toElement();
- if (e.attribute("name").contains(";")) {
+ if (e.attribute("namedesc").contains(";")) {
QString format = e.attribute("format");
QStringList separators = format.split("%d", QString::SkipEmptyParts);
QStringList values = e.attribute("value").split(QRegExp("[,:;x]"));
connect(ui.buttonHelp, SIGNAL(clicked()), this , SLOT(slotSetHelp()));
connect(ui.parameterList, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(slotParameterChanged(const QString&)));
//connect (ui.effectlist, SIGNAL (itemSelectionChanged() ) , this, SLOT ( itemSelectionChanged()));
- connect(this, SIGNAL(transferParamDesc(const QDomElement&, int , int)), ui.kplotwidget, SLOT(setPointLists(const QDomElement&, int , int)));
+ connect(this, SIGNAL(transferParamDesc(const QDomElement&, const QString&, int , int)), ui.kplotwidget, SLOT(setPointLists(const QDomElement&, const QString&, int , int)));
connect(ui.kplotwidget, SIGNAL(parameterChanged(QDomElement)), this , SLOT(slotUpdateEffectParams(QDomElement)));
connect(ui.kplotwidget, SIGNAL(parameterList(QStringList)), this , SLOT(slotUpdateParameterList(QStringList)));
/*ÜeffectLists["audio"]=audioEffectList;
updateButtonStatus();
}
-void ComplexParameter::setupParam(const QDomElement& d, int from, int to) {
+void ComplexParameter::setupParam(const QDomElement& d, const QString& paramName, int from, int to) {
param = d;
- ui.kplotwidget->setPointLists(d, from, to);
+ ui.kplotwidget->setPointLists(d, paramName, from, to);
}
void ComplexParameter::itemSelectionChanged() {
void slotShowInTimeline();
void slotParameterChanged(const QString&);
void itemSelectionChanged();
- void setupParam(const QDomElement&, int, int);
+ void setupParam(const QDomElement&, const QString& paramName, int, int);
void slotUpdateEffectParams(QDomElement e);
void slotUpdateParameterList(QStringList);
signals:
- void transferParamDesc(const QDomElement&, int , int);
+ void transferParamDesc(const QDomElement&, const QString&, int , int);
void removeEffect(ClipItem*, QDomElement);
void updateClipEffect(ClipItem*, QDomElement);
void parameterChanged();
for (int i = 0;i < namenode.count() ;i++) {
kDebug() << "in form";
- QDomNode pa = namenode.item(i);
+ QDomElement pa = namenode.item(i).toElement();
QDomNode na = pa.firstChildElement("name");
- QDomNamedNodeMap nodeAtts = pa.attributes();
- QString type = nodeAtts.namedItem("type").nodeValue();
+ QString type = pa.attribute("type");
QString paramName = na.toElement().text();
QWidget * toFillin = new QWidget;
- QString value = nodeAtts.namedItem("value").isNull() ?
- nodeAtts.namedItem("default").nodeValue() :
- nodeAtts.namedItem("value").nodeValue();
+ QString value = pa.attribute("value").isNull() ?
+ pa.attribute("default") : pa.attribute("value");
+ if (type == "geometry") {
+ pa.setAttribute("namedesc", "X;Y;W;H");
+ pa.setAttribute("format", "%d,%d:%dx%d");
+ pa.setAttribute("min", "-100;-100;0;0");
+ pa.setAttribute("max", "0;0;100;100");
+ }
+ if (type == "complex") {
+ //pa.setAttribute("namedesc",pa.attribute("name"));
+ }
//TODO constant, list, bool, complex , color, geometry, position
if (type == "double" || type == "constant") {
- createSliderItem(paramName, value.toInt(), nodeAtts.namedItem("min").nodeValue().toInt(), nodeAtts.namedItem("max").nodeValue().toInt());
+ createSliderItem(paramName, value.toInt(), pa.attribute("min").toInt(), pa.attribute("max").toInt());
delete toFillin;
toFillin = NULL;
} else if (type == "list") {
Ui::Listval_UI *lsval = new Ui::Listval_UI;
lsval->setupUi(toFillin);
- nodeAtts.namedItem("paramlist");
- QStringList listitems = nodeAtts.namedItem("paramlist").nodeValue().split(",");
+ QStringList listitems = pa.attribute("paramlist").split(",");
lsval->list->addItems(listitems);
lsval->list->setCurrentIndex(listitems.indexOf(value));
for (int i = 0;i < lsval->list->count();i++) {
bval->checkBox->setText(na.toElement().text());
valueItems[paramName] = bval;
uiItems.append(bval);
- } else if (type == "complex") {
+ } else if (type == "complex" || type == "geometry") {
/*QStringList names=nodeAtts.namedItem("name").nodeValue().split(";");
QStringList max=nodeAtts.namedItem("max").nodeValue().split(";");
QStringList min=nodeAtts.namedItem("min").nodeValue().split(";");
}*/
ComplexParameter *pl = new ComplexParameter;
connect(pl, SIGNAL(parameterChanged()), this, SLOT(collectAllParameters()));
- pl->setupParam(d, 0, 100);
+ pl->setupParam(d, pa.attribute("name"), 0, 100);
vbox->addWidget(pl);
valueItems[paramName+"complex"] = pl;
items.append(pl);
KColorButton *color = ((Ui::Colorval_UI*)valueItems[na.toElement().text()])->kcolorbutton;
setValue.sprintf("0x%08x", color->color().rgba());
} else
- if (type == "complex") {
+ if (type == "complex" || type == "geometry") {
ComplexParameter *complex = ((ComplexParameter*)valueItems[na.toElement().text()+"complex"]);
namenode.item(i) = complex->getParamDesc();
}
- if (!setValue.isEmpty()) {
+ if (!setValue.isNull()) {
pa.attributes().namedItem("value").setNodeValue(setValue);
}
}
params.setAttribute("type", "constant");
if (QString(paramdesc.get("type")) == "boolean")
params.setAttribute("type", "bool");
- if (!QString(paramdesc.get("format")).isEmpty()) {
+ if (!QString(paramdesc.get("format")).isEmpty() && QString(paramdesc.get("type")) != "geometry") {
params.setAttribute("type", "complex");
params.setAttribute("format", paramdesc.get("format"));
}
+ if (!QString(paramdesc.get("format")).isEmpty() && QString(paramdesc.get("type")) == "geometry") {
+ params.setAttribute("type", "geometry");
+ //params.setAttribute("format", paramdesc.get("format"));
+ }
if (paramdesc.get("default")) params.setAttribute("default", paramdesc.get("default"));
if (paramdesc.get("value")) {
params.setAttribute("value", paramdesc.get("value"));
Mlt::Properties *metadata = repository->metadata(transition_type, name.toAscii().data());
//kDebug() << filtername;
if (metadata && metadata->is_valid()) {
+ Mlt::Properties param_props((mlt_properties) metadata->get_data("parameters"));
+ for (int j = 0; param_props.is_valid() && j < param_props.count();j++) {
+ QDomElement params = ret.createElement("parameter");
+
+ Mlt::Properties paramdesc((mlt_properties) param_props.get_data(param_props.get_name(j)));
+
+ params.setAttribute("name", paramdesc.get("identifier"));
+
+ if (paramdesc.get("maximum")) params.setAttribute("max", paramdesc.get("maximum"));
+ if (paramdesc.get("minimum")) params.setAttribute("min", paramdesc.get("minimum"));
+ if (QString(paramdesc.get("type")) == "integer") {
+ params.setAttribute("type", "constant");
+ params.setAttribute("factor", "100");
+ }
+ if (QString(paramdesc.get("type")) == "boolean")
+ params.setAttribute("type", "bool");
+ if (!QString(paramdesc.get("format")).isEmpty()) {
+ params.setAttribute("type", "complex");
+ params.setAttribute("format", paramdesc.get("format"));
+
+ }
+ if (paramdesc.get("default")) params.setAttribute("default", paramdesc.get("default"));
+ if (paramdesc.get("value")) {
+ params.setAttribute("value", paramdesc.get("value"));
+ } else {
+ params.setAttribute("value", paramdesc.get("default"));
+ }
+
+
+ QDomElement pname = ret.createElement("name");
+ pname.appendChild(ret.createTextNode(paramdesc.get("title")));
+ params.appendChild(pname);
+
+ ktrans.appendChild(params);
+ }
ret.appendChild(ktrans);
if (metadata->get("title") && metadata->get("identifier")) {
paramList.append(quickParameterFill(ret, "Fix Shear Z", "fix_shear_z", "double", "0", "0", "360"));
paramList.append(quickParameterFill(ret, "Mirror", "mirror_off", "bool", "0", "0", "1"));
paramList.append(quickParameterFill(ret, "Repeat", "repeat_off", "bool", "0", "0", "1"));
- paramList.append(quickParameterFill(ret, "Geometry", "geometry", "geometry", "0%,0%:100%x100%", "0,0:100%x100%", "0,0:100%x100%"));
+ paramList.append(quickParameterFill(ret, "Geometry", "geometry", "geometry", "0%,0%:100%x100%", "0%,0%:100%x100%", "0%,0%:100%x100%"));
+ tname.appendChild(ret.createTextNode("Composite"));
} else if (name == "region") {
tname.appendChild(ret.createTextNode("Region"));
}
*/
}
}
-QDomElement initEffects::quickParameterFill(QDomDocument & doc, QString name, QString tag, QString type, QString def, QString min, QString max, QString list, QString factor) {
+QDomElement initEffects::quickParameterFill(QDomDocument & doc, QString name, QString tag, QString type, QString def, QString min, QString max, QString list, QString factor, QString namedesc, QString format) {
QDomElement parameter = doc.createElement("parameter");
parameter.setAttribute("tag", tag);
parameter.setAttribute("default", def);
parameter.setAttribute("paramlist", list);
if (!factor.isEmpty())
parameter.setAttribute("factor", factor);
+ if (!namedesc.isEmpty())
+ parameter.setAttribute("namedesc", namedesc);
+ if (!format.isEmpty())
+ parameter.setAttribute("format", format);
QDomElement pname = doc.createElement("name");
pname.appendChild(doc.createTextNode(name));
parameter.appendChild(pname);
static Mlt::Repository *parseEffectFiles(EffectsList *audioEffectList, EffectsList *videoEffectList, EffectsList *transitions);
static QDomDocument createDescriptionFromMlt(Mlt::Repository* repository, const QString& type, const QString& name);
static void fillTransitionsList(Mlt::Repository *, EffectsList* transitions, QStringList names);
- static QDomElement quickParameterFill(QDomDocument & doc, QString name, QString tag, QString type, QString def = QString(), QString min = QString(), QString max = QString(), QString list = QString(), QString factor = QString());
+ static QDomElement quickParameterFill(QDomDocument & doc, QString name, QString tag, QString type, QString def = QString(), QString min = QString(), QString max = QString(), QString list = QString(), QString factor = QString(), QString namedesc = QString(), QString format = QString());
static void parseEffectFile(EffectsList *audioEffectList, EffectsList *videoEffectList, QString name, QStringList filtersList, QStringList producersList);
static char* ladspaEffectString(int ladspaId, QStringList params);
static void ladspaEffectFile(const QString & fname, int ladspaId, QStringList params);
</effect>
*/
-void ParameterPlotter::setPointLists(const QDomElement& d, int startframe, int endframe) {
+void ParameterPlotter::setPointLists(const QDomElement& d, const QString& paramName, int startframe, int endframe) {
//QListIterator <QPair <QString, QMap< int , QVariant > > > nameit(params);
+ m_paramName = paramName;
itemParameter = d;
QDomNodeList namenode = d.elementsByTagName("parameter");
QTextStream stre(&dat);
d.save(stre, 2);
kDebug() << dat;
-
+ int i = 0;
+ while (!namenode.item(i).isNull() && namenode.item(i).toElement().attribute("name") != m_paramName)
+ i++;
if (namenode.count()) {
- QDomNode pa = namenode.item(0);
+ QDomElement pa = namenode.item(i).toElement();
QDomNode na = pa.firstChildElement("name");
- parameterNameList << pa.attributes().namedItem("name").nodeValue().split(";");
+ parameterNameList << pa.attribute("namedesc").split(";");
emit parameterList(parameterNameList);
//max_y=pa.attributes().namedItem("max").nodeValue().toInt();
//int val=pa.attributes().namedItem("value").nodeValue().toInt();
QStringList defaults;
- if (pa.attributes().namedItem("start").nodeValue().contains(";"))
- defaults = pa.attributes().namedItem("start").nodeValue().split(";");
- else if (pa.attributes().namedItem("value").nodeValue().contains(";"))
- defaults = pa.attributes().namedItem("value").nodeValue().split(";");
- else if (pa.attributes().namedItem("default").nodeValue().contains(";"))
- defaults = pa.attributes().namedItem("default").nodeValue().split(";");
- QStringList maxv = pa.attributes().namedItem("max").nodeValue().split(";");
- QStringList minv = pa.attributes().namedItem("max").nodeValue().split(";");
- for (int i = 0;i < maxv.size();i++) {
+ if (pa.attribute("start").contains(";"))
+ defaults = pa.attribute("start").split(";");
+ else if (pa.attribute("value").contains(";"))
+ defaults = pa.attribute("value").split(";");
+ else if (pa.attribute("default").contains(";"))
+ defaults = pa.attribute("default").split(";");
+ QStringList maxv = pa.attribute("max").split(";");
+ QStringList minv = pa.attribute("max").split(";");
+ for (int i = 0;i < maxv.size() && i < minv.size();i++) {
if (max_y < maxv[i].toInt()) max_y = maxv[i].toInt();
if (min_y > minv[i].toInt()) min_y = minv[i].toInt();
}
for (int i = 0;i < parameterNameList.count();i++) {
KPlotObject *plot = new KPlotObject(colors[plotobjects.size()%colors.size()]);
plot->setShowLines(true);
- if (!stretchFactors.contains(i)) {
+ if (!stretchFactors.contains(i) && i < maxv.size()) {
if (maxv[i].toInt() != 0)
stretchFactors[i] = max_y / maxv[i].toInt();
else
stretchFactors[i] = 1.0;
}
- if (defaults[i].toDouble() > max_y)
+ if (i < defaults.size() && defaults[i].toDouble() > max_y)
defaults[i] = max_y;
- plot->addPoint(startframe, defaults[i].toInt()*stretchFactors[i], parameterNameList[i]);
+ int def = 0;
+ if (i < defaults.size())
+ def = (int)(defaults[i].toInt() * stretchFactors[i]);
+ QString name = "";
+ if (i < parameterNameList.size())
+ name = parameterNameList[i];
+ plot->addPoint(startframe, def, name);
//add keyframes here
- plot->addPoint(endframe, defaults[i].toInt()*stretchFactors[i]);
+ plot->addPoint(endframe, def);
plotobjects.append(plot);
}
maxx = endframe;
maxy = max_y;
setLimits(-1, endframe + 1, min_y - 10, maxy + 10);
+
addPlotObjects(plotobjects);
}
void ParameterPlotter::createParametersNew() {
-
QList<KPlotObject*> plotobjs = plotObjects();
if (plotobjs.size() != parameterNameList.size()) {
kDebug() << "ERROR size not equal";
}
void ParameterPlotter::replot(const QString & name) {
+
//removeAllPlotObjects();
int i = 0;
bool drawAll = name.isEmpty() || name == "all";
activeIndexPlot = -1;
+
foreach(KPlotObject* p, plotObjects()) {
- p->setShowPoints(drawAll || parameterNameList[i] == name);
- p->setShowLines(drawAll || parameterNameList[i] == name);
- QPen pen = (drawAll || parameterNameList[i] == name ? QPen(Qt::SolidLine) : QPen(Qt::NoPen));
+ QString selectedName = "none";
+ if (i < parameterNameList.size())
+ selectedName = parameterNameList[i];
+ p->setShowPoints(drawAll || selectedName == name);
+ p->setShowLines(drawAll || selectedName == name);
+ QPen pen = (drawAll || selectedName == name ? QPen(Qt::SolidLine) : QPen(Qt::NoPen));
pen.setColor(p->linePen().color());
p->setLabelPen(pen);
- if (parameterNameList[i] == name)
+ if (selectedName == name)
activeIndexPlot = i;
replacePlotObject(i++, p);
}
QList<QColor> colors;
QDomElement itemParameter;
int max_y, min_y;
+ QString m_paramName;
protected:
void mouseMoveEvent(QMouseEvent * event);
void mousePressEvent(QMouseEvent * event);
public slots:
- void setPointLists(const QDomElement&, int , int);
+ void setPointLists(const QDomElement&, const QString& paramName, int , int);
signals:
void parameterChanged(QDomElement);
void updateFrame(int);
mlt_properties properties = MLT_TRANSITION_PROPERTIES(tr);
mlt_properties_set_int(properties, "a_track", mlt_transition_get_a_track(tr) + trackOffset);
mlt_properties_set_int(properties, "b_track", mlt_transition_get_b_track(tr) + trackOffset);
- kDebug() << "set new start & end :" << new_in << new_out;
+ kDebug() << "set new start & end :" << new_in << new_out;
}
break;
}
QDomNodeList attribs = xml.elementsByTagName("parameter");
QMap<QString, QString> map;
for (int i = 0;i < attribs.count();i++) {
- QDomNamedNodeMap atts = attribs.item(i).attributes();
- QString name = atts.namedItem("name").nodeValue();
- map[name] = atts.namedItem("default").nodeValue();
- if (!atts.namedItem("value").nodeValue().isEmpty()) {
- map[name] = atts.namedItem("value").nodeValue();
+ QDomElement e = attribs.item(i).toElement();
+ QString name = e.attribute("name");
+ map[name] = e.attribute("default");
+ if (!e.attribute("value").isEmpty()) {
+ map[name] = e.attribute("value");
}
- if (!atts.namedItem("factor").nodeValue().isEmpty() && atts.namedItem("factor").nodeValue().toDouble() > 0) {
- map[name] = QString::number(map[name].toDouble() / atts.namedItem("factor").nodeValue().toDouble());
+ if (!e.attribute("factor").isEmpty() && e.attribute("factor").toDouble() > 0) {
+ map[name] = QString::number(map[name].toDouble() / e.attribute("factor").toDouble());
//map[name]=map[name].replace(".",","); //FIXME how to solve locale conversion of . ,
}
+ if (e.attribute("namedesc").contains(";")) {
+ QString format = e.attribute("format");
+ QStringList separators = format.split("%d", QString::SkipEmptyParts);
+ QStringList values = e.attribute("value").split(QRegExp("[,:;x]"));
+ QString neu;
+ QTextStream txtNeu(&neu);
+ if (values.size() > 0)
+ txtNeu << (int)values[0].toDouble();
+ for (int i = 0;i < separators.size() && i + 1 < values.size();i++) {
+ txtNeu << separators[i];
+ txtNeu << (int)(values[i+1].toDouble());
+ }
+ map[e.attribute("name")] = neu;
+ }
}