]> git.sesse.net Git - kdenlive/blob - src/effectslist.cpp
1a09ebe32efd75dc6f9ca9e1353f2944932887e3
[kdenlive] / src / effectslist.cpp
1 /***************************************************************************
2                           effectslist.cpp  -  description
3                              -------------------
4     begin                : Sat Aug 10 2002
5     copyright            : (C) 2002 by Jason Wood
6     email                : jasonwood@blueyonder.co.uk
7  ***************************************************************************/
8
9 /***************************************************************************
10  *                                                                         *
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.                                   *
15  *                                                                         *
16  ***************************************************************************/
17
18
19 #include "effectslist.h"
20
21 #include <KDebug>
22 #include <KLocale>
23
24
25 EffectsList::EffectsList(bool indexRequired) : m_useIndex(indexRequired)
26 {
27     m_baseElement = createElement("list");
28     appendChild(m_baseElement);
29 }
30
31 EffectsList::~EffectsList()
32 {
33 }
34
35 QDomElement EffectsList::getEffectByName(const QString & name) const
36 {
37     QString effectName;
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"));
49             }
50             return effect;
51         }
52     }
53
54     return QDomElement();
55 }
56
57
58 void EffectsList::initEffect(const QDomElement &effect) const
59 {
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"));
65     }
66 }
67
68 QDomElement EffectsList::getEffectByTag(const QString & tag, const QString & id) const
69 {
70     QDomNodeList effects = m_baseElement.childNodes();
71     for (int i = 0; i < effects.count(); ++i) {
72         QDomElement effect =  effects.at(i).toElement();
73         if (!id.isEmpty()) {
74             if (effect.attribute("id") == id) {
75                 if (effect.tagName() == "effectgroup") {
76                     // Effect group
77                     QDomNodeList subeffects = effect.elementsByTagName("effect");
78                     for (int j = 0; j < subeffects.count(); j++) {
79                         QDomElement sub = subeffects.at(j).toElement();
80                         initEffect(sub);
81                     }
82                 }
83                 else initEffect(effect);
84                 return effect;
85             }
86         } else if (!tag.isEmpty()) {
87             if (effect.attribute("tag") == tag) {
88                 initEffect(effect);
89                 return effect;
90             }
91         }
92     }
93     return QDomElement();
94 }
95
96 int EffectsList::hasEffect(const QString & tag, const QString & id) const
97 {
98     QDomNodeList effects = m_baseElement.childNodes();
99     for (int i = 0; i < effects.count(); ++i) {
100         QDomElement effect =  effects.at(i).toElement();
101         if (!id.isEmpty()) {
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();
105         }
106     }
107     return -1;
108 }
109
110 QStringList EffectsList::effectIdInfo(const int ix) const
111 {
112     QStringList info;
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);
117     } else {
118         QDomElement namenode = effect.firstChildElement("name");
119         info << i18n(namenode.text().toUtf8().data()) << effect.attribute("tag") << effect.attribute("id");
120     }
121     return info;
122 }
123
124 QStringList EffectsList::effectNames()
125 {
126     QStringList list;
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()));
132     }
133     return list;
134 }
135
136 QString EffectsList::getInfo(const QString & tag, const QString & id) const
137 {
138     QString info;
139     return getEffectInfo(getEffectByTag(tag, id));
140 }
141
142 QString EffectsList::getInfoFromIndex(const int ix) const
143 {
144     QString info;
145     return getEffectInfo(m_baseElement.childNodes().at(ix).toElement());
146 }
147
148 QString EffectsList::getEffectInfo(const QDomElement &effect) const
149 {
150     QString info;
151     QDomElement namenode = effect.firstChildElement("description");
152     if (!namenode.isNull())
153         info = i18n(namenode.firstChild().nodeValue().simplified().toUtf8().data());
154
155     namenode = effect.firstChildElement("author");
156     if (!namenode.isNull())
157         info.append("<br /><strong>" + i18n("Author:") + " </strong>" + i18n(namenode.text().toUtf8().data()));
158
159     namenode = effect.firstChildElement("version");
160     if (!namenode.isNull())
161         info.append(QString(" (%1)").arg(namenode.text()));
162
163     return info;
164 }
165
166 // static
167 bool EffectsList::hasKeyFrames(const QDomElement &effect)
168 {
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;
173     }
174     return false;
175 }
176
177 // static
178 bool EffectsList::hasSimpleKeyFrames(const QDomElement &effect)
179 {
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;
184     }
185     return false;
186 }
187
188 // static
189 bool EffectsList::hasGeometryKeyFrames(const QDomElement &effect)
190 {
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"))
195             return true;
196     }
197     return false;
198 }
199
200 void EffectsList::clone(const EffectsList &original)
201 {
202     setContent(original.toString());
203     m_baseElement = documentElement();
204 }
205
206 void EffectsList::clearList()
207 {
208     while (!m_baseElement.firstChild().isNull())
209         m_baseElement.removeChild(m_baseElement.firstChild());
210 }
211
212 // static
213 void EffectsList::setParameter(QDomElement effect, const QString &name, const QString &value)
214 {
215     QDomNodeList params = effect.elementsByTagName("parameter");
216     bool found = false;
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);
221             found = true;
222             break;
223         }
224     }
225     if (!found) {
226         // create property
227         QDomDocument doc = effect.ownerDocument();
228         QDomElement e = doc.createElement("parameter");
229         e.setAttribute("name", name);
230         QDomText val = doc.createTextNode(value);
231         e.appendChild(val);
232         effect.appendChild(e);
233     }
234 }
235
236 // static
237 QString EffectsList::parameter(const QDomElement &effect, const QString &name)
238 {
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");
244         }
245     }
246     return QString();
247 }
248
249 // static
250 void EffectsList::setProperty(QDomElement effect, const QString &name, const QString &value)
251 {
252     QDomNodeList params = effect.elementsByTagName("property");
253     // Update property if it already exists
254     bool found = false;
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);
259             found = true;
260             break;
261         }
262     }
263     if (!found) {
264         // create property
265         QDomDocument doc = effect.ownerDocument();
266         QDomElement e = doc.createElement("property");
267         e.setAttribute("name", name);
268         QDomText val = doc.createTextNode(value);
269         e.appendChild(val);
270         effect.appendChild(e);
271     }
272 }
273
274 // static
275 void EffectsList::renameProperty(QDomElement effect, const QString &oldName, const QString &newName)
276 {
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);
283             break;
284         }
285     }
286 }
287
288 // static
289 QString EffectsList::property(QDomElement effect, const QString &name)
290 {
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();
296         }
297     }
298     return QString();
299 }
300
301 // static
302 void EffectsList::removeProperty(QDomElement effect, const QString &name)
303 {
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));
309             break;
310         }
311     }
312 }
313
314 // static
315 void EffectsList::removeMetaProperties(QDomElement producer)
316 {
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));
322             --i;
323         }
324     }
325 }
326
327 QDomElement EffectsList::append(QDomElement e)
328 {
329     QDomElement result;
330     if (!e.isNull()) {
331         result = m_baseElement.appendChild(importNode(e, true)).toElement();
332         if (m_useIndex) {
333             updateIndexes(m_baseElement.childNodes(), m_baseElement.childNodes().count() - 1);
334         }
335     }
336     return result;
337 }
338
339 int EffectsList::count() const
340 {
341     return m_baseElement.childNodes().count();
342 }
343
344 bool EffectsList::isEmpty() const
345 {
346     return !m_baseElement.hasChildNodes();
347 }
348
349 const QDomElement EffectsList::at(int ix) const
350 {
351     QDomNodeList effects = m_baseElement.childNodes();
352     if (ix < 0 || ix >= effects.count()) return QDomElement();
353     return effects.at(ix).toElement();
354 }
355
356 void EffectsList::removeAt(int ix)
357 {
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);
362 }
363
364 QDomElement EffectsList::itemFromIndex(int ix) const
365 {
366     QDomNodeList effects = m_baseElement.childNodes();
367     if (ix <= 0 || ix > effects.count()) return QDomElement();
368     return effects.at(ix - 1).toElement();
369 }
370
371 QDomElement EffectsList::insert(QDomElement effect)
372 {
373     QDomNodeList effects = m_baseElement.childNodes();
374     int ix = effect.attribute("kdenlive_ix").toInt();
375     QDomElement result;
376     if (ix <= 0 || ix > effects.count()) {
377         ix = effects.count();
378         result = m_baseElement.appendChild(importNode(effect, true)).toElement();
379     }
380     else {
381         QDomElement listeffect =  effects.at(ix - 1).toElement();
382         result = m_baseElement.insertBefore(importNode(effect, true), listeffect).toElement();
383     }
384     if (m_useIndex && ix > 0)
385         updateIndexes(effects, ix - 1);
386     return result;
387 }
388
389 void EffectsList::updateIndexes(QDomNodeList effects, int startIndex)
390 {
391     for (int i = startIndex; i < effects.count(); ++i) {
392         QDomElement listeffect =  effects.at(i).toElement();
393         listeffect.setAttribute(QLatin1String("kdenlive_ix"), i + 1);
394     }
395 }
396
397 void EffectsList::enableEffects(const QList <int>& indexes, bool disable)
398 {
399     QDomNodeList effects = m_baseElement.childNodes();
400     QDomElement effect;
401     for (int i = 0; i < indexes.count(); ++i) {
402         effect =  effectFromIndex(effects, indexes.at(i));
403         effect.setAttribute("disable", (int) disable);
404     }
405 }
406
407 QDomElement EffectsList::effectFromIndex(const QDomNodeList &effects, int ix)
408 {
409     if (ix <= 0 || ix > effects.count()) return QDomElement();
410     return effects.at(ix - 1).toElement();
411 }
412
413 void EffectsList::updateEffect(const QDomElement &effect)
414 {
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);
421     }
422     else m_baseElement.appendChild(importNode(effect, true));
423 }