X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Finiteffects.cpp;h=6f0608fa47ff85c1c623dd714e40846346315984;hb=af20dd7143d1889c1424349b666bd51353cc6924;hp=a388b11394a7ab463d6e3d33fb6e1636eff79c99;hpb=14463a722064177b1699d3ab562e3a89e0a39da9;p=kdenlive diff --git a/src/initeffects.cpp b/src/initeffects.cpp index a388b113..6f0608fa 100644 --- a/src/initeffects.cpp +++ b/src/initeffects.cpp @@ -134,7 +134,7 @@ QDomDocument initEffects::getUsedCustomEffects(QMap effectids } //static -Mlt::Repository *initEffects::parseEffectFiles() +void initEffects::parseEffectFiles() { QStringList::Iterator more; QStringList::Iterator it; @@ -144,20 +144,22 @@ Mlt::Repository *initEffects::parseEffectFiles() Mlt::Repository *repository = Mlt::Factory::init(); if (!repository) { kDebug() << "Repository didn't finish initialisation" ; - return NULL; + return; } // 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 +167,8 @@ Mlt::Repository *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; @@ -214,7 +217,8 @@ Mlt::Repository *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); } @@ -261,7 +265,8 @@ Mlt::Repository *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); } @@ -271,7 +276,8 @@ Mlt::Repository *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,15 +286,14 @@ Mlt::Repository *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); } MainWindow::videoEffects.clearList(); foreach(const QDomElement & effect, videoEffectsMap) MainWindow::videoEffects.append(effect); - - return repository; } // static @@ -313,21 +318,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(e.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 @@ -338,7 +350,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; @@ -399,7 +413,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); @@ -409,6 +423,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) @@ -550,8 +573,9 @@ void initEffects::fillTransitionsList(Mlt::Repository *repository, EffectsList * QDomElement desc = ret.createElement("description"); ktrans.appendChild(tname); ktrans.appendChild(desc); - Mlt::Properties *metadata = repository->metadata(transition_type, name.toUtf8().data()); - if (!customTransitions.contains(name) && metadata && metadata->is_valid()) { + Mlt::Properties *metadata = NULL; + if (!customTransitions.contains(name)) metadata = repository->metadata(transition_type, name.toUtf8().data()); + if (metadata && metadata->is_valid()) { // If possible, set name and description. if (metadata->get("title") && metadata->get("identifier")) tname.appendChild(ret.createTextNode(metadata->get("title"))); @@ -591,8 +615,6 @@ void initEffects::fillTransitionsList(Mlt::Repository *repository, EffectsList * params.appendChild(pname); ktrans.appendChild(params); } - delete metadata; - metadata = 0; } else { /* * Check for Kdenlive installed luma files, add empty string at @@ -643,16 +665,16 @@ 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")); /*paramList.append(quickParameterFill(ret, i18n("Rotate Y"), "rotate_y", "simplekeyframe", "0", "-1800", "1800", QString(), QString(), "10")); paramList.append(quickParameterFill(ret, i18n("Rotate Z"), "rotate_z", "simplekeyframe", "0", "-1800", "1800", QString(), QString(), "10"));*/ - paramList.append(quickParameterFill(ret, i18n("Fix Shear Y"), "fix_shear_y", "double", "0", "0", "360")); - paramList.append(quickParameterFill(ret, i18n("Fix Shear X"), "fix_shear_x", "double", "0", "0", "360")); - paramList.append(quickParameterFill(ret, i18n("Fix Shear Z"), "fix_shear_z", "double", "0", "0", "360")); + paramList.append(quickParameterFill(ret, i18n("Fix Shear Y"), "shear_y", "double", "0", "0", "360")); + paramList.append(quickParameterFill(ret, i18n("Fix Shear X"), "shear_x", "double", "0", "0", "360")); + paramList.append(quickParameterFill(ret, i18n("Fix Shear Z"), "shear_z", "double", "0", "0", "360")); } else if (name == "mix") { tname.appendChild(ret.createTextNode(i18n("Mix"))); } else if (name == "region") { @@ -674,7 +696,8 @@ void initEffects::fillTransitionsList(Mlt::Repository *repository, EffectsList * foreach(const QDomElement & e, paramList) ktrans.appendChild(e); } - + delete metadata; + metadata = 0; // Add the transition to the global list. transitions->append(ret.documentElement()); //kDebug() << ret.toString();