#include <QFile>
#include <qregexp.h>
#include <QDir>
+#include <QIcon>
#include <KDebug>
#include <kglobal.h>
#include <KStandardDirs>
#include "initeffects.h"
+#include "kdenlivesettings.h"
+#include "effectslist.h"
+#include "effectstackedit.h"
+#include "mainwindow.h"
+
+initEffectsThumbnailer::initEffectsThumbnailer() {
+
+}
+
+void initEffectsThumbnailer::prepareThumbnailsCall(const QStringList& list) {
+ m_list = list;
+ start();
+ kDebug() << "done";
+}
+
+void initEffectsThumbnailer::run() {
+ foreach(QString entry, m_list) {
+ kDebug() << entry;
+ if (!entry.isEmpty() && (entry.endsWith(".png") || entry.endsWith(".pgm"))) {
+ if (!EffectStackEdit::iconCache.contains(entry)) {
+ QImage pix(entry);
+ //if (!pix.isNull())
+ EffectStackEdit::iconCache[entry] = pix.scaled(30, 30);
+ kDebug() << "stored";
+ }
+ }
+ }
+}
+
+initEffectsThumbnailer initEffects::thumbnailer;
initEffects::initEffects() {
+
}
initEffects::~initEffects() {
}
//static
-Mlt::Repository *initEffects::parseEffectFiles(EffectsList *audioEffectList, EffectsList *videoEffectList) {
+Mlt::Repository *initEffects::parseEffectFiles() {
QStringList::Iterator more;
QStringList::Iterator it;
QStringList fileList;
delete filters;
delete producers;
+ Mlt::Properties *transitions = repository->transitions();
+ QStringList transitionsItemList;
+ for (int i = 0 ; i < transitions->count() ; i++) {
+ transitionsItemList << transitions->get_name(i);
+ }
+ delete transitions;
+ fillTransitionsList(repository, &MainWindow::transitions, transitionsItemList);
+
KGlobal::dirs()->addResourceType("ladspa_plugin", 0, "lib/ladspa");
KGlobal::dirs()->addResourceDir("ladspa_plugin", "/usr/lib/ladspa");
KGlobal::dirs()->addResourceDir("ladspa_plugin", "/usr/local/lib/ladspa");
fileList = directory.entryList(QDir::Files);
for (it = fileList.begin() ; it != fileList.end() ; ++it) {
itemName = KUrl(*more + *it).path();
- parseEffectFile(audioEffectList, videoEffectList, itemName, filtersList, producersList);
+ parseEffectFile(&MainWindow::audioEffects, &MainWindow::videoEffects, itemName, filtersList, producersList);
// kDebug()<<"// FOUND EFFECT FILE: "<<itemName<<endl;
}
}
foreach(QString filtername, filtersList) {
QDomDocument doc = createDescriptionFromMlt(repository, "filters", filtername);
if (!doc.isNull())
- videoEffectList->append(doc.documentElement());
+ MainWindow::videoEffects.append(doc.documentElement());
}
return repository;
}
QDomDocument ret;
Mlt::Properties *metadata = repository->metadata(filter_type, filtername.toAscii().data());
- kDebug() << filtername;
+ //kDebug() << filtername;
if (metadata && metadata->is_valid()) {
if (metadata->get("title") && metadata->get("identifier")) {
QDomElement eff = ret.createElement("effect");
params.setAttribute("type", "constant");
if (QString(paramdesc.get("type")) == "boolean")
params.setAttribute("type", "bool");
- if (!QString(paramdesc.get("format")).isEmpty()) {
+ if (!QString(paramdesc.get("format")).isEmpty() && QString(paramdesc.get("type")) != "geometry") {
params.setAttribute("type", "complex");
params.setAttribute("format", paramdesc.get("format"));
}
+ if (!QString(paramdesc.get("format")).isEmpty() && QString(paramdesc.get("type")) == "geometry") {
+ params.setAttribute("type", "geometry");
+ //params.setAttribute("format", paramdesc.get("format"));
+ }
if (paramdesc.get("default")) params.setAttribute("default", paramdesc.get("default"));
if (paramdesc.get("value")) {
params.setAttribute("value", paramdesc.get("value"));
ret.appendChild(eff);
}
}
- QString outstr;
- QTextStream str(&outstr);
- ret.save(str, 2);
- kDebug() << outstr;
+ /* QString outstr;
+ QTextStream str(&outstr);
+ ret.save(str, 2);
+ kDebug() << outstr;*/
return ret;
}
+void initEffects::fillTransitionsList(Mlt::Repository * repository, EffectsList* transitions, QStringList names) {
+ foreach(QString name, names) {
+ QDomDocument ret;
+ QDomElement ktrans = ret.createElement("ktransition");
+ ret.appendChild(ktrans);
+ ktrans.setAttribute("tag", name);
+ QDomElement tname = ret.createElement("name");
+ QList<QDomElement> paramList;
+ Mlt::Properties *metadata = repository->metadata(transition_type, name.toAscii().data());
+ //kDebug() << filtername;
+ if (metadata && metadata->is_valid()) {
+ Mlt::Properties param_props((mlt_properties) metadata->get_data("parameters"));
+ for (int j = 0; param_props.is_valid() && j < param_props.count();j++) {
+ QDomElement params = ret.createElement("parameter");
+
+ Mlt::Properties paramdesc((mlt_properties) param_props.get_data(param_props.get_name(j)));
+
+ params.setAttribute("name", paramdesc.get("identifier"));
+
+ if (paramdesc.get("maximum")) params.setAttribute("max", paramdesc.get("maximum"));
+ if (paramdesc.get("minimum")) params.setAttribute("min", paramdesc.get("minimum"));
+ if (QString(paramdesc.get("type")) == "integer") {
+ params.setAttribute("type", "constant");
+ params.setAttribute("factor", "100");
+ }
+ if (QString(paramdesc.get("type")) == "boolean")
+ params.setAttribute("type", "bool");
+ if (!QString(paramdesc.get("format")).isEmpty()) {
+ params.setAttribute("type", "complex");
+ params.setAttribute("format", paramdesc.get("format"));
+
+ }
+ if (paramdesc.get("default")) params.setAttribute("default", paramdesc.get("default"));
+ if (paramdesc.get("value")) {
+ params.setAttribute("value", paramdesc.get("value"));
+ } else {
+ params.setAttribute("value", paramdesc.get("default"));
+ }
+
+
+ QDomElement pname = ret.createElement("name");
+ pname.appendChild(ret.createTextNode(paramdesc.get("title")));
+ params.appendChild(pname);
+
+ ktrans.appendChild(params);
+ }
+
+ ret.appendChild(ktrans);
+ if (metadata->get("title") && metadata->get("identifier")) {
+ ktrans.setAttribute("tag", name);
+ QDomElement tname = ret.createElement("name");
+ tname.appendChild(ret.createTextNode(metadata->get("title")));
+ ktrans.appendChild(tname);
+ }
+
+ //kDebug() << ret.toString();
+ } else {
+
+
+ if (name == "luma") {
+
+ tname.appendChild(ret.createTextNode("Luma"));
+
+ QString path(mlt_environment("MLT_DATA"));
+ path.append("/lumas/").append(mlt_environment("MLT_NORMALISATION"));
+ Mlt::Properties entries;
+ mlt_properties_dir_list(entries.get_properties(), path.toAscii().data(), "*.*", 1);
+ kDebug() << path << entries.count();
+ QString imagefiles;
+ QStringList imagelist;
+ for (int i = 0;i < entries.count();i++) {
+ //if (!imagefiles.isEmpty()) // add empty entry too
+ imagefiles.append(",");
+ imagefiles.append(entries.get(i));
+ imagelist << entries.get(i);
+ }
+ paramList.append(quickParameterFill(ret, "Softness", "softness", "double", "0", "0", "100", "", "100"));
+ paramList.append(quickParameterFill(ret, "Invert", "invert", "bool", "0", "0", "1"));
+ paramList.append(quickParameterFill(ret, "ImageFile", "resource", "list", "", "", "", imagefiles));
+ //thumbnailer.prepareThumbnailsCall(imagelist);
+
+ } else if (name == "composite") {
+ paramList.append(quickParameterFill(ret, "Geometry", "geometry", "geometry", "0;0;100;100;100", "0;0;100;100;100", "0;0;100;100;100"));
+ tname.appendChild(ret.createTextNode("Composite"));
+
+ QDomDocument ret1;
+ QDomElement ktrans1 = ret1.createElement("ktransition");
+ ret1.appendChild(ktrans1);
+ ktrans1.setAttribute("tag", name);
+ QDomElement tname1 = ret.createElement("name");
+ tname1.appendChild(ret1.createTextNode("PIP"));
+
+ } else if (name == "mix") {
+ tname.appendChild(ret.createTextNode("Mix"));
+ } else if (name == "affine") {
+ tname.appendChild(ret.createTextNode("Affine"));
+ paramList.append(quickParameterFill(ret, "Rotate Y", "rotate_y", "double", "0", "0", "360"));
+ paramList.append(quickParameterFill(ret, "Rotate X", "rotate_x", "double", "0", "0", "360"));
+ paramList.append(quickParameterFill(ret, "Rotate Z", "rotate_z", "double", "0", "0", "360"));
+ paramList.append(quickParameterFill(ret, "Fix Rotate Y", "fix_rotate_y", "double", "0", "0", "360"));
+ paramList.append(quickParameterFill(ret, "Fix Rotate X", "fix_rotate_x", "double", "0", "0", "360"));
+ paramList.append(quickParameterFill(ret, "Fix Rotate Z", "fix_rotate_z", "double", "0", "0", "360"));
+ paramList.append(quickParameterFill(ret, "Shear Y", "shear_y", "double", "0", "0", "360"));
+ paramList.append(quickParameterFill(ret, "Shear X", "shear_x", "double", "0", "0", "360"));
+ paramList.append(quickParameterFill(ret, "Shear Z", "shear_z", "double", "0", "0", "360"));
+ paramList.append(quickParameterFill(ret, "Fix Shear Y", "fix_shear_y", "double", "0", "0", "360"));
+ paramList.append(quickParameterFill(ret, "Fix Shear X", "fix_shear_x", "double", "0", "0", "360"));
+ paramList.append(quickParameterFill(ret, "Fix Shear Z", "fix_shear_z", "double", "0", "0", "360"));
+ paramList.append(quickParameterFill(ret, "Mirror", "mirror_off", "bool", "0", "0", "1"));
+ paramList.append(quickParameterFill(ret, "Repeat", "repeat_off", "bool", "0", "0", "1"));
+ paramList.append(quickParameterFill(ret, "Geometry", "geometry", "geometry", "0;0;100;100;100", "0;0;100;100;100", "0;0;100;100;100"));
+ tname.appendChild(ret.createTextNode("Composite"));
+ } else if (name == "region") {
+ tname.appendChild(ret.createTextNode("Region"));
+ }
+
+
+ }
+ paramList.append(quickParameterFill(ret, "Reverse Transition", "reverse", "bool", "1", "0", "1"));
+ ktrans.appendChild(tname);
+
+ foreach(QDomElement e, paramList) {
+ ktrans.appendChild(e);
+ }
+
+
+ transitions->append(ret.documentElement());
+ /*
+
+ <transition fill="1" in="11" a_track="1" out="73" mlt_service="luma" b_track="2" softness="0" resource="/home/marco/Projekte/kdenlive/install_cmake/share/apps/kdenlive/pgm/PAL/square2.pgm" />
+ */
+ }
+}
+QDomElement initEffects::quickParameterFill(QDomDocument & doc, QString name, QString tag, QString type, QString def, QString min, QString max, QString list, QString factor, QString namedesc, QString format) {
+ QDomElement parameter = doc.createElement("parameter");
+ parameter.setAttribute("tag", tag);
+ parameter.setAttribute("default", def);
+ parameter.setAttribute("type", type);
+ parameter.setAttribute("name", tag);
+ parameter.setAttribute("max", max);
+ parameter.setAttribute("min", min);
+ if (!list.isEmpty())
+ parameter.setAttribute("paramlist", list);
+ if (!factor.isEmpty())
+ parameter.setAttribute("factor", factor);
+ if (!namedesc.isEmpty())
+ parameter.setAttribute("namedesc", namedesc);
+ if (!format.isEmpty())
+ parameter.setAttribute("format", format);
+ QDomElement pname = doc.createElement("name");
+ pname.appendChild(doc.createTextNode(name));
+ parameter.appendChild(pname);
+
+ return parameter;
+}