for (int i = 0; i < attributes.count(); i++) {
QString name = attributes.item(i).nodeName();
if (name.startsWith("meta.attr.")) {
- m_metadata.insert(name.section('.', 2, 3), attributes.item(i).nodeValue());
+ m_metadata.insert(name.section('.', 2), QStringList() << attributes.item(i).nodeValue());
} else m_properties.insert(name, attributes.item(i).nodeValue());
}
-
+ QDomNodeList metas = xml.elementsByTagName("metaproperty");
+ for (int i = 0; i < metas.count(); i++) {
+ QDomElement e = metas.item(i).toElement();
+ if (!e.isNull()) {
+ m_metadata.insert(e.attribute("name").section('.', 2), QStringList() << e.firstChild().nodeValue() << e.attribute("tool"));
+ }
+ }
if (xml.hasAttribute("cutzones")) {
QStringList cuts = xml.attribute("cutzones").split(';', QString::SkipEmptyParts);
for (int i = 0; i < cuts.count(); i++) {
} else {
int out = xml.attribute("out").toInt();
int in = xml.attribute("in").toInt();
- setDuration(GenTime(out - in, KdenliveSettings::project_fps()));
+ if (out > in) setDuration(GenTime(out - in + 1, KdenliveSettings::project_fps()));
}
if (!m_properties.contains("name")) m_properties.insert("name", url.fileName());
if (hideTemporaryProperties && i.key().startsWith('_')) continue;
if (!i.value().isEmpty()) clip.setAttribute(i.key(), i.value());
}
+
+ QMapIterator<QString, QStringList> j(m_metadata);
+ // Metadata name can have special chars so we cannot pass it as simple attribute
+ while (j.hasNext()) {
+ j.next();
+ if (!j.value().isEmpty()) {
+ QDomElement property = doc.createElement("metaproperty");
+ property.setAttribute("name", "meta.attr." + j.key());
+ QStringList values = j.value();
+ QDomText value = doc.createTextNode(values.at(0));
+ if (values.count() > 1) property.setAttribute("tool", values.at(1));
+ property.appendChild(value);
+ clip.appendChild(property);
+ }
+ }
doc.appendChild(clip);
if (!m_cutZones.isEmpty()) {
QStringList cuts;
if (refreshProducer) slotRefreshProducer();
}
-void DocClipBase::setMetadata(QMap <QString, QString> properties)
+void DocClipBase::setMetadata(QMap <QString, QString> properties, QString tool)
{
QMapIterator<QString, QString> i(properties);
while (i.hasNext()) {
if (i.value().isEmpty() && m_metadata.contains(i.key())) {
m_metadata.remove(i.key());
} else {
- m_metadata.insert(i.key(), i.value());
+ m_metadata.insert(i.key(), QStringList() << i.value() << tool);
}
}
}
-QMap <QString, QString> DocClipBase::metadata() const
+QMap <QString, QStringList> DocClipBase::metadata() const
{
return m_metadata;
}
if (key == "resource") {
getFileHash(value);
if (m_thumbProd) m_thumbProd->updateClipUrl(KUrl(value), m_properties.value("file_hash"));
- } else if (key == "out") setDuration(GenTime(value.toInt(), KdenliveSettings::project_fps()));
//else if (key == "transparency") m_clipProducer->set("transparency", value.toInt());
+ } else if (key == "out") {
+ setDuration(GenTime(value.toInt() + 1, KdenliveSettings::project_fps()));
+ }
else if (key == "colour") {
setProducerProperty("colour", value.toUtf8().data());
} else if (key == "templatetext") {
if (offset == 0) return data;
Mlt::Profile *profile = m_baseTrackProducers.at(0)->profile();
Mlt::Geometry geometry(data.toUtf8().data(), m_properties.value("duration").toInt(), profile->width(), profile->height());
- Mlt::Geometry newgeometry("", m_properties.value("duration").toInt(), profile->width(), profile->height());
+ Mlt::Geometry newgeometry(NULL, m_properties.value("duration").toInt(), profile->width(), profile->height());
Mlt::GeometryItem item;
int pos = 0;
while (!geometry.next_key(&item, pos)) {