X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Feffectslist.cpp;h=1a09ebe32efd75dc6f9ca9e1353f2944932887e3;hb=b6d6c25f1bd07f11a0ceaf32a3a5bcaeab367336;hp=f3ac8877b8876cf0721374c42df330774d7063d3;hpb=41dece4cea069263ee17ab9d491964c1705fec6b;p=kdenlive diff --git a/src/effectslist.cpp b/src/effectslist.cpp index f3ac8877..1a09ebe3 100644 --- a/src/effectslist.cpp +++ b/src/effectslist.cpp @@ -22,7 +22,7 @@ #include -EffectsList::EffectsList() +EffectsList::EffectsList(bool indexRequired) : m_useIndex(indexRequired) { m_baseElement = createElement("list"); appendChild(m_baseElement); @@ -36,13 +36,13 @@ QDomElement EffectsList::getEffectByName(const QString & name) const { QString effectName; QDomNodeList effects = m_baseElement.childNodes(); - for (int i = 0; i < effects.count(); i++) { + for (int i = 0; i < effects.count(); ++i) { QDomElement effect = effects.at(i).toElement(); - QDomNode namenode = effect.elementsByTagName("name").item(0); - if (!namenode.isNull()) effectName = i18n(namenode.toElement().text().toUtf8().data()); + QDomElement namenode = effect.firstChildElement("name"); + if (!namenode.isNull()) effectName = i18n(namenode.text().toUtf8().data()); if (name == effectName) { QDomNodeList params = effect.elementsByTagName("parameter"); - for (int i = 0; i < params.count(); i++) { + for (int i = 0; i < params.count(); ++i) { QDomElement e = params.item(i).toElement(); if (!e.hasAttribute("value")) e.setAttribute("value", e.attribute("default")); @@ -54,29 +54,38 @@ QDomElement EffectsList::getEffectByName(const QString & name) const return QDomElement(); } + +void EffectsList::initEffect(const QDomElement &effect) const +{ + QDomNodeList params = effect.elementsByTagName("parameter"); + for (int i = 0; i < params.count(); ++i) { + QDomElement e = params.item(i).toElement(); + if (!e.hasAttribute("value")) + e.setAttribute("value", e.attribute("default")); + } +} + QDomElement EffectsList::getEffectByTag(const QString & tag, const QString & id) const { QDomNodeList effects = m_baseElement.childNodes(); - for (int i = 0; i < effects.count(); i++) { + for (int i = 0; i < effects.count(); ++i) { QDomElement effect = effects.at(i).toElement(); if (!id.isEmpty()) { if (effect.attribute("id") == id) { - QDomNodeList params = effect.elementsByTagName("parameter"); - for (int i = 0; i < params.count(); i++) { - QDomElement e = params.item(i).toElement(); - if (!e.hasAttribute("value")) - e.setAttribute("value", e.attribute("default")); + if (effect.tagName() == "effectgroup") { + // Effect group + QDomNodeList subeffects = effect.elementsByTagName("effect"); + for (int j = 0; j < subeffects.count(); j++) { + QDomElement sub = subeffects.at(j).toElement(); + initEffect(sub); + } } + else initEffect(effect); return effect; } } else if (!tag.isEmpty()) { if (effect.attribute("tag") == tag) { - QDomNodeList params = effect.elementsByTagName("parameter"); - for (int i = 0; i < params.count(); i++) { - QDomElement e = params.item(i).toElement(); - if (!e.hasAttribute("value")) - e.setAttribute("value", e.attribute("default")); - } + initEffect(effect); return effect; } } @@ -87,11 +96,13 @@ QDomElement EffectsList::getEffectByTag(const QString & tag, const QString & id) int EffectsList::hasEffect(const QString & tag, const QString & id) const { QDomNodeList effects = m_baseElement.childNodes(); - for (int i = 0; i < effects.count(); i++) { + for (int i = 0; i < effects.count(); ++i) { QDomElement effect = effects.at(i).toElement(); if (!id.isEmpty()) { - if (effect.attribute("id") == id) return i; - } else if (!tag.isEmpty() && effect.attribute("tag") == tag) return i; + if (effect.attribute("id") == id) return effect.attribute("kdenlive_ix").toInt(); + } else if (!tag.isEmpty() && effect.attribute("tag") == tag) { + return effect.attribute("kdenlive_ix").toInt(); + } } return -1; } @@ -100,8 +111,13 @@ QStringList EffectsList::effectIdInfo(const int ix) const { QStringList info; QDomElement effect = m_baseElement.childNodes().at(ix).toElement(); - QDomNode namenode = effect.elementsByTagName("name").item(0); - info << i18n(namenode.toElement().text().toUtf8().data()) << effect.attribute("tag") << effect.attribute("id"); + if (effect.tagName() == "effectgroup") { + QString groupName = effect.attribute("name"); + info << groupName << groupName << effect.attribute("id") << QString::number(Kdenlive::groupEffect); + } else { + QDomElement namenode = effect.firstChildElement("name"); + info << i18n(namenode.text().toUtf8().data()) << effect.attribute("tag") << effect.attribute("id"); + } return info; } @@ -109,10 +125,10 @@ QStringList EffectsList::effectNames() { QStringList list; QDomNodeList effects = m_baseElement.childNodes(); - for (int i = 0; i < effects.count(); i++) { + for (int i = 0; i < effects.count(); ++i) { QDomElement effect = effects.at(i).toElement(); - QDomNode namenode = effect.elementsByTagName("name").item(0); - if (!namenode.isNull()) list.append(i18n(namenode.toElement().text().toUtf8().data())); + QDomElement namenode = effect.firstChildElement("name"); + if (!namenode.isNull()) list.append(i18n(namenode.text().toUtf8().data())); } return list; } @@ -120,34 +136,38 @@ QStringList EffectsList::effectNames() QString EffectsList::getInfo(const QString & tag, const QString & id) const { QString info; - QDomElement effect = getEffectByTag(tag, id); - QDomNode namenode = effect.elementsByTagName("description").item(0); + return getEffectInfo(getEffectByTag(tag, id)); +} + +QString EffectsList::getInfoFromIndex(const int ix) const +{ + QString info; + return getEffectInfo(m_baseElement.childNodes().at(ix).toElement()); +} + +QString EffectsList::getEffectInfo(const QDomElement &effect) const +{ + QString info; + QDomElement namenode = effect.firstChildElement("description"); if (!namenode.isNull()) info = i18n(namenode.firstChild().nodeValue().simplified().toUtf8().data()); - namenode = effect.elementsByTagName("author").item(0); + namenode = effect.firstChildElement("author"); if (!namenode.isNull()) - info.append("
" + i18n("Author:") + " " + i18n(namenode.toElement().text().toUtf8().data())); + info.append("
" + i18n("Author:") + " " + i18n(namenode.text().toUtf8().data())); - return info; -} + namenode = effect.firstChildElement("version"); + if (!namenode.isNull()) + info.append(QString(" (%1)").arg(namenode.text())); -QString EffectsList::getInfoFromIndex(const int ix) const -{ - QString info; - QDomElement effect = m_baseElement.childNodes().at(ix).toElement(); - QDomNode namenode = effect.elementsByTagName("description").item(0); - if (!namenode.isNull()) info = i18n(namenode.toElement().text().toUtf8().data()); - namenode = effect.elementsByTagName("author").item(0); - if (!namenode.isNull()) info.append("
" + i18n("Author:") + " " + i18n(namenode.toElement().text().toUtf8().data())); return info; } // static -bool EffectsList::hasKeyFrames(QDomElement effect) +bool EffectsList::hasKeyFrames(const QDomElement &effect) { QDomNodeList params = effect.elementsByTagName("parameter"); - for (int i = 0; i < params.count(); i++) { + for (int i = 0; i < params.count(); ++i) { QDomElement e = params.item(i).toElement(); if (e.attribute("type") == "keyframe") return true; } @@ -155,10 +175,10 @@ bool EffectsList::hasKeyFrames(QDomElement effect) } // static -bool EffectsList::hasSimpleKeyFrames(QDomElement effect) +bool EffectsList::hasSimpleKeyFrames(const QDomElement &effect) { QDomNodeList params = effect.elementsByTagName("parameter"); - for (int i = 0; i < params.count(); i++) { + for (int i = 0; i < params.count(); ++i) { QDomElement e = params.item(i).toElement(); if (e.attribute("type") == "simplekeyframe") return true; } @@ -166,7 +186,7 @@ bool EffectsList::hasSimpleKeyFrames(QDomElement effect) } // static -bool EffectsList::hasGeometryKeyFrames(QDomElement effect) +bool EffectsList::hasGeometryKeyFrames(const QDomElement &effect) { QDomNodeList params = effect.elementsByTagName("parameter"); for (int i = 0; i < params.count(); ++i) { @@ -177,7 +197,7 @@ bool EffectsList::hasGeometryKeyFrames(QDomElement effect) return false; } -void EffectsList::clone(const EffectsList original) +void EffectsList::clone(const EffectsList &original) { setContent(original.toString()); m_baseElement = documentElement(); @@ -193,20 +213,31 @@ void EffectsList::clearList() void EffectsList::setParameter(QDomElement effect, const QString &name, const QString &value) { QDomNodeList params = effect.elementsByTagName("parameter"); - for (int i = 0; i < params.count(); i++) { + bool found = false; + for (int i = 0; i < params.count(); ++i) { QDomElement e = params.item(i).toElement(); if (e.attribute("name") == name) { e.setAttribute("value", value); + found = true; break; } } + if (!found) { + // create property + QDomDocument doc = effect.ownerDocument(); + QDomElement e = doc.createElement("parameter"); + e.setAttribute("name", name); + QDomText val = doc.createTextNode(value); + e.appendChild(val); + effect.appendChild(e); + } } // static -QString EffectsList::parameter(QDomElement effect, const QString &name) +QString EffectsList::parameter(const QDomElement &effect, const QString &name) { QDomNodeList params = effect.elementsByTagName("parameter"); - for (int i = 0; i < params.count(); i++) { + for (int i = 0; i < params.count(); ++i) { QDomElement e = params.item(i).toElement(); if (e.attribute("name") == name) { return e.attribute("value"); @@ -220,13 +251,24 @@ void EffectsList::setProperty(QDomElement effect, const QString &name, const QSt { QDomNodeList params = effect.elementsByTagName("property"); // Update property if it already exists - for (int i = 0; i < params.count(); i++) { + bool found = false; + for (int i = 0; i < params.count(); ++i) { QDomElement e = params.item(i).toElement(); if (e.attribute("name") == name) { e.firstChild().setNodeValue(value); + found = true; break; } } + if (!found) { + // create property + QDomDocument doc = effect.ownerDocument(); + QDomElement e = doc.createElement("property"); + e.setAttribute("name", name); + QDomText val = doc.createTextNode(value); + e.appendChild(val); + effect.appendChild(e); + } } // static @@ -234,7 +276,7 @@ void EffectsList::renameProperty(QDomElement effect, const QString &oldName, con { QDomNodeList params = effect.elementsByTagName("property"); // Update property if it already exists - for (int i = 0; i < params.count(); i++) { + for (int i = 0; i < params.count(); ++i) { QDomElement e = params.item(i).toElement(); if (e.attribute("name") == oldName) { e.setAttribute("name", newName); @@ -247,7 +289,7 @@ void EffectsList::renameProperty(QDomElement effect, const QString &oldName, con QString EffectsList::property(QDomElement effect, const QString &name) { QDomNodeList params = effect.elementsByTagName("property"); - for (int i = 0; i < params.count(); i++) { + for (int i = 0; i < params.count(); ++i) { QDomElement e = params.item(i).toElement(); if (e.attribute("name") == name) { return e.firstChild().nodeValue(); @@ -260,7 +302,7 @@ QString EffectsList::property(QDomElement effect, const QString &name) void EffectsList::removeProperty(QDomElement effect, const QString &name) { QDomNodeList params = effect.elementsByTagName("property"); - for (int i = 0; i < params.count(); i++) { + for (int i = 0; i < params.count(); ++i) { QDomElement e = params.item(i).toElement(); if (e.attribute("name") == name) { effect.removeChild(params.item(i)); @@ -269,9 +311,29 @@ void EffectsList::removeProperty(QDomElement effect, const QString &name) } } -void EffectsList::append(QDomElement e) +// static +void EffectsList::removeMetaProperties(QDomElement producer) +{ + QDomNodeList params = producer.elementsByTagName("property"); + for (int i = 0; i < params.count(); ++i) { + QDomElement e = params.item(i).toElement(); + if (e.attribute("name").startsWith("meta")) { + producer.removeChild(params.item(i)); + --i; + } + } +} + +QDomElement EffectsList::append(QDomElement e) { - m_baseElement.appendChild(importNode(e, true)); + QDomElement result; + if (!e.isNull()) { + result = m_baseElement.appendChild(importNode(e, true)).toElement(); + if (m_useIndex) { + updateIndexes(m_baseElement.childNodes(), m_baseElement.childNodes().count() - 1); + } + } + return result; } int EffectsList::count() const @@ -281,7 +343,7 @@ int EffectsList::count() const bool EffectsList::isEmpty() const { - return m_baseElement.childNodes().count() == 0; + return !m_baseElement.hasChildNodes(); } const QDomElement EffectsList::at(int ix) const @@ -294,30 +356,68 @@ const QDomElement EffectsList::at(int ix) const void EffectsList::removeAt(int ix) { QDomNodeList effects = m_baseElement.childNodes(); - if (ix < 0 || ix >= effects.count()) return; - m_baseElement.removeChild(effects.at(ix)); + if (ix <= 0 || ix > effects.count()) return; + m_baseElement.removeChild(effects.at(ix - 1)); + if (m_useIndex) updateIndexes(effects, ix - 1); } -QDomElement EffectsList::item(int ix) +QDomElement EffectsList::itemFromIndex(int ix) const { QDomNodeList effects = m_baseElement.childNodes(); - if (ix < 0 || ix >= effects.count()) return QDomElement(); - return effects.at(ix).toElement(); + if (ix <= 0 || ix > effects.count()) return QDomElement(); + return effects.at(ix - 1).toElement(); +} + +QDomElement EffectsList::insert(QDomElement effect) +{ + QDomNodeList effects = m_baseElement.childNodes(); + int ix = effect.attribute("kdenlive_ix").toInt(); + QDomElement result; + if (ix <= 0 || ix > effects.count()) { + ix = effects.count(); + result = m_baseElement.appendChild(importNode(effect, true)).toElement(); + } + else { + QDomElement listeffect = effects.at(ix - 1).toElement(); + result = m_baseElement.insertBefore(importNode(effect, true), listeffect).toElement(); + } + if (m_useIndex && ix > 0) + updateIndexes(effects, ix - 1); + return result; +} + +void EffectsList::updateIndexes(QDomNodeList effects, int startIndex) +{ + for (int i = startIndex; i < effects.count(); ++i) { + QDomElement listeffect = effects.at(i).toElement(); + listeffect.setAttribute(QLatin1String("kdenlive_ix"), i + 1); + } } -void EffectsList::insert(int ix, QDomElement effect) +void EffectsList::enableEffects(const QList & indexes, bool disable) { QDomNodeList effects = m_baseElement.childNodes(); - if (ix < 0) ix = 0; - if (ix >= effects.count()) m_baseElement.appendChild(importNode(effect, true)); - else m_baseElement.insertBefore(importNode(effect, true), effects.at(ix)); + QDomElement effect; + for (int i = 0; i < indexes.count(); ++i) { + effect = effectFromIndex(effects, indexes.at(i)); + effect.setAttribute("disable", (int) disable); + } } -void EffectsList::replace(int ix, QDomElement effect) +QDomElement EffectsList::effectFromIndex(const QDomNodeList &effects, int ix) +{ + if (ix <= 0 || ix > effects.count()) return QDomElement(); + return effects.at(ix - 1).toElement(); +} + +void EffectsList::updateEffect(const QDomElement &effect) { QDomNodeList effects = m_baseElement.childNodes(); - if (ix < 0) ix = 0; - if (ix < effects.count()) m_baseElement.removeChild(effects.at(ix)); - if (ix == effects.count()) m_baseElement.appendChild(importNode(effect, true)); - else m_baseElement.insertBefore(importNode(effect, true), effects.at(ix)); + int ix = effect.attribute("kdenlive_ix").toInt(); + QDomElement current = effectFromIndex(effects, ix); + if (!current.isNull()) { + m_baseElement.insertBefore(importNode(effect, true), current); + m_baseElement.removeChild(current); + } + else m_baseElement.appendChild(importNode(effect, true)); }