X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Finiteffects.cpp;h=082e879618268a668421b38947b14c86999382cf;hb=fec4b6aba639dac658d35475512c6f232c8aebe3;hp=a7fde3134949ff1b170b47b8d46e7953d1de0b69;hpb=342b210be2ac35440f6c1ada883c4392e2f0a9ed;p=kdenlive diff --git a/src/initeffects.cpp b/src/initeffects.cpp index a7fde313..082e8796 100644 --- a/src/initeffects.cpp +++ b/src/initeffects.cpp @@ -17,33 +17,36 @@ * * ***************************************************************************/ - -#include -#include -#include -#include - -#include -#include -#include - #include "initeffects.h" #include "kdenlivesettings.h" #include "effectslist.h" #include "effectstackedit.h" #include "mainwindow.h" -initEffectsThumbnailer::initEffectsThumbnailer() { +#include +#include +#include + +#include +#include +#include +#include + +initEffectsThumbnailer::initEffectsThumbnailer() : + QThread() +{ } -void initEffectsThumbnailer::prepareThumbnailsCall(const QStringList& list) { +void initEffectsThumbnailer::prepareThumbnailsCall(const QStringList& list) +{ m_list = list; start(); kDebug() << "done"; } -void initEffectsThumbnailer::run() { +void initEffectsThumbnailer::run() +{ foreach(const QString &entry, m_list) { kDebug() << entry; if (!entry.isEmpty() && (entry.endsWith(".png") || entry.endsWith(".pgm"))) { @@ -59,15 +62,64 @@ void initEffectsThumbnailer::run() { initEffectsThumbnailer initEffects::thumbnailer; -initEffects::initEffects() { +// static +void initEffects::refreshLumas() +{ + // Check for Kdenlive installed luma files, add empty string at start for no luma + QStringList imagenamelist = QStringList() << i18n("None"); + QStringList imagefiles = QStringList() << QString(); + QStringList filters; + filters << "*.pgm" << "*.png"; + + QStringList customLumas = KGlobal::dirs()->findDirs("appdata", "lumas"); + foreach(const QString &folder, customLumas) { + QStringList filesnames = QDir(folder).entryList(filters, QDir::Files); + foreach(const QString &fname, filesnames) { + imagenamelist.append(fname); + imagefiles.append(KUrl(folder).path(KUrl::AddTrailingSlash) + fname); + } + } + + // Check for MLT lumas + KUrl folder(mlt_environment("MLT_DATA")); + folder.addPath("lumas"); + folder.addPath(mlt_environment("MLT_NORMALISATION")); + QDir lumafolder(folder.path()); + QStringList filesnames = lumafolder.entryList(filters, QDir::Files); + foreach(const QString &fname, filesnames) { + imagenamelist.append(fname); + KUrl path(folder); + path.addPath(fname); + imagefiles.append(path.toLocalFile()); + } + QDomElement lumaTransition = MainWindow::transitions.getEffectByTag("luma", "luma"); + QDomNodeList params = lumaTransition.elementsByTagName("parameter"); + for (int i = 0; i < params.count(); i++) { + QDomElement e = params.item(i).toElement(); + if (e.attribute("tag") == "resource") { + e.setAttribute("paramlistdisplay", imagenamelist.join(",")); + e.setAttribute("paramlist", imagefiles.join(",")); + break; + } + } + + QDomElement compositeTransition = MainWindow::transitions.getEffectByTag("composite", "composite"); + params = compositeTransition.elementsByTagName("parameter"); + for (int i = 0; i < params.count(); i++) { + QDomElement e = params.item(i).toElement(); + if (e.attribute("tag") == "luma") { + e.setAttribute("paramlistdisplay", imagenamelist.join(",")); + e.setAttribute("paramlist", imagefiles.join(",")); + break; + } + } -} -initEffects::~initEffects() { } //static -Mlt::Repository *initEffects::parseEffectFiles() { +Mlt::Repository *initEffects::parseEffectFiles() +{ QStringList::Iterator more; QStringList::Iterator it; QStringList fileList; @@ -83,6 +135,36 @@ Mlt::Repository *initEffects::parseEffectFiles() { Mlt::Properties *filters = repository->filters(); QStringList filtersList; + // Check for blacklisted effects + QString blacklist = KStandardDirs::locate("appdata", "blacklisted_effects.txt"); + + QFile file(blacklist); + QStringList blackListed; + + if (file.open(QIODevice::ReadOnly)) { + QTextStream in(&file); + while (!in.atEnd()) { + QString black = in.readLine().simplified(); + if (!black.isEmpty() && !black.startsWith('#')) blackListed.append(black); + } + file.close(); + } + + // Check for blacklisted transitions + blacklist = KStandardDirs::locate("appdata", "blacklisted_transitions.txt"); + + QFile file2(blacklist); + QStringList blackListedtransitions; + + if (file2.open(QIODevice::ReadOnly)) { + QTextStream in(&file2); + while (!in.atEnd()) { + QString black = in.readLine().simplified(); + if (!black.isEmpty() && !black.startsWith('#')) blackListedtransitions.append(black); + } + file2.close(); + } + for (int i = 0 ; i < filters->count() ; i++) { filtersList << filters->get_name(i); } @@ -94,6 +176,7 @@ Mlt::Repository *initEffects::parseEffectFiles() { for (int i = 0 ; i < producers->count() ; i++) { producersList << producers->get_name(i); } + KdenliveSettings::setProducerslist(producersList); delete filters; delete producers; @@ -103,6 +186,10 @@ Mlt::Repository *initEffects::parseEffectFiles() { transitionsItemList << transitions->get_name(i); } delete transitions; + + foreach(const QString &trans, blackListedtransitions) { + if (transitionsItemList.contains(trans)) transitionsItemList.removeAll(trans); + } fillTransitionsList(repository, &MainWindow::transitions, transitionsItemList); KGlobal::dirs()->addResourceType("ladspa_plugin", 0, "lib/ladspa"); @@ -110,22 +197,30 @@ Mlt::Repository *initEffects::parseEffectFiles() { KGlobal::dirs()->addResourceDir("ladspa_plugin", "/usr/local/lib/ladspa"); KGlobal::dirs()->addResourceDir("ladspa_plugin", "/opt/lib/ladspa"); KGlobal::dirs()->addResourceDir("ladspa_plugin", "/opt/local/lib/ladspa"); + KGlobal::dirs()->addResourceDir("ladspa_plugin", "/usr/lib64/ladspa"); + KGlobal::dirs()->addResourceDir("ladspa_plugin", "/usr/local/lib64/ladspa"); kDebug() << "// INIT EFFECT SEARCH" << endl; - QStringList direc = KGlobal::dirs()->findDirs("data", "kdenlive/effects"); + QStringList direc = KGlobal::dirs()->findDirs("appdata", "effects"); QDir directory; for (more = direc.begin() ; more != direc.end() ; ++more) { directory = QDir(*more); - fileList = directory.entryList(QDir::Files); + QStringList filter; + filter << "*.xml"; + fileList = directory.entryList(filter, QDir::Files); for (it = fileList.begin() ; it != fileList.end() ; ++it) { itemName = KUrl(*more + *it).path(); - if (itemName.endsWith(".xml")) - parseEffectFile(&MainWindow::customEffects, &MainWindow::audioEffects, &MainWindow::videoEffects, itemName, filtersList, producersList); + parseEffectFile(&MainWindow::customEffects, &MainWindow::audioEffects, &MainWindow::videoEffects, itemName, filtersList, producersList); // kDebug()<<"// FOUND EFFECT FILE: "<append(documentElement); - else if (type == "custom") customEffectList->append(documentElement); - else videoEffectList->append(documentElement); - } else videoEffectList->append(documentElement); + QString type = documentElement.attribute("type", QString()); + if (type == "audio") audioEffectList->append(documentElement); + else if (type == "custom") customEffectList->append(documentElement); + else videoEffectList->append(documentElement); } /* @@ -219,10 +311,10 @@ void initEffects::parseEffectFile(EffectsList *customEffectList, EffectsList *au QDomNode propsnode = documentElement.elementsByTagName("properties").item(0); if (!propsnode.isNull()) { QDomElement propselement = propsnode.toElement(); - id = propselement.attribute("id", QString::null); - effectTag = propselement.attribute("tag", QString::null); - if (propselement.attribute("type", QString::null) == "audio") type = AUDIOEFFECT; - else if (propselement.attribute("type", QString::null) == "custom") type = CUSTOMEFFECT; + id = propselement.attribute("id", QString()); + effectTag = propselement.attribute("tag", QString()); + if (propselement.attribute("type", QString()) == "audio") type = AUDIOEFFECT; + else if (propselement.attribute("type", QString()) == "custom") type = CUSTOMEFFECT; else type = VIDEOEFFECT; } @@ -275,7 +367,8 @@ void initEffects::parseEffectFile(EffectsList *customEffectList, EffectsList *au } //static -char* initEffects::ladspaEffectString(int ladspaId, QStringList params) { +const char* initEffects::ladspaEffectString(int ladspaId, QStringList params) +{ if (ladspaId == 1433) //Pitch return ladspaPitchEffectString(params); else if (ladspaId == 1216) //Room Reverb @@ -286,13 +379,14 @@ char* initEffects::ladspaEffectString(int ladspaId, QStringList params) { return ladspaEqualizerEffectString(params); else { kDebug() << "++++++++++ ASKING FOR UNKNOWN LADSPA EFFECT: " << ladspaId << endl; - return (char *) ""; + return ""; } } //static -void initEffects::ladspaEffectFile(const QString & fname, int ladspaId, QStringList params) { - char *filterString; +void initEffects::ladspaEffectFile(const QString & fname, int ladspaId, QStringList params) +{ + const char *filterString; switch (ladspaId) { case 1433: //Pitch filterString = ladspaPitchEffectString(params); @@ -336,60 +430,71 @@ void initEffects::ladspaEffectFile(const QString & fname, int ladspaId, QStringL stream << filterString; f.close(); } else kDebug() << "++++++++++ ERROR CANNOT WRITE TO: " << KdenliveSettings::currenttmpfolder() + fname << endl; - delete filterString; + delete [] filterString; } -QString jackString = "248000"; +const QString jackString = "248000"; -char* initEffects::ladspaDeclipEffectString(QStringList) { +const char* initEffects::ladspaDeclipEffectString(QStringList) +{ return qstrdup(QString(jackString + "1195truefalsetrue1.0000001.000000true").toUtf8()); } /* -char* initEffects::ladspaVocoderEffectString(QStringList params) +const char* initEffects::ladspaVocoderEffectString(QStringList params) { return qstrdup( QString(jackString + "1441truefalsetrue1.0000001.000000truetrue0.0000000.000000true%1%1true%1%1true%1%1true%1%1true%2%2true%2%2true%2%2true%2%2true%3%3true%3%3true%3%3true%3%3true%4%4true%4%4true%4%4true%4%4").arg(params[0]).arg(params[1]).arg(params[2]).arg(params[3])); }*/ -char* initEffects::ladspaVinylEffectString(QStringList params) { +const char* initEffects::ladspaVinylEffectString(QStringList params) +{ return qstrdup(QString(jackString + "1905truefalsetrue1.0000001.000000%1%2%3%4%5").arg(params[0]).arg(params[1]).arg(params[2]).arg(params[3]).arg(params[4]).toUtf8()); } -char* initEffects::ladspaPitchEffectString(QStringList params) { +const char* initEffects::ladspaPitchEffectString(QStringList params) +{ return qstrdup(QString(jackString + "1433truefalsetrue1.01.0truetrue%1%1true4.0000004.000000").arg(params[0]).toUtf8()); } -char* initEffects::ladspaRoomReverbEffectString(QStringList params) { +const char* initEffects::ladspaRoomReverbEffectString(QStringList params) +{ return qstrdup(QString(jackString + "1216truefalsetrue1.0000001.000000truetrue%1%1true%2%2true%3%3true0.7500000.750000true-70.000000-70.000000true0.0000000.000000true-17.500000-17.500000").arg(params[0]).arg(params[1]).arg(params[2]).toUtf8()); } -char* initEffects::ladspaReverbEffectString(QStringList params) { +const char* initEffects::ladspaReverbEffectString(QStringList params) +{ return qstrdup(QString(jackString + "1423true falsetrue 1.0000001.000000 truetrue%1 %1true%2%2true0.2500000.250000").arg(params[0]).arg(params[1]).toUtf8()); } -char* initEffects::ladspaEqualizerEffectString(QStringList params) { +const char* initEffects::ladspaEqualizerEffectString(QStringList params) +{ return qstrdup(QString(jackString + "1901true falsetrue 1.0000001.000000%1%2 %3").arg(params[0]).arg(params[1]).arg(params[2]).toUtf8()); } -char* initEffects::ladspaLimiterEffectString(QStringList params) { +const char* initEffects::ladspaLimiterEffectString(QStringList params) +{ return qstrdup(QString(jackString + "1913truefalsetrue1.0000001.000000%1%2%3").arg(params[0]).arg(params[1]).arg(params[2]).toUtf8()); } -char* initEffects::ladspaPitchShifterEffectString(QStringList params) { +const char* initEffects::ladspaPitchShifterEffectString(QStringList params) +{ return qstrdup(QString(jackString + "1193truefalsetrue1.0000001.000000truetrue%1%1").arg(params[0]).toUtf8()); } -char* initEffects::ladspaRateScalerEffectString(QStringList params) { +const char* initEffects::ladspaRateScalerEffectString(QStringList params) +{ return qstrdup(QString(jackString + "1417truefalsetrue1.0000001.000000truetrue%1%1").arg(params[0]).toUtf8()); } -char* initEffects::ladspaPhaserEffectString(QStringList params) { +const char* initEffects::ladspaPhaserEffectString(QStringList params) +{ return qstrdup(QString(jackString + "1217truefalsetrue1.0000001.000000truetrue%1%1true%2%2true%3%3true%4%4").arg(params[0]).arg(params[1]).arg(params[2]).arg(params[3]).toUtf8()); } -QDomDocument initEffects::createDescriptionFromMlt(Mlt::Repository* repository, const QString& type, const QString& filtername) { +QDomDocument initEffects::createDescriptionFromMlt(Mlt::Repository* repository, const QString& /*type*/, const QString& filtername) +{ QDomDocument ret; Mlt::Properties *metadata = repository->metadata(filter_type, filtername.toAscii().data()); @@ -398,6 +503,7 @@ QDomDocument initEffects::createDescriptionFromMlt(Mlt::Repository* repository, if (metadata->get("title") && metadata->get("identifier")) { QDomElement eff = ret.createElement("effect"); eff.setAttribute("tag", metadata->get("identifier")); + eff.setAttribute("id", metadata->get("identifier")); QDomElement name = ret.createElement("name"); name.appendChild(ret.createTextNode(metadata->get("title"))); @@ -408,16 +514,12 @@ QDomDocument initEffects::createDescriptionFromMlt(Mlt::Repository* repository, QDomElement author = ret.createElement("author"); author.appendChild(ret.createTextNode(metadata->get("creator"))); - QDomElement prop = ret.createElement("properties"); - prop.setAttribute("id", metadata->get("identifier")); - prop.setAttribute("tag", metadata->get("identifier")); eff.appendChild(name); eff.appendChild(author); eff.appendChild(desc); - eff.appendChild(prop); Mlt::Properties param_props((mlt_properties) metadata->get_data("parameters")); - for (int j = 0; param_props.is_valid() && j < param_props.count();j++) { + 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))); @@ -428,10 +530,16 @@ QDomDocument initEffects::createDescriptionFromMlt(Mlt::Repository* repository, if (paramdesc.get("minimum")) params.setAttribute("min", paramdesc.get("minimum")); if (QString(paramdesc.get("type")) == "integer") params.setAttribute("type", "constant"); + if (QString(paramdesc.get("type")) == "float") { + params.setAttribute("type", "constant"); + params.setAttribute("factor", "1000"); + if (paramdesc.get("maximum")) params.setAttribute("max", QString(paramdesc.get("maximum")).toFloat()*1000.0); + if (paramdesc.get("minimum")) params.setAttribute("min", QString(paramdesc.get("minimum")).toFloat()*1000.0); + } if (QString(paramdesc.get("type")) == "boolean") params.setAttribute("type", "bool"); if (!QString(paramdesc.get("format")).isEmpty() && QString(paramdesc.get("type")) != "geometry") { - params.setAttribute("type", "complex"); + params.setAttribute("type", "geometry"); params.setAttribute("format", paramdesc.get("format")); } if (!QString(paramdesc.get("format")).isEmpty() && QString(paramdesc.get("type")) == "geometry") { @@ -455,6 +563,8 @@ QDomDocument initEffects::createDescriptionFromMlt(Mlt::Repository* repository, ret.appendChild(eff); } } + delete metadata; + metadata = 0; /* QString outstr; QTextStream str(&outstr); ret.save(str, 2); @@ -462,19 +572,32 @@ QDomDocument initEffects::createDescriptionFromMlt(Mlt::Repository* repository, return ret; } -void initEffects::fillTransitionsList(Mlt::Repository * repository, EffectsList* transitions, QStringList names) { +void initEffects::fillTransitionsList(Mlt::Repository * repository, EffectsList* transitions, QStringList names) +{ + // remove transitions that are not implemented + int pos = names.indexOf("mix"); + if (pos != -1) names.takeAt(pos); + pos = names.indexOf("region"); + if (pos != -1) names.takeAt(pos); foreach(const QString &name, names) { QDomDocument ret; QDomElement ktrans = ret.createElement("ktransition"); ret.appendChild(ktrans); + ktrans.setAttribute("tag", name); QDomElement tname = ret.createElement("name"); + + QDomElement desc = ret.createElement("description"); + QList paramList; Mlt::Properties *metadata = repository->metadata(transition_type, name.toAscii().data()); //kDebug() << filtername; if (metadata && metadata->is_valid()) { + + desc.appendChild(ret.createTextNode(metadata->get("description"))); + Mlt::Properties param_props((mlt_properties) metadata->get_data("parameters")); - for (int j = 0; param_props.is_valid() && j < param_props.count();j++) { + 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))); @@ -517,43 +640,69 @@ void initEffects::fillTransitionsList(Mlt::Repository * repository, EffectsList* ktrans.appendChild(tname); } + delete metadata; + metadata = 0; //kDebug() << ret.toString(); } else { + // Check for Kdenlive installed luma files, add empty string at start for no luma + QStringList imagenamelist = QStringList() << i18n("None"); + QStringList imagefiles = QStringList() << QString(); + QStringList filters; + filters << "*.pgm" << "*.png"; + + QStringList customLumas = KGlobal::dirs()->findDirs("appdata", "lumas"); + foreach(const QString &folder, customLumas) { + QStringList filesnames = QDir(folder).entryList(filters, QDir::Files); + foreach(const QString &fname, filesnames) { + imagenamelist.append(fname); + imagefiles.append(folder + '/' + fname); + } + } + + // Check for MLT lumas + KUrl folder(mlt_environment("MLT_DATA")); + folder.addPath("lumas"); + folder.addPath(mlt_environment("MLT_NORMALISATION")); + QDir lumafolder(folder.path()); + QStringList filesnames = lumafolder.entryList(filters, QDir::Files); + foreach(const QString &fname, filesnames) { + imagenamelist.append(fname); + KUrl path(folder); + path.addPath(fname); + imagefiles.append(path.toLocalFile()); + } + if (name == "luma") { + ktrans.setAttribute("id", name); + tname.appendChild(ret.createTextNode("Wipe")); + desc.appendChild(ret.createTextNode("Applies a stationary transition between the current and next frames")); - tname.appendChild(ret.createTextNode("Luma")); - - QString path(mlt_environment("MLT_DATA")); - path.append("/lumas/").append(mlt_environment("MLT_NORMALISATION")); - Mlt::Properties entries; - mlt_properties_dir_list(entries.get_properties(), path.toAscii().data(), "*.*", 1); - kDebug() << path << entries.count(); - QString imagefiles; - //QStringList imagelist; - QString imagenamelist; - for (int i = 0;i < entries.count();i++) { - //if (!imagefiles.isEmpty()) // add empty entry too - imagefiles.append(","); - imagefiles.append(entries.get(i)); - //imagelist << entries.get(i); - imagenamelist.append(","); - imagenamelist.append(KUrl(entries.get(i)).fileName()); - } paramList.append(quickParameterFill(ret, "Softness", "softness", "double", "0", "0", "100", "", "", "100")); paramList.append(quickParameterFill(ret, "Invert", "invert", "bool", "0", "0", "1")); - paramList.append(quickParameterFill(ret, "ImageFile", "resource", "list", "", "", "", imagefiles, imagenamelist)); + paramList.append(quickParameterFill(ret, "Image File", "resource", "list", "", "", "", imagefiles.join(","), imagenamelist.join(","))); + paramList.append(quickParameterFill(ret, "Reverse Transition", "reverse", "bool", "0", "0", "1")); //thumbnailer.prepareThumbnailsCall(imagelist); } else if (name == "composite") { - paramList.append(quickParameterFill(ret, "Geometry", "geometry", "geometry", "0;0;100;100;100", "-500;-500;-500;-500;0", "500;500;500;500;100")); + desc.appendChild(ret.createTextNode("A key-framable alpha-channel compositor for two frames.")); + paramList.append(quickParameterFill(ret, "Geometry", "geometry", "geometry", "0%,0%:100%x100%:100", "-500;-500;-500;-500;0", "500;500;500;500;100")); + paramList.append(quickParameterFill(ret, "Alpha Channel Operation", "operator", "list", "over", "", "", "over,and,or,xor", "over,and,or,xor")); + paramList.append(quickParameterFill(ret, "Align", "aligned", "bool", "1", "0", "1")); + paramList.append(quickParameterFill(ret, "Fill", "fill", "bool", "0", "0", "1")); + paramList.append(quickParameterFill(ret, "Distort", "distort", "bool", "0", "0", "1")); + paramList.append(quickParameterFill(ret, "Wipe File", "luma", "list", "", "", "", imagefiles.join(","), imagenamelist.join(","))); + paramList.append(quickParameterFill(ret, "Wipe Softness", "softness", "double", "0", "0", "100", "", "", "100")); + paramList.append(quickParameterFill(ret, "Wipe Invert", "luma_invert", "bool", "0", "0", "1")); + paramList.append(quickParameterFill(ret, "Force Progressive Rendering", "progressive", "bool", "1", "0", "1")); + paramList.append(quickParameterFill(ret, "Force Deinterlace Overlay", "deinterlace", "bool", "0", "0", "1")); tname.appendChild(ret.createTextNode("Composite")); - - QDomDocument ret1; + ktrans.setAttribute("id", "composite"); + /*QDomDocument ret1; QDomElement ktrans1 = ret1.createElement("ktransition"); ret1.appendChild(ktrans1); ktrans1.setAttribute("tag", name); QDomElement tname1 = ret.createElement("name"); - tname1.appendChild(ret1.createTextNode("PIP")); + tname1.appendChild(ret1.createTextNode("PIP"));*/ } else if (name == "mix") { tname.appendChild(ret.createTextNode("Mix")); @@ -581,8 +730,9 @@ void initEffects::fillTransitionsList(Mlt::Repository * repository, EffectsList* } - paramList.append(quickParameterFill(ret, "Reverse Transition", "reverse", "bool", "0", "0", "1")); + ktrans.appendChild(tname); + ktrans.appendChild(desc); foreach(const QDomElement &e, paramList) { ktrans.appendChild(e); @@ -590,21 +740,32 @@ void initEffects::fillTransitionsList(Mlt::Repository * repository, EffectsList* transitions->append(ret.documentElement()); - kDebug() << "//// //// TRANSITON XML"; - kDebug() << ret.toString(); + //kDebug() << "//// //// TRANSITON XML"; + //kDebug() << ret.toString(); /* */ } - QString wipetrans = "WipeDirection Align"; + QString slidetrans = "SlideSlide image from one side to anotherDirection AlignForce Progressive RenderingForce Deinterlace OverlayInvert"; QDomDocument ret; - ret.setContent(wipetrans); + ret.setContent(slidetrans); transitions->append(ret.documentElement()); + + QString dissolve = "DissolveFade out one video while fading in the other videoReverse"; + QDomDocument dissolveDoc; + dissolveDoc.setContent(dissolve); + transitions->append(dissolveDoc.documentElement()); + + /*QString alphatrans = "Alpha transparencyMake alpha channel transparentDirectionRescaleAlign"; + QDomDocument ret2; + ret2.setContent(alphatrans); + transitions->append(ret2.documentElement());*/ } -QDomElement initEffects::quickParameterFill(QDomDocument & doc, QString name, QString tag, QString type, QString def, QString min, QString max, QString list, QString listdisplaynames, QString factor, QString namedesc, QString format) { +QDomElement initEffects::quickParameterFill(QDomDocument & doc, QString name, QString tag, QString type, QString def, QString min, QString max, QString list, QString listdisplaynames, QString factor, QString namedesc, QString format) +{ QDomElement parameter = doc.createElement("parameter"); parameter.setAttribute("tag", tag); parameter.setAttribute("default", def);