]> git.sesse.net Git - kdenlive/blob - src/effectslist.cpp
const'ref. Fix coding style. Minor optimization
[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     }
118     else {
119         QDomElement namenode = effect.firstChildElement("name");
120         info << i18n(namenode.text().toUtf8().data()) << effect.attribute("tag") << effect.attribute("id");
121     }
122     return info;
123 }
124
125 QStringList EffectsList::effectNames()
126 {
127     QStringList list;
128     QDomNodeList effects = m_baseElement.childNodes();
129     for (int i = 0; i < effects.count(); ++i) {
130         QDomElement effect =  effects.at(i).toElement();
131         QDomElement namenode = effect.firstChildElement("name");
132         if (!namenode.isNull()) list.append(i18n(namenode.text().toUtf8().data()));
133     }
134     return list;
135 }
136
137 QString EffectsList::getInfo(const QString & tag, const QString & id) const
138 {
139     QString info;
140     return getEffectInfo(getEffectByTag(tag, id));
141 }
142
143 QString EffectsList::getInfoFromIndex(const int ix) const
144 {
145     QString info;
146     return getEffectInfo(m_baseElement.childNodes().at(ix).toElement());
147 }
148
149 QString EffectsList::getEffectInfo(const QDomElement effect) const
150 {
151     QString info;
152     QDomElement namenode = effect.firstChildElement("description");
153     if (!namenode.isNull())
154         info = i18n(namenode.firstChild().nodeValue().simplified().toUtf8().data());
155
156     namenode = effect.firstChildElement("author");
157     if (!namenode.isNull())
158         info.append("<br /><strong>" + i18n("Author:") + " </strong>" + i18n(namenode.text().toUtf8().data()));
159
160     namenode = effect.firstChildElement("version");
161     if (!namenode.isNull())
162         info.append(QString(" (%1)").arg(namenode.text()));
163
164     return info;
165 }
166
167 // static
168 bool EffectsList::hasKeyFrames(const QDomElement &effect)
169 {
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") == "keyframe") return true;
174     }
175     return false;
176 }
177
178 // static
179 bool EffectsList::hasSimpleKeyFrames(const QDomElement &effect)
180 {
181     QDomNodeList params = effect.elementsByTagName("parameter");
182     for (int i = 0; i < params.count(); ++i) {
183         QDomElement e = params.item(i).toElement();
184         if (e.attribute("type") == "simplekeyframe") return true;
185     }
186     return false;
187 }
188
189 // static
190 bool EffectsList::hasGeometryKeyFrames(const QDomElement &effect)
191 {
192     QDomNodeList params = effect.elementsByTagName("parameter");
193     for (int i = 0; i < params.count(); ++i) {
194         QDomElement param = params.item(i).toElement();
195         if (param.attribute("type") == "geometry" && !param.hasAttribute("fixed"))
196             return true;
197     }
198     return false;
199 }
200
201 void EffectsList::clone(const EffectsList &original)
202 {
203     setContent(original.toString());
204     m_baseElement = documentElement();
205 }
206
207 void EffectsList::clearList()
208 {
209     while (!m_baseElement.firstChild().isNull())
210         m_baseElement.removeChild(m_baseElement.firstChild());
211 }
212
213 // static
214 void EffectsList::setParameter(QDomElement effect, const QString &name, const QString &value)
215 {
216     QDomNodeList params = effect.elementsByTagName("parameter");
217     bool found = false;
218     for (int i = 0; i < params.count(); ++i) {
219         QDomElement e = params.item(i).toElement();
220         if (e.attribute("name") == name) {
221             e.setAttribute("value", value);
222             found = true;
223             break;
224         }
225     }
226     if (!found) {
227         // create property
228         QDomDocument doc = effect.ownerDocument();
229         QDomElement e = doc.createElement("parameter");
230         e.setAttribute("name", name);
231         QDomText val = doc.createTextNode(value);
232         e.appendChild(val);
233         effect.appendChild(e);
234     }
235 }
236
237 // static
238 QString EffectsList::parameter(const QDomElement &effect, const QString &name)
239 {
240     QDomNodeList params = effect.elementsByTagName("parameter");
241     for (int i = 0; i < params.count(); ++i) {
242         QDomElement e = params.item(i).toElement();
243         if (e.attribute("name") == name) {
244             return e.attribute("value");
245         }
246     }
247     return QString();
248 }
249
250 // static
251 void EffectsList::setProperty(QDomElement effect, const QString &name, const QString &value)
252 {
253     QDomNodeList params = effect.elementsByTagName("property");
254     // Update property if it already exists
255     bool found = false;
256     for (int i = 0; i < params.count(); ++i) {
257         QDomElement e = params.item(i).toElement();
258         if (e.attribute("name") == name) {
259             e.firstChild().setNodeValue(value);
260             found = true;
261             break;
262         }
263     }
264     if (!found) {
265         // create property
266         QDomDocument doc = effect.ownerDocument();
267         QDomElement e = doc.createElement("property");
268         e.setAttribute("name", name);
269         QDomText val = doc.createTextNode(value);
270         e.appendChild(val);
271         effect.appendChild(e);
272     }
273 }
274
275 // static
276 void EffectsList::renameProperty(QDomElement effect, const QString &oldName, const QString &newName)
277 {
278     QDomNodeList params = effect.elementsByTagName("property");
279     // Update property if it already exists
280     for (int i = 0; i < params.count(); ++i) {
281         QDomElement e = params.item(i).toElement();
282         if (e.attribute("name") == oldName) {
283             e.setAttribute("name", newName);
284             break;
285         }
286     }
287 }
288
289 // static
290 QString EffectsList::property(QDomElement effect, const QString &name)
291 {
292     QDomNodeList params = effect.elementsByTagName("property");
293     for (int i = 0; i < params.count(); ++i) {
294         QDomElement e = params.item(i).toElement();
295         if (e.attribute("name") == name) {
296             return e.firstChild().nodeValue();
297         }
298     }
299     return QString();
300 }
301
302 // static
303 void EffectsList::removeProperty(QDomElement effect, const QString &name)
304 {
305     QDomNodeList params = effect.elementsByTagName("property");
306     for (int i = 0; i < params.count(); ++i) {
307         QDomElement e = params.item(i).toElement();
308         if (e.attribute("name") == name) {
309             effect.removeChild(params.item(i));
310             break;
311         }
312     }
313 }
314
315 // static
316 void EffectsList::removeMetaProperties(QDomElement producer)
317 {
318     QDomNodeList params = producer.elementsByTagName("property");
319     for (int i = 0; i < params.count(); ++i) {
320         QDomElement e = params.item(i).toElement();
321         if (e.attribute("name").startsWith("meta")) {
322             producer.removeChild(params.item(i));
323             --i;
324         }
325     }
326 }
327
328 QDomElement EffectsList::append(QDomElement e)
329 {
330     QDomElement result;
331     if (!e.isNull()) {
332         result = m_baseElement.appendChild(importNode(e, true)).toElement();
333         if (m_useIndex) {
334             updateIndexes(m_baseElement.childNodes(), m_baseElement.childNodes().count() - 1);
335         }
336     }
337     return result;
338 }
339
340 int EffectsList::count() const
341 {
342     return m_baseElement.childNodes().count();
343 }
344
345 bool EffectsList::isEmpty() const
346 {
347     return !m_baseElement.hasChildNodes();
348 }
349
350 const QDomElement EffectsList::at(int ix) const
351 {
352     QDomNodeList effects = m_baseElement.childNodes();
353     if (ix < 0 || ix >= effects.count()) return QDomElement();
354     return effects.at(ix).toElement();
355 }
356
357 void EffectsList::removeAt(int ix)
358 {
359     QDomNodeList effects = m_baseElement.childNodes();
360     if (ix <= 0 || ix > effects.count()) return;
361     m_baseElement.removeChild(effects.at(ix - 1));
362     if (m_useIndex) updateIndexes(effects, ix - 1);
363 }
364
365 QDomElement EffectsList::itemFromIndex(int ix) const
366 {
367     QDomNodeList effects = m_baseElement.childNodes();
368     if (ix <= 0 || ix > effects.count()) return QDomElement();
369     return effects.at(ix - 1).toElement();
370 }
371
372 QDomElement EffectsList::insert(QDomElement effect)
373 {
374     QDomNodeList effects = m_baseElement.childNodes();
375     int ix = effect.attribute("kdenlive_ix").toInt();
376     QDomElement result;
377     if (ix <= 0 || ix > effects.count()) {
378         ix = effects.count();
379         result = m_baseElement.appendChild(importNode(effect, true)).toElement();
380     }
381     else {
382         QDomElement listeffect =  effects.at(ix - 1).toElement();
383         result = m_baseElement.insertBefore(importNode(effect, true), listeffect).toElement();
384     }
385     if (m_useIndex && ix > 0)
386         updateIndexes(effects, ix - 1);
387     return result;
388 }
389
390 void EffectsList::updateIndexes(QDomNodeList effects, int startIndex)
391 {
392     for (int i = startIndex; i < effects.count(); ++i) {
393         QDomElement listeffect =  effects.at(i).toElement();
394         listeffect.setAttribute(QLatin1String("kdenlive_ix"), i + 1);
395     }
396 }
397
398 void EffectsList::enableEffects(const QList <int>& indexes, bool disable)
399 {
400     QDomNodeList effects = m_baseElement.childNodes();
401     QDomElement effect;
402     for (int i = 0; i < indexes.count(); ++i) {
403         effect =  effectFromIndex(effects, indexes.at(i));
404         effect.setAttribute("disable", (int) disable);
405     }
406 }
407
408 QDomElement EffectsList::effectFromIndex(const QDomNodeList &effects, int ix)
409 {
410     if (ix <= 0 || ix > effects.count()) return QDomElement();
411     return effects.at(ix - 1).toElement();
412 }
413
414 void EffectsList::updateEffect(const QDomElement &effect)
415 {
416     QDomNodeList effects = m_baseElement.childNodes();
417     int ix = effect.attribute("kdenlive_ix").toInt();
418     QDomElement current = effectFromIndex(effects, ix);
419     if (!current.isNull()) {
420         m_baseElement.insertBefore(importNode(effect, true), current);
421         m_baseElement.removeChild(current);
422     }
423     else m_baseElement.appendChild(importNode(effect, true));
424 }