+bool ProjectSettings::useProxy() const
+{
+ return enable_proxy->isChecked();
+}
+
+bool ProjectSettings::generateProxy() const
+{
+ return generate_proxy->isChecked();
+}
+
+bool ProjectSettings::generateImageProxy() const
+{
+ return generate_imageproxy->isChecked();
+}
+
+int ProjectSettings::proxyMinSize() const
+{
+ return proxy_minsize->value();
+}
+
+int ProjectSettings::proxyImageMinSize() const
+{
+ return proxy_imageminsize->value();
+}
+
+QString ProjectSettings::proxyParams() const
+{
+ QString params = proxy_profile->itemData(proxy_profile->currentIndex()).toString();
+ return params.section(';', 0, 0);
+}
+
+QString ProjectSettings::proxyExtension() const
+{
+ QString params = proxy_profile->itemData(proxy_profile->currentIndex()).toString();
+ return params.section(';', 1, 1);
+}
+
+//static
+QStringList ProjectSettings::extractPlaylistUrls(const QString &path)
+{
+ QStringList urls;
+ QDomDocument doc;
+ QFile file(path);
+ if (!file.open(QIODevice::ReadOnly))
+ return urls;
+ if (!doc.setContent(&file)) {
+ file.close();
+ return urls;
+ }
+ file.close();
+ QString root = doc.documentElement().attribute("root");
+ if (!root.isEmpty() && !root.endsWith('/')) root.append('/');
+ QDomNodeList files = doc.elementsByTagName("producer");
+ for (int i = 0; i < files.count(); ++i) {
+ QDomElement e = files.at(i).toElement();
+ QString type = EffectsList::property(e, "mlt_service");
+ if (type != "colour") {
+ QString url = EffectsList::property(e, "resource");
+ if (type == "framebuffer") {
+ url = url.section('?', 0, 0);
+ }
+ if (!url.isEmpty()) {
+ if (!url.startsWith('/')) url.prepend(root);
+ if (url.section('.', 0, -2).endsWith("/.all")) {
+ // slideshow clip, extract image urls
+ urls << extractSlideshowUrls(KUrl(url));
+ } else urls << url;
+ if (url.endsWith(".mlt") || url.endsWith(".kdenlive")) {
+ //TODO: Do something to avoid infinite loops if 2 files reference themselves...
+ urls << extractPlaylistUrls(url);
+ }
+ }
+ }
+ }
+
+ // luma files for transitions
+ files = doc.elementsByTagName("transition");
+ for (int i = 0; i < files.count(); ++i) {
+ QDomElement e = files.at(i).toElement();
+ QString url = EffectsList::property(e, "luma");
+ if (!url.isEmpty()) {
+ if (!url.startsWith('/')) url.prepend(root);
+ urls << url;
+ }
+ }
+
+ return urls;
+}
+
+
+//static
+QStringList ProjectSettings::extractSlideshowUrls(const KUrl &url)
+{
+ QStringList urls;
+ QString path = url.directory(KUrl::AppendTrailingSlash);
+ QString ext = url.path().section('.', -1);
+ QDir dir(path);
+ if (url.path().contains(".all.")) {
+ // this is a mime slideshow, like *.jpeg
+ QStringList filters;
+ filters << "*." + ext;
+ dir.setNameFilters(filters);
+ QStringList result = dir.entryList(QDir::Files);
+ urls.append(path + filters.at(0) + " (" + i18np("1 image found", "%1 images found", result.count()) + ')');
+ } else {
+ // this is a pattern slideshow, like sequence%4d.jpg
+ QString filter = url.fileName();
+ QString ext = filter.section('.', -1);
+ filter = filter.section('%', 0, -2);
+ QString regexp = '^' + filter + "\\d+\\." + ext + '$';
+ QRegExp rx(regexp);
+ int count = 0;
+ QStringList result = dir.entryList(QDir::Files);
+ foreach(const QString & path, result) {
+ if (rx.exactMatch(path)) count++;
+ }
+ urls.append(url.path() + " (" + i18np("1 image found", "%1 images found", count) + ')');
+ }
+ return urls;
+}
+
+void ProjectSettings::slotExportToText()
+{
+ QString savePath = KFileDialog::getSaveFileName(project_folder->url(), "text/plain", this);
+ if (savePath.isEmpty()) return;
+ QString data;
+ data.append(i18n("Project folder: %1", project_folder->url().path()) + '\n');
+ data.append(i18n("Project profile: %1", profiles_list->currentText()) + '\n');
+ data.append(i18n("Total clips: %1 (%2 used in timeline).", files_count->text(), used_count->text()) + "\n\n");
+ for (int i = 0; i < files_list->topLevelItemCount(); ++i) {
+ if (files_list->topLevelItem(i)->childCount() > 0) {
+ data.append('\n' + files_list->topLevelItem(i)->text(0) + ":\n\n");
+ for (int j = 0; j < files_list->topLevelItem(i)->childCount(); j++) {
+ data.append(files_list->topLevelItem(i)->child(j)->text(0) + '\n');
+ }
+ }
+ }
+ KTemporaryFile tmpfile;
+ if (!tmpfile.open()) {
+ kWarning() << "///// CANNOT CREATE TMP FILE in: " << tmpfile.fileName();
+ return;
+ }
+ QFile xmlf(tmpfile.fileName());
+ if (!xmlf.open(QIODevice::WriteOnly))
+ return;
+ xmlf.write(data.toUtf8());
+ if (xmlf.error() != QFile::NoError) {
+ xmlf.close();
+ return;
+ }
+ xmlf.close();
+ KIO::NetAccess::upload(tmpfile.fileName(), savePath, 0);
+}
+
+void ProjectSettings::slotUpdateProxyParams()
+{
+ QString params = proxy_profile->itemData(proxy_profile->currentIndex()).toString();
+ proxyparams->setPlainText(params.section(';', 0, 0));
+}
+
+const QMap <QString, QString> ProjectSettings::metadata() const
+{
+ QMap <QString, QString> metadata;
+ for (int i = 0; i < metadata_list->topLevelItemCount(); ++i)
+ {
+ QTreeWidgetItem *item = metadata_list->topLevelItem(i);
+ if (!item->text(1).simplified().isEmpty()) {
+ // Insert metadata entry
+ QString key = item->data(0, Qt::UserRole).toString();
+ if (key.isEmpty()) key = "meta.attr." + item->text(0).simplified() + ".markup";
+ QString value = item->text(1);
+ metadata.insert(key, value);
+ }
+ }
+ return metadata;
+}
+
+void ProjectSettings::slotAddMetadataField()
+{
+ QTreeWidgetItem *item = new QTreeWidgetItem(metadata_list, QStringList() << i18n("field_name"));
+ item->setFlags(Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsEnabled);
+}
+
+void ProjectSettings::slotDeleteMetadataField()
+{
+ QTreeWidgetItem *item = metadata_list->currentItem();
+ if (item) delete item;
+}
+