X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Finiteffects.cpp;h=e2f7734e6e4073ecbfe7f96b5d9766af4579d69d;hb=4e1767cbe4896b2718bff9d0413239cef3394873;hp=1acd593cbd42b4dc7e6925578f21e7be80f4e9a6;hpb=21a6715f382fe869867fe260081340817ea5b629;p=kdenlive diff --git a/src/initeffects.cpp b/src/initeffects.cpp index 1acd593c..e2f7734e 100644 --- a/src/initeffects.cpp +++ b/src/initeffects.cpp @@ -20,7 +20,6 @@ #include "initeffects.h" #include "kdenlivesettings.h" #include "effectslist.h" -#include "effectstackedit.h" #include "mainwindow.h" #include @@ -32,6 +31,8 @@ #include #include +#include "locale.h" + initEffectsThumbnailer::initEffectsThumbnailer() : QThread() { @@ -49,10 +50,10 @@ 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)) { + if (!MainWindow::m_lumacache.contains(entry)) { QImage pix(entry); //if (!pix.isNull()) - EffectStackEdit::iconCache[entry] = pix.scaled(30, 30); + MainWindow::m_lumacache.insert(entry, pix.scaled(30, 30, Qt::KeepAspectRatio, Qt::SmoothTransformation)); kDebug() << "stored"; } } @@ -134,7 +135,7 @@ QDomDocument initEffects::getUsedCustomEffects(QMap effectids } //static -void initEffects::parseEffectFiles() +void initEffects::parseEffectFiles(const QString &locale) { QStringList::Iterator more; QStringList::Iterator it; @@ -147,17 +148,22 @@ void initEffects::parseEffectFiles() return; } + // Warning: Mlt::Factory::init() resets the locale to the default system value, make sure we keep correct locale + if (!locale.isEmpty()) setlocale(LC_NUMERIC, locale.toUtf8().constData()); + // Retrieve the list of MLT's available effects. Mlt::Properties *filters = repository->filters(); QStringList filtersList; - for (int i = 0; i < filters->count(); ++i) + int max = filters->count(); + for (int i = 0; i < max; ++i) filtersList << filters->get_name(i); delete filters; // Retrieve the list of available producers. Mlt::Properties *producers = repository->producers(); QStringList producersList; - for (int i = 0; i < producers->count(); ++i) + max = producers->count(); + for (int i = 0; i < max; ++i) producersList << producers->get_name(i); KdenliveSettings::setProducerslist(producersList); delete producers; @@ -165,7 +171,8 @@ void initEffects::parseEffectFiles() // Retrieve the list of available transitions. Mlt::Properties *transitions = repository->transitions(); QStringList transitionsItemList; - for (int i = 0; i < transitions->count(); ++i) + max = transitions->count(); + for (int i = 0; i < max; ++i) transitionsItemList << transitions->get_name(i); delete transitions; @@ -193,8 +200,10 @@ void initEffects::parseEffectFiles() while (!in.atEnd()) { QString black = in.readLine().simplified(); if (!black.isEmpty() && !black.startsWith('#') && - mltFiltersList.contains(black)) + mltFiltersList.contains(black)) { mltFiltersList.removeAll(black); + } + } file2.close(); } @@ -214,15 +223,15 @@ void initEffects::parseEffectFiles() QMap audioEffectsMap; // Create transitions - for (int i = 0; i < MainWindow::transitions.count(); ++i) { + max = MainWindow::transitions.count(); + for (int i = 0; i < max; ++i) { effectInfo = MainWindow::transitions.at(i); effectsMap.insert(effectInfo.firstChildElement("name").text().toLower().toUtf8().data(), effectInfo); } MainWindow::transitions.clearList(); foreach(const QDomElement & effect, effectsMap) MainWindow::transitions.append(effect); - effectsMap.clear(); - + effectsMap.clear(); // Create effects from MLT foreach(const QString & filtername, mltFiltersList) { QDomDocument doc = createDescriptionFromMlt(repository, "filters", filtername); @@ -235,7 +244,9 @@ void initEffects::parseEffectFiles() if (desc.startsWith("Process audio using a SoX")) { // Remove MLT's SOX generated effects since the parameters properties are unusable for us } - else audioEffectsMap.insert(doc.documentElement().firstChildElement("name").text().toLower().toUtf8().data(), doc.documentElement()); + else { + audioEffectsMap.insert(doc.documentElement().firstChildElement("name").text().toLower().toUtf8().data(), doc.documentElement()); + } } } else @@ -261,9 +272,13 @@ void initEffects::parseEffectFiles() } // Create custom effects - for (int i = 0; i < MainWindow::customEffects.count(); ++i) { + max = MainWindow::customEffects.count(); + for (int i = 0; i < max; ++i) { effectInfo = MainWindow::customEffects.at(i); - effectsMap.insert(effectInfo.firstChildElement("name").text().toLower().toUtf8().data(), effectInfo); + if (effectInfo.tagName() == "effectgroup") { + effectsMap.insert(effectInfo.attribute("name").toUtf8().data(), effectInfo); + } + else effectsMap.insert(effectInfo.firstChildElement("name").text().toUtf8().data(), effectInfo); } MainWindow::customEffects.clearList(); foreach(const QDomElement & effect, effectsMap) @@ -271,7 +286,8 @@ void initEffects::parseEffectFiles() effectsMap.clear(); // Create audio effects - for (int i = 0; i < MainWindow::audioEffects.count(); ++i) { + max = MainWindow::audioEffects.count(); + for (int i = 0; i < max; ++i) { effectInfo = MainWindow::audioEffects.at(i); audioEffectsMap.insert(effectInfo.firstChildElement("name").text().toLower().toUtf8().data(), effectInfo); } @@ -280,7 +296,8 @@ void initEffects::parseEffectFiles() MainWindow::audioEffects.append(effect); // Create video effects - for (int i = 0; i < MainWindow::videoEffects.count(); ++i) { + max = MainWindow::videoEffects.count(); + for (int i = 0; i < max; ++i) { effectInfo = MainWindow::videoEffects.at(i); videoEffectsMap.insert(effectInfo.firstChildElement("name").text().toLower().toUtf8().data(), effectInfo); } @@ -311,21 +328,28 @@ void initEffects::parseCustomEffectsFile() QDomDocument doc; QDomNodeList effects; QDomElement e; + int unknownGroupCount = 0; foreach(const QString & filename, fileList) { QString itemName = KUrl(path + filename).path(); QFile file(itemName); doc.setContent(&file, false); file.close(); - effects = doc.elementsByTagName("effect"); - if (effects.count() != 1) { - kDebug() << "More than one effect in file " << itemName << ", not supported yet"; - } else { - e = effects.item(0).toElement(); - effectsMap.insert(e.firstChildElement("name").text().toLower().toUtf8().data(), e); + QDomElement base = doc.documentElement(); + if (base.tagName() == "effectgroup") { + QString groupName = base.attribute("name"); + if (groupName.isEmpty()) { + groupName = i18n("Group %1", unknownGroupCount); + base.setAttribute("name", groupName); + unknownGroupCount++; + } + effectsMap.insert(groupName.toLower().toUtf8().data(), base); + } else if (base.tagName() == "effect") { + effectsMap.insert(base.firstChildElement("name").text().toLower().toUtf8().data(), base); } + else kDebug() << "Unsupported effect file: " << itemName; } foreach(const QDomElement & effect, effectsMap) - MainWindow::customEffects.append(effect); + MainWindow::customEffects.append(effect); } // static @@ -336,7 +360,9 @@ void initEffects::parseEffectFile(EffectsList *customEffectList, EffectsList *au doc.setContent(&file, false); file.close(); QDomElement documentElement; - QDomNodeList effects = doc.elementsByTagName("effect"); + QDomNodeList effects; + QDomElement base = doc.documentElement(); + effects = doc.elementsByTagName("effect"); if (effects.count() == 0) { kDebug() << "Effect broken: " << name; @@ -397,7 +423,7 @@ void initEffects::parseEffectFile(EffectsList *customEffectList, EffectsList *au } // Parse effect information. - if ((filtersList.contains(tag) || producersList.contains(tag))) { + if (base.tagName() != "effectgroup" && (filtersList.contains(tag) || producersList.contains(tag))) { QString type = documentElement.attribute("type", QString()); if (type == "audio") audioEffectList->append(documentElement); @@ -407,6 +433,15 @@ void initEffects::parseEffectFile(EffectsList *customEffectList, EffectsList *au videoEffectList->append(documentElement); } } + if (base.tagName() == "effectgroup") { + QString type = base.attribute("type", QString()); + if (type == "audio") + audioEffectList->append(base); + else if (type == "custom") + customEffectList->append(base); + else + videoEffectList->append(base); + } } QDomDocument initEffects::createDescriptionFromMlt(Mlt::Repository* repository, const QString& /*type*/, const QString& filtername) @@ -450,16 +485,23 @@ QDomDocument initEffects::createDescriptionFromMlt(Mlt::Repository* repository, 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 (params.attribute("name") == "argument") { + // This parameter has to be given as attribute when using command line, do not show it in Kdenlive + continue; + } if (paramdesc.get("maximum")) params.setAttribute("max", paramdesc.get("maximum")); if (paramdesc.get("minimum")) params.setAttribute("min", paramdesc.get("minimum")); QString paramType = paramdesc.get("type"); - if (paramType == "integer") - params.setAttribute("type", "constant"); + if (paramType == "integer") { + if (params.attribute("min") == "0" && params.attribute("max") == "1") + params.setAttribute("type", "bool"); + else params.setAttribute("type", "constant"); + + } else if (paramType == "float") { params.setAttribute("type", "constant"); // param type is float, set default decimals to 3 @@ -484,6 +526,12 @@ QDomDocument initEffects::createDescriptionFromMlt(Mlt::Repository* repository, QDomElement pname = ret.createElement("name"); pname.appendChild(ret.createTextNode(paramdesc.get("title"))); params.appendChild(pname); + + if (paramdesc.get("description")) { + QDomElement desc = ret.createElement("comment"); + desc.appendChild(ret.createTextNode(paramdesc.get("description"))); + params.appendChild(desc); + } eff.appendChild(params); } @@ -640,7 +688,7 @@ void initEffects::fillTransitionsList(Mlt::Repository *repository, EffectsList * paramList.append(quickParameterFill(ret, "keyed", "keyed", "fixed", "1", "1", "1")); paramList.append(quickParameterFill(ret, i18n("Geometry"), "geometry", "geometry", "0/0:100%x100%:100%", "0/0:100%x100%:100%", "0/0:100%x100%:100%", "", "", "", "", "", "true")); - + paramList.append(quickParameterFill(ret, i18n("Distort"), "distort", "bool", "0", "0", "1")); paramList.append(quickParameterFill(ret, i18n("Rotate X"), "rotate_x", "addedgeometry", "0", "-1800", "1800", QString(), QString(), "10")); paramList.append(quickParameterFill(ret, i18n("Rotate Y"), "rotate_y", "addedgeometry", "0", "-1800", "1800", QString(), QString(), "10")); paramList.append(quickParameterFill(ret, i18n("Rotate Z"), "rotate_z", "addedgeometry", "0", "-1800", "1800", QString(), QString(), "10"));