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