+void initEffects::fillTransitionsList(Mlt::Repository * repository, EffectsList* transitions, QStringList names)
+{
+ // remove transitions that are not implemented
+ int pos = names.indexOf("mix");
+ if (pos != -1) names.takeAt(pos);
+ pos = names.indexOf("region");
+ if (pos != -1) names.takeAt(pos);
+ foreach(const QString &name, names) {
+ QDomDocument ret;
+ QDomElement ktrans = ret.createElement("ktransition");
+ ret.appendChild(ktrans);
+
+ ktrans.setAttribute("tag", name);
+ QDomElement tname = ret.createElement("name");
+
+ QDomElement desc = ret.createElement("description");
+
+ QList<QDomElement> paramList;
+ Mlt::Properties *metadata = repository->metadata(transition_type, name.toAscii().data());
+ //kDebug() << filtername;
+ if (metadata && metadata->is_valid()) {
+
+ desc.appendChild(ret.createTextNode(metadata->get("description")));
+
+ 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);
+ }
+
+ delete metadata;
+ metadata = 0;
+ //kDebug() << ret.toString();
+ } else {
+ // Check for Kdenlive installed luma files, add empty string at start for no luma
+ QStringList imagenamelist = QStringList() << i18n("None");
+ QStringList imagefiles = QStringList() << QString();
+ QStringList filters;
+ filters << "*.pgm" << "*.png";
+
+ QStringList customLumas = KGlobal::dirs()->findDirs("appdata", "lumas");
+ foreach(const QString &folder, customLumas) {
+ QStringList filesnames = QDir(folder).entryList(filters, QDir::Files);
+ foreach(const QString &fname, filesnames) {
+ imagenamelist.append(fname);
+ imagefiles.append(folder + '/' + fname);
+ }
+ }
+
+ // Check for MLT lumas
+ KUrl folder(mlt_environment("MLT_DATA"));
+ folder.addPath("lumas");
+ folder.addPath(mlt_environment("MLT_NORMALISATION"));
+ QDir lumafolder(folder.path());
+ QStringList filesnames = lumafolder.entryList(filters, QDir::Files);
+ foreach(const QString &fname, filesnames) {
+ imagenamelist.append(fname);
+ KUrl path(folder);
+ path.addPath(fname);
+ imagefiles.append(path.toLocalFile());
+ }
+
+ if (name == "luma") {
+ ktrans.setAttribute("id", "luma");
+ tname.appendChild(ret.createTextNode("Wipe"));
+ desc.appendChild(ret.createTextNode("Applies a stationary transition between the current and next frames"));
+
+ 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, "Image File", "resource", "list", "", "", "", imagefiles.join(","), imagenamelist.join(",")));
+ paramList.append(quickParameterFill(ret, "Reverse Transition", "reverse", "bool", "0", "0", "1"));
+ //thumbnailer.prepareThumbnailsCall(imagelist);
+
+ } else if (name == "composite") {
+ desc.appendChild(ret.createTextNode("A key-framable alpha-channel compositor for two frames."));
+ paramList.append(quickParameterFill(ret, "Geometry", "geometry", "geometry", "0%,0%:100%x100%:100", "-500;-500;-500;-500;0", "500;500;500;500;100"));
+ paramList.append(quickParameterFill(ret, "Alpha Channel Operation", "operator", "list", "over", "", "", "over,and,or,xor", "over,and,or,xor"));
+ paramList.append(quickParameterFill(ret, "Align", "aligned", "bool", "1", "0", "1"));
+ paramList.append(quickParameterFill(ret, "Fill", "fill", "bool", "0", "0", "1"));
+ paramList.append(quickParameterFill(ret, "Distort", "distort", "bool", "0", "0", "1"));
+ paramList.append(quickParameterFill(ret, "Wipe File", "luma", "list", "", "", "", imagefiles.join(","), imagenamelist.join(",")));
+ paramList.append(quickParameterFill(ret, "Wipe Softness", "softness", "double", "0", "0", "100", "", "", "100"));
+ paramList.append(quickParameterFill(ret, "Wipe Invert", "luma_invert", "bool", "0", "0", "1"));
+ paramList.append(quickParameterFill(ret, "Force Progressive Rendering", "progressive", "bool", "1", "0", "1"));
+ paramList.append(quickParameterFill(ret, "Force Deinterlace Overlay", "deinterlace", "bool", "0", "0", "1"));
+ tname.appendChild(ret.createTextNode("Composite"));
+ ktrans.setAttribute("id", "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"));
+ }
+
+
+ }
+
+ ktrans.appendChild(tname);
+ ktrans.appendChild(desc);
+
+ 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 slidetrans = "<ktransition tag=\"composite\" id=\"slide\"><name>Slide</name><description>Slide image from one side to another</description><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><parameter tag=\"progressive\" default=\"1\" type=\"bool\" name=\"progressive\" ><name>Force Progressive Rendering</name></parameter><parameter tag=\"deinterlace\" default=\"0\" type=\"bool\" name=\"deinterlace\" ><name>Force Deinterlace Overlay</name></parameter><parameter tag=\"invert\" default=\"0\" type=\"bool\" name=\"invert\" ><name>Invert</name></parameter></ktransition>";
+ QDomDocument ret;
+ ret.setContent(slidetrans);
+ transitions->append(ret.documentElement());
+
+ QString dissolve = "<ktransition tag=\"luma\" id=\"dissolve\"><name>Dissolve</name><description>Fade out one video while fading in the other video</description><parameter tag=\"reverse\" default=\"0\" type=\"bool\" name=\"reverse\" ><name>Reverse</name></parameter></ktransition>";
+ QDomDocument dissolveDoc;
+ dissolveDoc.setContent(dissolve);
+ transitions->append(dissolveDoc.documentElement());