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"
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"));
57 QDomElement EffectsList::getEffectByTag(const QString & tag, const QString & id) const
59 QDomNodeList effects = m_baseElement.childNodes();
60 for (int i = 0; i < effects.count(); i++) {
61 QDomElement effect = effects.at(i).toElement();
63 if (effect.attribute("id") == id) {
64 QDomNodeList params = effect.elementsByTagName("parameter");
65 for (int i = 0; i < params.count(); i++) {
66 QDomElement e = params.item(i).toElement();
67 if (!e.hasAttribute("value"))
68 e.setAttribute("value", e.attribute("default"));
72 } else if (!tag.isEmpty()) {
73 if (effect.attribute("tag") == tag) {
74 QDomNodeList params = effect.elementsByTagName("parameter");
75 for (int i = 0; i < params.count(); i++) {
76 QDomElement e = params.item(i).toElement();
77 if (!e.hasAttribute("value"))
78 e.setAttribute("value", e.attribute("default"));
87 int EffectsList::hasEffect(const QString & tag, const QString & id) const
89 QDomNodeList effects = m_baseElement.childNodes();
90 for (int i = 0; i < effects.count(); i++) {
91 QDomElement effect = effects.at(i).toElement();
93 if (effect.attribute("id") == id) return effect.attribute("kdenlive_ix").toInt();
94 } else if (!tag.isEmpty() && effect.attribute("tag") == tag) return effect.attribute("kdenlive_ix").toInt();
99 QStringList EffectsList::effectIdInfo(const int ix) const
102 QDomElement effect = m_baseElement.childNodes().at(ix).toElement();
103 if (effect.tagName() == "effectgroup") {
104 QString groupName = effect.attribute("name");
105 info << groupName << groupName << groupName << QString::number(Kdenlive::groupEffect);
108 QDomElement namenode = effect.firstChildElement("name");
109 info << i18n(namenode.text().toUtf8().data()) << effect.attribute("tag") << effect.attribute("id");
114 QStringList EffectsList::effectNames()
117 QDomNodeList effects = m_baseElement.childNodes();
118 for (int i = 0; i < effects.count(); i++) {
119 QDomElement effect = effects.at(i).toElement();
120 QDomElement namenode = effect.firstChildElement("name");
121 if (!namenode.isNull()) list.append(i18n(namenode.text().toUtf8().data()));
126 QString EffectsList::getInfo(const QString & tag, const QString & id) const
129 return getEffectInfo(getEffectByTag(tag, id));
132 QString EffectsList::getInfoFromIndex(const int ix) const
135 return getEffectInfo(m_baseElement.childNodes().at(ix).toElement());
138 QString EffectsList::getEffectInfo(const QDomElement effect) const
141 QDomElement namenode = effect.firstChildElement("description");
142 if (!namenode.isNull())
143 info = i18n(namenode.firstChild().nodeValue().simplified().toUtf8().data());
145 namenode = effect.firstChildElement("author");
146 if (!namenode.isNull())
147 info.append("<br /><strong>" + i18n("Author:") + " </strong>" + i18n(namenode.text().toUtf8().data()));
149 namenode = effect.firstChildElement("version");
150 if (!namenode.isNull())
151 info.append(QString(" (%1)").arg(namenode.text()));
157 bool EffectsList::hasKeyFrames(QDomElement effect)
159 QDomNodeList params = effect.elementsByTagName("parameter");
160 for (int i = 0; i < params.count(); i++) {
161 QDomElement e = params.item(i).toElement();
162 if (e.attribute("type") == "keyframe") return true;
168 bool EffectsList::hasSimpleKeyFrames(QDomElement effect)
170 QDomNodeList params = effect.elementsByTagName("parameter");
171 for (int i = 0; i < params.count(); i++) {
172 QDomElement e = params.item(i).toElement();
173 if (e.attribute("type") == "simplekeyframe") return true;
179 bool EffectsList::hasGeometryKeyFrames(QDomElement effect)
181 QDomNodeList params = effect.elementsByTagName("parameter");
182 for (int i = 0; i < params.count(); ++i) {
183 QDomElement param = params.item(i).toElement();
184 if (param.attribute("type") == "geometry" && !param.hasAttribute("fixed"))
190 void EffectsList::clone(const EffectsList &original)
192 setContent(original.toString());
193 m_baseElement = documentElement();
196 void EffectsList::clearList()
198 while (!m_baseElement.firstChild().isNull())
199 m_baseElement.removeChild(m_baseElement.firstChild());
203 void EffectsList::setParameter(QDomElement effect, const QString &name, const QString &value)
205 QDomNodeList params = effect.elementsByTagName("parameter");
207 for (int i = 0; i < params.count(); i++) {
208 QDomElement e = params.item(i).toElement();
209 if (e.attribute("name") == name) {
210 e.setAttribute("value", value);
217 QDomDocument doc = effect.ownerDocument();
218 QDomElement e = doc.createElement("parameter");
219 e.setAttribute("name", name);
220 QDomText val = doc.createTextNode(value);
222 effect.appendChild(e);
227 QString EffectsList::parameter(QDomElement effect, const QString &name)
229 QDomNodeList params = effect.elementsByTagName("parameter");
230 for (int i = 0; i < params.count(); i++) {
231 QDomElement e = params.item(i).toElement();
232 if (e.attribute("name") == name) {
233 return e.attribute("value");
240 void EffectsList::setProperty(QDomElement effect, const QString &name, const QString &value)
242 QDomNodeList params = effect.elementsByTagName("property");
243 // Update property if it already exists
245 for (int i = 0; i < params.count(); i++) {
246 QDomElement e = params.item(i).toElement();
247 if (e.attribute("name") == name) {
248 e.firstChild().setNodeValue(value);
255 QDomDocument doc = effect.ownerDocument();
256 QDomElement e = doc.createElement("property");
257 e.setAttribute("name", name);
258 QDomText val = doc.createTextNode(value);
260 effect.appendChild(e);
265 void EffectsList::renameProperty(QDomElement effect, const QString &oldName, const QString &newName)
267 QDomNodeList params = effect.elementsByTagName("property");
268 // Update property if it already exists
269 for (int i = 0; i < params.count(); i++) {
270 QDomElement e = params.item(i).toElement();
271 if (e.attribute("name") == oldName) {
272 e.setAttribute("name", newName);
279 QString EffectsList::property(QDomElement effect, const QString &name)
281 QDomNodeList params = effect.elementsByTagName("property");
282 for (int i = 0; i < params.count(); i++) {
283 QDomElement e = params.item(i).toElement();
284 if (e.attribute("name") == name) {
285 return e.firstChild().nodeValue();
292 void EffectsList::removeProperty(QDomElement effect, const QString &name)
294 QDomNodeList params = effect.elementsByTagName("property");
295 for (int i = 0; i < params.count(); i++) {
296 QDomElement e = params.item(i).toElement();
297 if (e.attribute("name") == name) {
298 effect.removeChild(params.item(i));
305 void EffectsList::removeMetaProperties(QDomElement producer)
307 QDomNodeList params = producer.elementsByTagName("property");
308 for (int i = 0; i < params.count(); i++) {
309 QDomElement e = params.item(i).toElement();
310 if (e.attribute("name").startsWith("meta")) {
311 producer.removeChild(params.item(i));
317 QDomElement EffectsList::append(QDomElement e)
321 result = m_baseElement.appendChild(importNode(e, true)).toElement();
323 updateIndexes(m_baseElement.childNodes(), m_baseElement.childNodes().count() - 1);
329 int EffectsList::count() const
331 return m_baseElement.childNodes().count();
334 bool EffectsList::isEmpty() const
336 return !m_baseElement.hasChildNodes();
339 const QDomElement EffectsList::at(int ix) const
341 QDomNodeList effects = m_baseElement.childNodes();
342 if (ix < 0 || ix >= effects.count()) return QDomElement();
343 return effects.at(ix).toElement();
346 void EffectsList::removeAt(int ix)
348 QDomNodeList effects = m_baseElement.childNodes();
349 if (ix <= 0 || ix > effects.count()) return;
350 m_baseElement.removeChild(effects.at(ix - 1));
351 if (m_useIndex) updateIndexes(effects, ix - 1);
354 QDomElement EffectsList::itemFromIndex(int ix) const
356 QDomNodeList effects = m_baseElement.childNodes();
357 if (ix <= 0 || ix > effects.count()) return QDomElement();
358 return effects.at(ix - 1).toElement();
361 QDomElement EffectsList::insert(QDomElement effect)
363 QDomNodeList effects = m_baseElement.childNodes();
364 int ix = effect.attribute("kdenlive_ix").toInt();
366 if (ix <= 0 || ix > effects.count()) {
367 ix = effects.count();
368 result = m_baseElement.appendChild(importNode(effect, true)).toElement();
371 QDomElement listeffect = effects.at(ix - 1).toElement();
372 result = m_baseElement.insertBefore(importNode(effect, true), listeffect).toElement();
374 if (m_useIndex && ix > 0)
375 updateIndexes(effects, ix - 1);
379 void EffectsList::updateIndexes(QDomNodeList effects, int startIndex)
381 for (int i = startIndex; i < effects.count(); i++) {
382 QDomElement listeffect = effects.at(i).toElement();
383 listeffect.setAttribute("kdenlive_ix", i + 1);
387 QDomElement EffectsList::effectFromIndex(QDomNodeList effects, int ix)
389 if (ix <= 0 || ix > effects.count()) return QDomElement();
390 return effects.at(ix - 1).toElement();
393 void EffectsList::updateEffect(QDomElement effect)
395 QDomNodeList effects = m_baseElement.childNodes();
396 int ix = effect.attribute("kdenlive_ix").toInt();
397 QDomElement current = effectFromIndex(effects, ix);
398 if (!current.isNull()) {
399 m_baseElement.insertBefore(importNode(effect, true), current);
400 m_baseElement.removeChild(current);
402 else m_baseElement.appendChild(importNode(effect, true));