#include <QDir>
#include <kmessagebox.h>
-ProjectSettings::ProjectSettings(ProjectList *projectlist, QMap <QString, QString> metadata, QStringList lumas, int videotracks, int audiotracks, const QString projectPath, bool readOnlyTracks, bool savedProject, QWidget * parent) :
+ProjectSettings::ProjectSettings(ProjectList *projectlist, QMap <QString, QString> metadata, const QStringList &lumas, int videotracks, int audiotracks, const QString &projectPath, bool readOnlyTracks, bool savedProject, QWidget * parent) :
QDialog(parent), m_savedProject(savedProject), m_projectList(projectlist), m_lumas(lumas)
{
setupUi(this);
project_folder->setUrl(KUrl(projectPath));
QString currentProf = KdenliveSettings::current_profile();
- for (int i = 0; i < profiles_list->count(); i++) {
+ for (int i = 0; i < profiles_list->count(); ++i) {
if (profiles_list->itemData(i).toString() == currentProf) {
profiles_list->setCurrentIndex(i);
break;
// load proxy profiles
- KConfig conf("encodingprofiles.rc", KConfig::FullConfig, "appdata");
+ KConfig conf("encodingprofiles.rc", KConfig::CascadeConfig, "appdata");
KConfigGroup group(&conf, "proxy");
QMap <QString, QString> values = group.entryMap();
QMapIterator<QString, QString> k(values);
// Metadata list
QTreeWidgetItem *item = new QTreeWidgetItem(metadata_list, QStringList() << i18n("Title"));
item->setData(0, Qt::UserRole, QString("meta.attr.title.markup"));
- if (metadata.contains("meta.attr.title.markup")) item->setText(1, metadata.value("meta.attr.title.markup"));
+ if (metadata.contains("meta.attr.title.markup")) {
+ item->setText(1, metadata.value("meta.attr.title.markup"));
+ metadata.remove("meta.attr.title.markup");
+ }
item->setFlags(Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsEnabled);
item = new QTreeWidgetItem(metadata_list, QStringList() << i18n("Author"));
item->setData(0, Qt::UserRole, QString("meta.attr.author.markup"));
- if (metadata.contains("meta.attr.author.markup")) item->setText(1, metadata.value("meta.attr.author.markup"));
+ if (metadata.contains("meta.attr.author.markup")) {
+ item->setText(1, metadata.value("meta.attr.author.markup"));
+ metadata.remove("meta.attr.author.markup");
+ }
+ else if (metadata.contains("meta.attr.artist.markup")) {
+ item->setText(0, i18n("Artist"));
+ item->setData(0, Qt::UserRole, QString("meta.attr.artist.markup"));
+ item->setText(1, metadata.value("meta.attr.artist.markup"));
+ metadata.remove("meta.attr.artist.markup");
+ }
item->setFlags(Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsEnabled);
item = new QTreeWidgetItem(metadata_list, QStringList() << i18n("Copyright"));
item->setData(0, Qt::UserRole, QString("meta.attr.copyright.markup"));
- if (metadata.contains("meta.attr.copyright.markup")) item->setText(1, metadata.value("meta.attr.copyright.markup"));
+ if (metadata.contains("meta.attr.copyright.markup")) {
+ item->setText(1, metadata.value("meta.attr.copyright.markup"));
+ metadata.remove("meta.attr.copyright.markup");
+ }
item->setFlags(Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsEnabled);
item = new QTreeWidgetItem(metadata_list, QStringList() << i18n("Year"));
item->setData(0, Qt::UserRole, QString("meta.attr.year.markup"));
- if (metadata.contains("meta.attr.year.markup")) item->setText(1, metadata.value("meta.attr.year.markup"));
+ if (metadata.contains("meta.attr.year.markup")) {
+ item->setText(1, metadata.value("meta.attr.year.markup"));
+ metadata.remove("meta.attr.year.markup");
+ }
+ else if (metadata.contains("meta.attr.date.markup")) {
+ item->setText(0, i18n("Date"));
+ item->setData(0, Qt::UserRole, QString("meta.attr.date.markup"));
+ item->setText(1, metadata.value("meta.attr.date.markup"));
+ metadata.remove("meta.attr.date.markup");
+ }
item->setFlags(Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsEnabled);
+ QMap<QString, QString>::const_iterator meta = metadata.constBegin();
+ while (meta != metadata.constEnd()) {
+ item = new QTreeWidgetItem(metadata_list, QStringList() << meta.key().section('.', 2,2));
+ item->setData(0, Qt::UserRole, meta.key());
+ item->setText(1, meta.value());
+ item->setFlags(Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsEnabled);
+ ++meta;
+ }
+
+ connect(add_metadata, SIGNAL(clicked()), this, SLOT(slotAddMetadataField()));
+ connect(delete_metadata, SIGNAL(clicked()), this, SLOT(slotDeleteMetadataField()));
+ add_metadata->setIcon(KIcon("list-add"));
+ delete_metadata->setIcon(KIcon("list-remove"));
+
slotUpdateDisplay();
if (m_projectList != NULL) {
slotUpdateFiles();
connect(delete_proxies, SIGNAL(clicked()), this, SLOT(slotDeleteProxies()));
} else tabWidget->widget(1)->setEnabled(false);
connect(profiles_list, SIGNAL(currentIndexChanged(int)), this, SLOT(slotUpdateDisplay()));
- connect(project_folder, SIGNAL(textChanged(const QString &)), this, SLOT(slotUpdateButton(const QString &)));
+ connect(project_folder, SIGNAL(textChanged(QString)), this, SLOT(slotUpdateButton(QString)));
connect(button_export, SIGNAL(clicked()), this, SLOT(slotExportToText()));
}
{
QStringList toDelete;
QList <DocClipBase*> list = m_projectList->documentClipList();
- for (int i = 0; i < list.count(); i++) {
+ for (int i = 0; i < list.count(); ++i) {
DocClipBase *clip = list.at(i);
if (clip->numReferences() == 0 && clip->clipType() != SLIDESHOW) {
KUrl url = clip->fileURL();
}
// make sure our urls are not used in another clip
- for (int i = 0; i < list.count(); i++) {
+ for (int i = 0; i < list.count(); ++i) {
DocClipBase *clip = list.at(i);
if (clip->numReferences() > 0) {
KUrl url = clip->fileURL();
QTreeWidgetItem *texts = new QTreeWidgetItem(files_list, QStringList() << i18n("Text clips"));
texts->setIcon(0, KIcon("text-plain"));
texts->setExpanded(true);
+ QTreeWidgetItem *playlists = new QTreeWidgetItem(files_list, QStringList() << i18n("Playlist clips"));
+ playlists->setIcon(0, KIcon("video-mlt-playlist"));
+ playlists->setExpanded(true);
QTreeWidgetItem *others = new QTreeWidgetItem(files_list, QStringList() << i18n("Other clips"));
others->setIcon(0, KIcon("unknown"));
others->setExpanded(true);
new QTreeWidgetItem(images, QStringList() << file);
}
- for (int i = 0; i < list.count(); i++) {
+ for (int i = 0; i < list.count(); ++i) {
DocClipBase *clip = list.at(i);
if (clip->clipType() == SLIDESHOW) {
QStringList subfiles = extractSlideshowUrls(clip->fileURL());
case IMAGE:
new QTreeWidgetItem(images, QStringList() << clip->fileURL().path());
break;
+ case PLAYLIST:
+ new QTreeWidgetItem(playlists, QStringList() << clip->fileURL().path());
+ break;
case UNKNOWN:
new QTreeWidgetItem(others, QStringList() << clip->fileURL().path());
break;
}
allFonts.removeDuplicates();
// Hide unused categories
- for (int i = 0; i < files_list->topLevelItemCount(); i++) {
+ for (int i = 0; i < files_list->topLevelItemCount(); ++i) {
if (files_list->topLevelItem(i)->childCount() == 0) {
files_list->topLevelItem(i)->setHidden(true);
}
return project_folder->url();
}
-QPoint ProjectSettings::tracks()
+QPoint ProjectSettings::tracks() const
{
QPoint p;
p.setX(video_tracks->value());
}
//static
-QStringList ProjectSettings::extractPlaylistUrls(QString path)
+QStringList ProjectSettings::extractPlaylistUrls(const QString &path)
{
QStringList urls;
QDomDocument doc;
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++) {
+ 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")) {
// luma files for transitions
files = doc.elementsByTagName("transition");
- for (int i = 0; i < files.count(); i++) {
+ for (int i = 0; i < files.count(); ++i) {
QDomElement e = files.at(i).toElement();
QString url = EffectsList::property(e, "luma");
if (!url.isEmpty()) {
//static
-QStringList ProjectSettings::extractSlideshowUrls(KUrl url)
+QStringList ProjectSettings::extractSlideshowUrls(const KUrl &url)
{
QStringList urls;
QString path = url.directory(KUrl::AppendTrailingSlash);
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()) + ")");
+ 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 + "$";
+ 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) + ")");
+ urls.append(url.path() + " (" + i18np("1 image found", "%1 images found", count) + ')');
}
return urls;
}
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("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++) {
+ 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");
+ 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");
+ data.append(files_list->topLevelItem(i)->child(j)->text(0) + '\n');
}
}
}
return;
}
QFile xmlf(tmpfile.fileName());
- xmlf.open(QIODevice::WriteOnly);
+ if (!xmlf.open(QIODevice::WriteOnly))
+ return;
xmlf.write(data.toUtf8());
if (xmlf.error() != QFile::NoError) {
xmlf.close();
const QMap <QString, QString> ProjectSettings::metadata() const
{
QMap <QString, QString> metadata;
- for (int i = 0; i < metadata_list->topLevelItemCount(); i++)
+ 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;
+}
+
#include "projectsettings.moc"