1 /***************************************************************************
2 effectslist.cpp - description
4 begin : Sat Aug 10 2002
5 copyright : (C) 2002 by Jason Wood
6 email : jasonwood@blueyonder.co.uk
7 ***************************************************************************/
9 /***************************************************************************
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
16 ***************************************************************************/
19 #include "effectslist.h"
22 #include <KLocalizedString>
25 EffectsList::EffectsList(bool indexRequired) : m_useIndex(indexRequired)
27 m_baseElement = createElement("list");
28 appendChild(m_baseElement);
31 EffectsList::~EffectsList()
35 QDomElement EffectsList::getEffectByName(const QString & name) const
38 QDomNodeList effects = m_baseElement.childNodes();
39 for (int i = 0; i < effects.count(); ++i) {
40 QDomElement effect = effects.at(i).toElement();
41 QDomElement namenode = effect.firstChildElement("name");
42 if (!namenode.isNull()) effectName = i18n(namenode.text().toUtf8().data());
43 if (name == effectName) {
44 QDomNodeList params = effect.elementsByTagName("parameter");
45 for (int i = 0; i < params.count(); ++i) {
46 QDomElement e = params.item(i).toElement();
47 if (!e.hasAttribute("value"))
48 e.setAttribute("value", e.attribute("default"));
58 void EffectsList::initEffect(const QDomElement &effect) const
60 QDomNodeList params = effect.elementsByTagName("parameter");
61 for (int i = 0; i < params.count(); ++i) {
62 QDomElement e = params.item(i).toElement();
63 if (!e.hasAttribute("value"))
64 e.setAttribute("value", e.attribute("default"));
68 QDomElement EffectsList::getEffectByTag(const QString & tag, const QString & id) const
70 QDomNodeList effects = m_baseElement.childNodes();
71 for (int i = 0; i < effects.count(); ++i) {
72 QDomElement effect = effects.at(i).toElement();
74 if (effect.attribute("id") == id) {
75 if (effect.tagName() == "effectgroup") {
77 QDomNodeList subeffects = effect.elementsByTagName("effect");
78 for (int j = 0; j < subeffects.count(); j++) {
79 QDomElement sub = subeffects.at(j).toElement();
83 else initEffect(effect);
86 } else if (!tag.isEmpty()) {
87 if (effect.attribute("tag") == tag) {
96 int EffectsList::hasEffect(const QString & tag, const QString & id) const
98 QDomNodeList effects = m_baseElement.childNodes();
99 for (int i = 0; i < effects.count(); ++i) {
100 QDomElement effect = effects.at(i).toElement();
102 if (effect.attribute("id") == id) return effect.attribute("kdenlive_ix").toInt();
103 } else if (!tag.isEmpty() && effect.attribute("tag") == tag) {
104 return effect.attribute("kdenlive_ix").toInt();
110 QStringList EffectsList::effectIdInfo(const int ix) const
113 QDomElement effect = m_baseElement.childNodes().at(ix).toElement();
114 if (effect.tagName() == "effectgroup") {
115 QString groupName = effect.attribute("name");
116 info << groupName << groupName << effect.attribute("id") << QString::number(Kdenlive::groupEffect);
118 QDomElement namenode = effect.firstChildElement("name");
119 info << i18n(namenode.text().toUtf8().data()) << effect.attribute("tag") << effect.attribute("id");
124 QStringList EffectsList::effectNames()
127 QDomNodeList effects = m_baseElement.childNodes();
128 for (int i = 0; i < effects.count(); ++i) {
129 QDomElement effect = effects.at(i).toElement();
130 QDomElement namenode = effect.firstChildElement("name");
131 if (!namenode.isNull()) list.append(i18n(namenode.text().toUtf8().data()));
136 QString EffectsList::getInfo(const QString & tag, const QString & id) const
139 return getEffectInfo(getEffectByTag(tag, id));
142 QString EffectsList::getInfoFromIndex(const int ix) const
145 return getEffectInfo(m_baseElement.childNodes().at(ix).toElement());
148 QString EffectsList::getEffectInfo(const QDomElement &effect) const
151 QDomElement namenode = effect.firstChildElement("description");
152 if (!namenode.isNull())
153 info = i18n(namenode.firstChild().nodeValue().simplified().toUtf8().data());
155 namenode = effect.firstChildElement("author");
156 if (!namenode.isNull())
157 info.append("<br /><strong>" + i18n("Author:") + " </strong>" + i18n(namenode.text().toUtf8().data()));
159 namenode = effect.firstChildElement("version");
160 if (!namenode.isNull())
161 info.append(QString(" (%1)").arg(namenode.text()));
167 bool EffectsList::hasKeyFrames(const QDomElement &effect)
169 QDomNodeList params = effect.elementsByTagName("parameter");
170 for (int i = 0; i < params.count(); ++i) {
171 QDomElement e = params.item(i).toElement();
172 if (e.attribute("type") == "keyframe") return true;
178 bool EffectsList::hasSimpleKeyFrames(const QDomElement &effect)
180 QDomNodeList params = effect.elementsByTagName("parameter");
181 for (int i = 0; i < params.count(); ++i) {
182 QDomElement e = params.item(i).toElement();
183 if (e.attribute("type") == "simplekeyframe") return true;
189 bool EffectsList::hasGeometryKeyFrames(const QDomElement &effect)
191 QDomNodeList params = effect.elementsByTagName("parameter");
192 for (int i = 0; i < params.count(); ++i) {
193 QDomElement param = params.item(i).toElement();
194 if (param.attribute("type") == "geometry" && !param.hasAttribute("fixed"))
200 void EffectsList::clone(const EffectsList &original)
202 setContent(original.toString());
203 m_baseElement = documentElement();
206 void EffectsList::clearList()
208 while (!m_baseElement.firstChild().isNull())
209 m_baseElement.removeChild(m_baseElement.firstChild());
213 void EffectsList::setParameter(QDomElement effect, const QString &name, const QString &value)
215 QDomNodeList params = effect.elementsByTagName("parameter");
217 for (int i = 0; i < params.count(); ++i) {
218 QDomElement e = params.item(i).toElement();
219 if (e.attribute("name") == name) {
220 e.setAttribute("value", value);
227 QDomDocument doc = effect.ownerDocument();
228 QDomElement e = doc.createElement("parameter");
229 e.setAttribute("name", name);
230 QDomText val = doc.createTextNode(value);
232 effect.appendChild(e);
237 QString EffectsList::parameter(const QDomElement &effect, const QString &name)
239 QDomNodeList params = effect.elementsByTagName("parameter");
240 for (int i = 0; i < params.count(); ++i) {
241 QDomElement e = params.item(i).toElement();
242 if (e.attribute("name") == name) {
243 return e.attribute("value");
250 void EffectsList::setProperty(QDomElement effect, const QString &name, const QString &value)
252 QDomNodeList params = effect.elementsByTagName("property");
253 // Update property if it already exists
255 for (int i = 0; i < params.count(); ++i) {
256 QDomElement e = params.item(i).toElement();
257 if (e.attribute("name") == name) {
258 e.firstChild().setNodeValue(value);
265 QDomDocument doc = effect.ownerDocument();
266 QDomElement e = doc.createElement("property");
267 e.setAttribute("name", name);
268 QDomText val = doc.createTextNode(value);
270 effect.appendChild(e);
275 void EffectsList::renameProperty(QDomElement effect, const QString &oldName, const QString &newName)
277 QDomNodeList params = effect.elementsByTagName("property");
278 // Update property if it already exists
279 for (int i = 0; i < params.count(); ++i) {
280 QDomElement e = params.item(i).toElement();
281 if (e.attribute("name") == oldName) {
282 e.setAttribute("name", newName);
289 QString EffectsList::property(QDomElement effect, const QString &name)
291 QDomNodeList params = effect.elementsByTagName("property");
292 for (int i = 0; i < params.count(); ++i) {
293 QDomElement e = params.item(i).toElement();
294 if (e.attribute("name") == name) {
295 return e.firstChild().nodeValue();
302 void EffectsList::removeProperty(QDomElement effect, const QString &name)
304 QDomNodeList params = effect.elementsByTagName("property");
305 for (int i = 0; i < params.count(); ++i) {
306 QDomElement e = params.item(i).toElement();
307 if (e.attribute("name") == name) {
308 effect.removeChild(params.item(i));
315 void EffectsList::removeMetaProperties(QDomElement producer)
317 QDomNodeList params = producer.elementsByTagName("property");
318 for (int i = 0; i < params.count(); ++i) {
319 QDomElement e = params.item(i).toElement();
320 if (e.attribute("name").startsWith("meta")) {
321 producer.removeChild(params.item(i));
327 QDomElement EffectsList::append(QDomElement e)
331 result = m_baseElement.appendChild(importNode(e, true)).toElement();
333 updateIndexes(m_baseElement.childNodes(), m_baseElement.childNodes().count() - 1);
339 int EffectsList::count() const
341 return m_baseElement.childNodes().count();
344 bool EffectsList::isEmpty() const
346 return !m_baseElement.hasChildNodes();
349 const QDomElement EffectsList::at(int ix) const
351 QDomNodeList effects = m_baseElement.childNodes();
352 if (ix < 0 || ix >= effects.count()) return QDomElement();
353 return effects.at(ix).toElement();
356 void EffectsList::removeAt(int ix)
358 QDomNodeList effects = m_baseElement.childNodes();
359 if (ix <= 0 || ix > effects.count()) return;
360 m_baseElement.removeChild(effects.at(ix - 1));
361 if (m_useIndex) updateIndexes(effects, ix - 1);
364 QDomElement EffectsList::itemFromIndex(int ix) const
366 QDomNodeList effects = m_baseElement.childNodes();
367 if (ix <= 0 || ix > effects.count()) return QDomElement();
368 return effects.at(ix - 1).toElement();
371 QDomElement EffectsList::insert(QDomElement effect)
373 QDomNodeList effects = m_baseElement.childNodes();
374 int ix = effect.attribute("kdenlive_ix").toInt();
376 if (ix <= 0 || ix > effects.count()) {
377 ix = effects.count();
378 result = m_baseElement.appendChild(importNode(effect, true)).toElement();
381 QDomElement listeffect = effects.at(ix - 1).toElement();
382 result = m_baseElement.insertBefore(importNode(effect, true), listeffect).toElement();
384 if (m_useIndex && ix > 0)
385 updateIndexes(effects, ix - 1);
389 void EffectsList::updateIndexes(QDomNodeList effects, int startIndex)
391 for (int i = startIndex; i < effects.count(); ++i) {
392 QDomElement listeffect = effects.at(i).toElement();
393 listeffect.setAttribute(QLatin1String("kdenlive_ix"), i + 1);
397 void EffectsList::enableEffects(const QList <int>& indexes, bool disable)
399 QDomNodeList effects = m_baseElement.childNodes();
401 for (int i = 0; i < indexes.count(); ++i) {
402 effect = effectFromIndex(effects, indexes.at(i));
403 effect.setAttribute("disable", (int) disable);
407 QDomElement EffectsList::effectFromIndex(const QDomNodeList &effects, int ix)
409 if (ix <= 0 || ix > effects.count()) return QDomElement();
410 return effects.at(ix - 1).toElement();
413 void EffectsList::updateEffect(const QDomElement &effect)
415 QDomNodeList effects = m_baseElement.childNodes();
416 int ix = effect.attribute("kdenlive_ix").toInt();
417 QDomElement current = effectFromIndex(effects, ix);
418 if (!current.isNull()) {
419 m_baseElement.insertBefore(importNode(effect, true), current);
420 m_baseElement.removeChild(current);
422 else m_baseElement.appendChild(importNode(effect, true));