#include <QFile>
#include <qregexp.h>
#include <QDir>
+#include <QIcon>
#include <KDebug>
#include <kglobal.h>
#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(const 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, EffectsList* transitionsList) {
+Mlt::Repository *initEffects::parseEffectFiles() {
QStringList::Iterator more;
QStringList::Iterator it;
QStringList fileList;
transitionsItemList << transitions->get_name(i);
}
delete transitions;
- fillTransitionsList(repository, transitionsList, transitionsItemList);
+ fillTransitionsList(repository, &MainWindow::transitions, transitionsItemList);
KGlobal::dirs()->addResourceType("ladspa_plugin", 0, "lib/ladspa");
KGlobal::dirs()->addResourceDir("ladspa_plugin", "/usr/lib/ladspa");
QDir directory;
for (more = direc.begin() ; more != direc.end() ; ++more) {
directory = QDir(*more);
- fileList = directory.entryList(QDir::Files);
+ QStringList filter;
+ filter << "*.xml";
+ fileList = directory.entryList(filter, QDir::Files);
for (it = fileList.begin() ; it != fileList.end() ; ++it) {
itemName = KUrl(*more + *it).path();
- parseEffectFile(audioEffectList, videoEffectList, itemName, filtersList, producersList);
+ parseEffectFile(&MainWindow::customEffects, &MainWindow::audioEffects, &MainWindow::videoEffects, itemName, filtersList, producersList);
// kDebug()<<"// FOUND EFFECT FILE: "<<itemName<<endl;
}
}
- foreach(QString filtername, filtersList) {
+ foreach(const QString &filtername, filtersList) {
QDomDocument doc = createDescriptionFromMlt(repository, "filters", filtername);
if (!doc.isNull())
- videoEffectList->append(doc.documentElement());
+ MainWindow::videoEffects.append(doc.documentElement());
}
return repository;
}
// static
-void initEffects::parseEffectFile(EffectsList *audioEffectList, EffectsList *videoEffectList, QString name, QStringList filtersList, QStringList producersList) {
+void initEffects::parseCustomEffectsFile() {
+ MainWindow::customEffects.clear();
+ QString path = KStandardDirs::locateLocal("data", "kdenlive/effects/", true);
+ QDir directory = QDir(path);
+ QStringList filter;
+ filter << "*.xml";
+ const QStringList fileList = directory.entryList(filter, QDir::Files);
+ QString itemName;
+ foreach(const QString filename, fileList) {
+ itemName = KUrl(path + filename).path();
+ QDomDocument doc;
+ QFile file(itemName);
+ doc.setContent(&file, false);
+ file.close();
+ QDomNodeList effects = doc.elementsByTagName("effect");
+ if (effects.count() != 1) {
+ kDebug() << "More than one effect in file " << itemName << ", NOT SUPPORTED YET";
+ } else {
+ QDomElement e = effects.item(0).toElement();
+ MainWindow::customEffects.append(e);
+ }
+ }
+}
+
+// static
+void initEffects::parseEffectFile(EffectsList *customEffectList, EffectsList *audioEffectList, EffectsList *videoEffectList, QString name, QStringList filtersList, QStringList producersList) {
QDomDocument doc;
QFile file(name);
doc.setContent(&file, false);
+ file.close();
QDomElement documentElement = doc.documentElement();
QDomNodeList effects = doc.elementsByTagName("effect");
QDomNode propsnode = documentElement.elementsByTagName("properties").item(0);
if (!propsnode.isNull()) {
QDomElement propselement = propsnode.toElement();
-// id = propselement.attribute("id", QString::null);
-// effectTag = propselement.attribute("tag", QString::null);
- if (propselement.attribute("type", QString::null) == "audio") isAudioEffect = true;
- //else if (propselement.attribute("type", QString::null) == "custom") type = CUSTOMEFFECT;
- //else type = VIDEOEFFECT;
- }
- if (isAudioEffect) audioEffectList->append(documentElement);
- else videoEffectList->append(documentElement);
+ QString type = propselement.attribute("type", QString::null);
+ if (type == "audio") audioEffectList->append(documentElement);
+ else if (type == "custom") customEffectList->append(documentElement);
+ else videoEffectList->append(documentElement);
+ } else videoEffectList->append(documentElement);
}
/*
return ladspaEqualizerEffectString(params);
else {
kDebug() << "++++++++++ ASKING FOR UNKNOWN LADSPA EFFECT: " << ladspaId << endl;
- return("<jackrack></jackrack>");
+ return (char *) "<jackrack></jackrack>";
}
}
if (paramdesc.get("minimum")) params.setAttribute("min", paramdesc.get("minimum"));
if (QString(paramdesc.get("type")) == "integer")
params.setAttribute("type", "constant");
+ if (QString(paramdesc.get("type")) == "float") {
+ params.setAttribute("type", "constant");
+ params.setAttribute("factor", "1000");
+ if (paramdesc.get("maximum")) params.setAttribute("max", QString(paramdesc.get("maximum")).toFloat()*1000.0);
+ if (paramdesc.get("minimum")) params.setAttribute("min", QString(paramdesc.get("minimum")).toFloat()*1000.0);
+ }
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"));
}
void initEffects::fillTransitionsList(Mlt::Repository * repository, EffectsList* transitions, QStringList names) {
- foreach(QString name, names) {
+ foreach(const QString &name, names) {
QDomDocument ret;
QDomElement ktrans = ret.createElement("ktransition");
ret.appendChild(ktrans);
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")) {
//kDebug() << ret.toString();
} else {
-
-
if (name == "luma") {
tname.appendChild(ret.createTextNode("Luma"));
mlt_properties_dir_list(entries.get_properties(), path.toAscii().data(), "*.*", 1);
kDebug() << path << entries.count();
QString imagefiles;
+ //QStringList imagelist;
+ QString imagenamelist;
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);
+ imagenamelist.append(",");
+ imagenamelist.append(KUrl(entries.get(i)).fileName());
}
- paramList.append(quickParameterFill(ret, "Softness", "softness", "double", "0", "0", "100", "", "100"));
+ 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));
-
+ paramList.append(quickParameterFill(ret, "ImageFile", "resource", "list", "", "", "", imagefiles, imagenamelist));
+ //thumbnailer.prepareThumbnailsCall(imagelist);
} else if (name == "composite") {
- paramList.append(quickParameterFill(ret, "Geometry", "geometry", "geometry", "0%,0%:100%x100%", "0%,0%:100%x100%", "0%,0%:100%x100%"));
+ paramList.append(quickParameterFill(ret, "Geometry", "geometry", "geometry", "0;0;100;100;100", "-500;-500;-500;-500;0", "500;500;500;500;100"));
tname.appendChild(ret.createTextNode("Composite"));
QDomDocument ret1;
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%x100%", "0,0:100%x100%", "0,0:100%x100%"));
+ 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"));
+ paramList.append(quickParameterFill(ret, "Reverse Transition", "reverse", "bool", "0", "0", "1"));
ktrans.appendChild(tname);
- foreach(QDomElement e, paramList) {
+ foreach(const QDomElement &e, paramList) {
ktrans.appendChild(e);
}
transitions->append(ret.documentElement());
+ kDebug() << "//// //// TRANSITON XML";
+ kDebug() << ret.toString();
/*
<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" />
*/
}
+
+ QString wipetrans = "<ktransition tag=\"composite\" ><name>Wipe</name><parameter tag=\"geometry\" type=\"wipe\" default=\"-100%,0%:100%x100%;-1=0%,0%:100%x100%\" name=\"geometry\"><name>Direction</name> </parameter><parameter tag=\"aligned\" default=\"0\" type=\"bool\" name=\"aligned\" ><name>Align</name></parameter></ktransition>";
+ QDomDocument ret;
+ ret.setContent(wipetrans);
+ transitions->append(ret.documentElement());
}
-QDomElement initEffects::quickParameterFill(QDomDocument & doc, QString name, QString tag, QString type, QString def, QString min, QString max, QString list, QString factor) {
+
+QDomElement initEffects::quickParameterFill(QDomDocument & doc, QString name, QString tag, QString type, QString def, QString min, QString max, QString list, QString listdisplaynames, QString factor, QString namedesc, QString format) {
QDomElement parameter = doc.createElement("parameter");
parameter.setAttribute("tag", tag);
parameter.setAttribute("default", def);
parameter.setAttribute("min", min);
if (!list.isEmpty())
parameter.setAttribute("paramlist", list);
+ if (!listdisplaynames.isEmpty())
+ parameter.setAttribute("paramlistdisplay", listdisplaynames);
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);