X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Finiteffects.cpp;h=96c7e6478f354874a0a2eba4f3406d17f8fa6641;hb=9c59a265a6ded9306fa7afa13b18c96e25d45f77;hp=7af74c379de1e8d3f6fcc94d165eb031ce9ebfeb;hpb=2eff11b46f9a06c7f64463e534d3cb7042697e7c;p=kdenlive diff --git a/src/initeffects.cpp b/src/initeffects.cpp index 7af74c37..96c7e647 100644 --- a/src/initeffects.cpp +++ b/src/initeffects.cpp @@ -21,21 +21,53 @@ #include #include #include +#include #include #include #include #include "initeffects.h" +#include "kdenlivesettings.h" +#include "effectslist.h" +#include "effectstackedit.h" +#include "mainwindow.h" + +initEffectsThumbnailer::initEffectsThumbnailer() { + +} + +void initEffectsThumbnailer::prepareThumbnailsCall(const QStringList& list) { + m_list = list; + start(); + kDebug() << "done"; +} + +void initEffectsThumbnailer::run() { + foreach(const QString &entry, m_list) { + kDebug() << entry; + if (!entry.isEmpty() && (entry.endsWith(".png") || entry.endsWith(".pgm"))) { + if (!EffectStackEdit::iconCache.contains(entry)) { + QImage pix(entry); + //if (!pix.isNull()) + EffectStackEdit::iconCache[entry] = pix.scaled(30, 30); + kDebug() << "stored"; + } + } + } +} + +initEffectsThumbnailer initEffects::thumbnailer; initEffects::initEffects() { + } initEffects::~initEffects() { } //static -Mlt::Repository *initEffects::parseEffectFiles(EffectsList *audioEffectList, EffectsList *videoEffectList, EffectsList* transitionsList) { +Mlt::Repository *initEffects::parseEffectFiles() { QStringList::Iterator more; QStringList::Iterator it; QStringList fileList; @@ -71,7 +103,7 @@ Mlt::Repository *initEffects::parseEffectFiles(EffectsList *audioEffectList, Eff transitionsItemList << transitions->get_name(i); } delete transitions; - fillTransitionsList(repository, transitionsList, transitionsItemList); + fillTransitionsList(repository, &MainWindow::transitions, transitionsItemList); KGlobal::dirs()->addResourceType("ladspa_plugin", 0, "lib/ladspa"); KGlobal::dirs()->addResourceDir("ladspa_plugin", "/usr/lib/ladspa"); @@ -86,26 +118,54 @@ Mlt::Repository *initEffects::parseEffectFiles(EffectsList *audioEffectList, Eff 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(); - parseEffectFile(audioEffectList, videoEffectList, itemName, filtersList, producersList); + parseEffectFile(&MainWindow::customEffects, &MainWindow::audioEffects, &MainWindow::videoEffects, itemName, filtersList, producersList); // kDebug()<<"// FOUND EFFECT FILE: "<append(doc.documentElement()); + MainWindow::videoEffects.append(doc.documentElement()); } return repository; } // static -void initEffects::parseEffectFile(EffectsList *audioEffectList, EffectsList *videoEffectList, QString name, QStringList filtersList, QStringList producersList) { +void initEffects::parseCustomEffectsFile() { + MainWindow::customEffects.clear(); + QString path = KStandardDirs::locateLocal("data", "kdenlive/effects/", true); + QDir directory = QDir(path); + QStringList filter; + filter << "*.xml"; + const QStringList fileList = directory.entryList(filter, QDir::Files); + QString itemName; + foreach(const QString filename, fileList) { + itemName = KUrl(path + filename).path(); + QDomDocument doc; + QFile file(itemName); + doc.setContent(&file, false); + file.close(); + QDomNodeList effects = doc.elementsByTagName("effect"); + if (effects.count() != 1) { + kDebug() << "More than one effect in file " << itemName << ", NOT SUPPORTED YET"; + } else { + QDomElement e = effects.item(0).toElement(); + MainWindow::customEffects.append(e); + } + } +} + +// static +void initEffects::parseEffectFile(EffectsList *customEffectList, EffectsList *audioEffectList, EffectsList *videoEffectList, QString name, QStringList filtersList, QStringList producersList) { QDomDocument doc; QFile file(name); doc.setContent(&file, false); + file.close(); QDomElement documentElement = doc.documentElement(); QDomNodeList effects = doc.elementsByTagName("effect"); @@ -135,14 +195,11 @@ void initEffects::parseEffectFile(EffectsList *audioEffectList, EffectsList *vid 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") isAudioEffect = true; - //else if (propselement.attribute("type", QString::null) == "custom") type = CUSTOMEFFECT; - //else type = VIDEOEFFECT; - } - if (isAudioEffect) audioEffectList->append(documentElement); - else videoEffectList->append(documentElement); + QString type = propselement.attribute("type", QString::null); + if (type == "audio") audioEffectList->append(documentElement); + else if (type == "custom") customEffectList->append(documentElement); + else videoEffectList->append(documentElement); + } else videoEffectList->append(documentElement); } /* @@ -230,7 +287,7 @@ char* initEffects::ladspaEffectString(int ladspaId, QStringList params) { return ladspaEqualizerEffectString(params); else { kDebug() << "++++++++++ ASKING FOR UNKNOWN LADSPA EFFECT: " << ladspaId << endl; - return(""); + return (char *) ""; } } @@ -372,12 +429,22 @@ 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()) { + 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")); @@ -403,12 +470,52 @@ QDomDocument initEffects::createDescriptionFromMlt(Mlt::Repository* repository, } void initEffects::fillTransitionsList(Mlt::Repository * repository, EffectsList* transitions, QStringList names) { - foreach(QString name, names) { + foreach(const QString &name, names) { QDomDocument ret; + QDomElement ktrans = ret.createElement("ktransition"); + ret.appendChild(ktrans); + ktrans.setAttribute("tag", name); + QDomElement tname = ret.createElement("name"); + QList paramList; Mlt::Properties *metadata = repository->metadata(transition_type, name.toAscii().data()); //kDebug() << filtername; if (metadata && metadata->is_valid()) { - QDomElement ktrans = ret.createElement("ktransition"); + 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")) { ktrans.setAttribute("tag", name); @@ -416,36 +523,37 @@ void initEffects::fillTransitionsList(Mlt::Repository * repository, EffectsList* tname.appendChild(ret.createTextNode(metadata->get("title"))); ktrans.appendChild(tname); } - transitions->append(ret.documentElement()); - kDebug() << ret.toString(); + + //kDebug() << ret.toString(); } else { if (name == "luma") { - QDomDocument ret; - QDomElement ktrans = ret.createElement("ktransition"); - ret.appendChild(ktrans); - ktrans.setAttribute("tag", name); - QDomElement tname = ret.createElement("name"); + tname.appendChild(ret.createTextNode("Luma")); - ktrans.appendChild(tname); - transitions->append(ret.documentElement()); - QDomDocument ret1; - QDomElement ktrans1 = ret1.createElement("ktransition"); - ret1.appendChild(ktrans1); - ktrans1.setAttribute("tag", name); - QDomElement tname1 = ret.createElement("name"); - tname1.appendChild(ret1.createTextNode("Lumafile")); - ktrans1.appendChild(tname1); - transitions->append(ret1.documentElement()); + 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)); + //thumbnailer.prepareThumbnailsCall(imagelist); + } else if (name == "composite") { - QDomDocument ret; - QDomElement ktrans = ret.createElement("ktransition"); - ret.appendChild(ktrans); - ktrans.setAttribute("tag", name); - QDomElement tname = ret.createElement("name"); + paramList.append(quickParameterFill(ret, "Geometry", "geometry", "geometry", "0;0;100;100;100", "-500;-500;-500;-500;0", "500;500;500;500;100")); tname.appendChild(ret.createTextNode("Composite")); - ktrans.appendChild(tname); - transitions->append(ret.documentElement()); QDomDocument ret1; QDomElement ktrans1 = ret1.createElement("ktransition"); @@ -453,28 +561,77 @@ void initEffects::fillTransitionsList(Mlt::Repository * repository, EffectsList* ktrans1.setAttribute("tag", name); QDomElement tname1 = ret.createElement("name"); tname1.appendChild(ret1.createTextNode("PIP")); - ktrans1.appendChild(tname1); - transitions->append(ret1.documentElement()); + } else if (name == "mix") { - QDomDocument ret; - QDomElement ktrans = ret.createElement("ktransition"); - ret.appendChild(ktrans); - ktrans.setAttribute("tag", name); - QDomElement tname = ret.createElement("name"); tname.appendChild(ret.createTextNode("Mix")); - ktrans.appendChild(tname); - transitions->append(ret.documentElement()); } else if (name == "affine") { - QDomDocument ret; - QDomElement ktrans = ret.createElement("ktransition"); - ret.appendChild(ktrans); - ktrans.setAttribute("tag", name); - QDomElement tname = ret.createElement("name"); tname.appendChild(ret.createTextNode("Affine")); - ktrans.appendChild(tname); - transitions->append(ret.documentElement()); + paramList.append(quickParameterFill(ret, "Rotate Y", "rotate_y", "double", "0", "0", "360")); + paramList.append(quickParameterFill(ret, "Rotate X", "rotate_x", "double", "0", "0", "360")); + paramList.append(quickParameterFill(ret, "Rotate Z", "rotate_z", "double", "0", "0", "360")); + paramList.append(quickParameterFill(ret, "Fix Rotate Y", "fix_rotate_y", "double", "0", "0", "360")); + paramList.append(quickParameterFill(ret, "Fix Rotate X", "fix_rotate_x", "double", "0", "0", "360")); + paramList.append(quickParameterFill(ret, "Fix Rotate Z", "fix_rotate_z", "double", "0", "0", "360")); + paramList.append(quickParameterFill(ret, "Shear Y", "shear_y", "double", "0", "0", "360")); + paramList.append(quickParameterFill(ret, "Shear X", "shear_x", "double", "0", "0", "360")); + paramList.append(quickParameterFill(ret, "Shear Z", "shear_z", "double", "0", "0", "360")); + paramList.append(quickParameterFill(ret, "Fix Shear Y", "fix_shear_y", "double", "0", "0", "360")); + paramList.append(quickParameterFill(ret, "Fix Shear X", "fix_shear_x", "double", "0", "0", "360")); + 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;100;100", "0;0;100;100;100", "0;0;100;100;100")); + tname.appendChild(ret.createTextNode("Composite")); + } else if (name == "region") { + tname.appendChild(ret.createTextNode("Region")); } + + + } + paramList.append(quickParameterFill(ret, "Reverse Transition", "reverse", "bool", "0", "0", "1")); + ktrans.appendChild(tname); + + foreach(const QDomElement &e, paramList) { + ktrans.appendChild(e); } + + transitions->append(ret.documentElement()); + kDebug() << "//// //// TRANSITON XML"; + kDebug() << ret.toString(); + /* + + + */ } + + QString wipetrans = "WipeDirection Align"; + QDomDocument ret; + ret.setContent(wipetrans); + transitions->append(ret.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 parameter = doc.createElement("parameter"); + parameter.setAttribute("tag", tag); + parameter.setAttribute("default", def); + parameter.setAttribute("type", type); + parameter.setAttribute("name", tag); + parameter.setAttribute("max", max); + parameter.setAttribute("min", min); + if (!list.isEmpty()) + parameter.setAttribute("paramlist", list); + if (!listdisplaynames.isEmpty()) + parameter.setAttribute("paramlistdisplay", listdisplaynames); + 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); + + return parameter; }