]> git.sesse.net Git - kdenlive/blobdiff - src/docclipbase.cpp
const'ref
[kdenlive] / src / docclipbase.cpp
index 5d41cc04cdf22899b8b9b004ea0520c663853ddc..65476bd06f6afa546fca83bd5114d3c9f696d0ec 100644 (file)
@@ -61,16 +61,22 @@ DocClipBase::DocClipBase(ClipManager *clipManager, QDomElement xml, const QStrin
     m_clipType = (CLIPTYPE) type;
     if (m_placeHolder) xml.removeAttribute("placeholder");
     QDomNamedNodeMap attributes = xml.attributes();
-    for (int i = 0; i < attributes.count(); i++) {
+    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++) {
+        for (int i = 0; i < cuts.count(); ++i) {
             QString z = cuts.at(i);
             addCutZone(z.section('-', 0, 0).toInt(), z.section('-', 1, 1).toInt(), z.section('-', 2, 2));
         }
@@ -78,7 +84,7 @@ DocClipBase::DocClipBase(ClipManager *clipManager, QDomElement xml, const QStrin
 
     if (xml.hasAttribute("analysisdata")) {
        QStringList adata = xml.attribute("analysisdata").split('#', QString::SkipEmptyParts);
-       for (int i = 0; i < adata.count(); i++)
+       for (int i = 0; i < adata.count(); ++i)
            m_analysisdata.insert(adata.at(i).section('?', 0, 0), adata.at(i).section('?', 1, 1));
     }
 
@@ -90,7 +96,7 @@ DocClipBase::DocClipBase(ClipManager *clipManager, QDomElement xml, const QStrin
     } 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());
@@ -212,7 +218,7 @@ const QString DocClipBase::getProperty(const QString &prop) const
     return m_properties.value(prop);
 }
 
-void DocClipBase::setDuration(GenTime dur)
+void DocClipBase::setDuration(const GenTime &dur)
 {
     m_duration = dur;
     m_properties.insert("duration", QString::number((int) dur.frames(KdenliveSettings::project_fps())));
@@ -255,10 +261,25 @@ QDomElement DocClipBase::toXML(bool hideTemporaryProperties) const
         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;
-        for (int i = 0; i < m_cutZones.size(); i++) {
+        for (int i = 0; i < m_cutZones.size(); ++i) {
             CutZoneInfo info = m_cutZones.at(i);
             cuts << QString::number(info.zone.x()) + "-" + QString::number(info.zone.y()) + "-" + info.description;
         }
@@ -278,6 +299,57 @@ QDomElement DocClipBase::toXML(bool hideTemporaryProperties) const
     return doc.documentElement();
 }
 
+const QString DocClipBase::shortInfo() const
+{
+  
+    QString info;
+    if (m_clipType == AV || m_clipType == VIDEO || m_clipType == IMAGE || m_clipType == PLAYLIST) {
+       info = m_properties.value("frame_size") + " ";
+       if (m_properties.contains("fps")) {
+           info.append(i18n("%1 fps", m_properties.value("fps").left(5)));
+       }
+       if (!info.simplified().isEmpty()) info.prepend(" - ");
+    }
+    else if (m_clipType == AUDIO) {
+       info = " - " + m_properties.value("frequency") + i18n("Hz");
+    }
+    QString tip = "<b>";
+    switch (m_clipType) {
+    case AUDIO:
+        tip.append(i18n("Audio clip") + "</b>" + info + "<br />" + fileURL().path());
+        break;
+    case VIDEO:
+        tip.append(i18n("Mute video clip") + "</b>" + info + "<br />" + fileURL().path());
+        break;
+    case AV:
+        tip.append(i18n("Video clip") + "</b>" + info + "<br />" + fileURL().path());
+        break;
+    case COLOR:
+        tip.append(i18n("Color clip"));
+        break;
+    case IMAGE:
+        tip.append(i18n("Image clip") + "</b>" + info + "<br />" + fileURL().path());
+        break;
+    case TEXT:
+        if (!fileURL().isEmpty() && getProperty("xmldata").isEmpty()) tip.append(i18n("Template text clip") + "</b><br />" + fileURL().path());
+        else tip.append(i18n("Text clip") + "</b><br />" + fileURL().path());
+        break;
+    case SLIDESHOW:
+        tip.append(i18n("Slideshow clip") + "</b><br />" + fileURL().directory());
+        break;
+    case VIRTUAL:
+        tip.append(i18n("Virtual clip"));
+        break;
+    case PLAYLIST:
+        tip.append(i18n("Playlist clip") + "</b>" + info + "<br />" + fileURL().path());
+        break;
+    default:
+        tip.append(i18n("Unknown clip"));
+        break;
+    }
+    return tip;
+}
+
 
 void DocClipBase::setAudioThumbCreated(bool isDone)
 {
@@ -295,7 +367,6 @@ void DocClipBase::updateAudioThumbnail(const audioByteArray& data)
 QList < GenTime > DocClipBase::snapMarkers() const
 {
     QList < GenTime > markers;
-
     for (int count = 0; count < m_snapMarkers.count(); ++count) {
         markers.append(m_snapMarkers.at(count).time());
     }
@@ -309,7 +380,7 @@ QList < CommentedTime > DocClipBase::commentedSnapMarkers() const
 }
 
 
-void DocClipBase::addSnapMarker(const CommentedTime marker)
+void DocClipBase::addSnapMarker(const CommentedTime &marker)
 {
     QList < CommentedTime >::Iterator it = m_snapMarkers.begin();
     for (it = m_snapMarkers.begin(); it != m_snapMarkers.end(); ++it) {
@@ -326,7 +397,7 @@ void DocClipBase::addSnapMarker(const CommentedTime marker)
     }
 }
 
-void DocClipBase::editSnapMarker(const GenTime & time, QString comment)
+void DocClipBase::editSnapMarker(const GenTime & time, const QString &comment)
 {
     QList < CommentedTime >::Iterator it;
     for (it = m_snapMarkers.begin(); it != m_snapMarkers.end(); ++it) {
@@ -435,13 +506,13 @@ void DocClipBase::deleteProducers()
     
     if (numReferences() > 0 && (!m_baseTrackProducers.isEmpty() || !m_videoTrackProducers.isEmpty() || !m_audioTrackProducers.isEmpty())) {
         // Clip is used in timeline, delay producers deletion
-        for (int i = 0; i < m_baseTrackProducers.count(); i++) {
+        for (int i = 0; i < m_baseTrackProducers.count(); ++i) {
             m_toDeleteProducers.append(m_baseTrackProducers.at(i));
         }
-        for (int i = 0; i < m_videoTrackProducers.count(); i++) {
+        for (int i = 0; i < m_videoTrackProducers.count(); ++i) {
             m_toDeleteProducers.append(m_videoTrackProducers.at(i));
         }
-        for (int i = 0; i < m_audioTrackProducers.count(); i++) {
+        for (int i = 0; i < m_audioTrackProducers.count(); ++i) {
             m_toDeleteProducers.append(m_audioTrackProducers.at(i));
         }
     }
@@ -461,7 +532,7 @@ void DocClipBase::cleanupProducers()
     /*
     int ct = 0;
     kDebug()<<"----------------------------------------------------------------------------------";
-    for (int i = 0; i < m_toDeleteProducers.count(); i++) {
+    for (int i = 0; i < m_toDeleteProducers.count(); ++i) {
         if (m_toDeleteProducers.at(i) != NULL) {
             Mlt::Properties props(m_toDeleteProducers.at(i)->get_properties());
             if (props.ref_count() > 2) {
@@ -593,7 +664,7 @@ Mlt::Producer *DocClipBase::audioProducer(int track)
     }
     if (m_audioTrackProducers.at(track) == NULL) {
         int i;
-        for (i = 0; i < m_audioTrackProducers.count(); i++)
+        for (i = 0; i < m_audioTrackProducers.count(); ++i)
             if (m_audioTrackProducers.at(i) != NULL) break;
         Mlt::Producer *base;
         if (i >= m_audioTrackProducers.count()) {
@@ -646,7 +717,7 @@ Mlt::Producer *DocClipBase::videoProducer(int track)
     }
     if (m_videoTrackProducers.at(track) == NULL) {
         int i;
-        for (i = 0; i < m_videoTrackProducers.count(); i++)
+        for (i = 0; i < m_videoTrackProducers.count(); ++i)
             if (m_videoTrackProducers.at(i) != NULL) break;
         Mlt::Producer *base;
         if (i >= m_videoTrackProducers.count()) {
@@ -683,7 +754,7 @@ Mlt::Producer *DocClipBase::getCloneProducer()
     if (!prod) {
         if (!source) {
             QMutexLocker locker(&m_producerMutex);
-            for (int i = 0; i < m_baseTrackProducers.count(); i++) {
+            for (int i = 0; i < m_baseTrackProducers.count(); ++i) {
                 if (m_baseTrackProducers.at(i) != NULL) {
                     source = m_baseTrackProducers.at(i);
                     break;
@@ -715,7 +786,7 @@ Mlt::Producer *DocClipBase::getProducer(int track)
         if (m_baseTrackProducers.count() == 0) {
             return NULL;
         }
-        for (int i = 0; i < m_baseTrackProducers.count(); i++) {
+        for (int i = 0; i < m_baseTrackProducers.count(); ++i) {
             if (m_baseTrackProducers.at(i) != NULL) {
                 return m_baseTrackProducers.at(i);
             }
@@ -729,7 +800,7 @@ Mlt::Producer *DocClipBase::getProducer(int track)
     }
     if (m_baseTrackProducers.at(track) == NULL) {
         int i;
-        for (i = 0; i < m_baseTrackProducers.count(); i++)
+        for (i = 0; i < m_baseTrackProducers.count(); ++i)
             if (m_baseTrackProducers.at(i) != NULL) break;
 
         if (i >= m_baseTrackProducers.count()) {
@@ -778,7 +849,7 @@ Mlt::Producer *DocClipBase::cloneProducer(Mlt::Producer *source)
 void DocClipBase::setProducerProperty(const char *name, int data)
 {
     QMutexLocker locker(&m_producerMutex);
-    for (int i = 0; i < m_baseTrackProducers.count(); i++) {
+    for (int i = 0; i < m_baseTrackProducers.count(); ++i) {
         if (m_baseTrackProducers.at(i) != NULL)
             m_baseTrackProducers[i]->set(name, data);
     }
@@ -787,7 +858,7 @@ void DocClipBase::setProducerProperty(const char *name, int data)
 void DocClipBase::setProducerProperty(const char *name, double data)
 {
     QMutexLocker locker(&m_producerMutex);
-    for (int i = 0; i < m_baseTrackProducers.count(); i++) {
+    for (int i = 0; i < m_baseTrackProducers.count(); ++i) {
         if (m_baseTrackProducers.at(i) != NULL)
             m_baseTrackProducers[i]->set(name, data);
     }
@@ -796,7 +867,7 @@ void DocClipBase::setProducerProperty(const char *name, double data)
 void DocClipBase::setProducerProperty(const char *name, const char *data)
 {
     QMutexLocker locker(&m_producerMutex);
-    for (int i = 0; i < m_baseTrackProducers.count(); i++) {
+    for (int i = 0; i < m_baseTrackProducers.count(); ++i) {
         if (m_baseTrackProducers.at(i) != NULL)
             m_baseTrackProducers[i]->set(name, data);
     }
@@ -805,7 +876,7 @@ void DocClipBase::setProducerProperty(const char *name, const char *data)
 void DocClipBase::resetProducerProperty(const char *name)
 {
     QMutexLocker locker(&m_producerMutex);
-    for (int i = 0; i < m_baseTrackProducers.count(); i++) {
+    for (int i = 0; i < m_baseTrackProducers.count(); ++i) {
         if (m_baseTrackProducers.at(i) != NULL)
             m_baseTrackProducers[i]->set(name, (const char*) NULL);
     }
@@ -813,7 +884,7 @@ void DocClipBase::resetProducerProperty(const char *name)
 
 const char *DocClipBase::producerProperty(const char *name) const
 {
-    for (int i = 0; i < m_baseTrackProducers.count(); i++) {
+    for (int i = 0; i < m_baseTrackProducers.count(); ++i) {
         if (m_baseTrackProducers.at(i) != NULL) {
             return m_baseTrackProducers.at(i)->get(name);
         }
@@ -977,7 +1048,7 @@ void DocClipBase::setProperties(QMap <QString, QString> properties)
     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()) {
@@ -985,12 +1056,12 @@ void DocClipBase::setMetadata(QMap <QString, QString> properties)
         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;
 }
@@ -1085,8 +1156,10 @@ void DocClipBase::setProperty(const QString &key, const QString &value)
     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") {
@@ -1184,7 +1257,7 @@ void DocClipBase::addCutZone(int in, int out, QString desc)
     CutZoneInfo info;
     info.zone = QPoint(in, out);
     info.description = desc;
-    for (int i = 0; i < m_cutZones.count(); i++)
+    for (int i = 0; i < m_cutZones.count(); ++i)
         if (m_cutZones.at(i).zone == info.zone) {
             return;
         }
@@ -1193,7 +1266,7 @@ void DocClipBase::addCutZone(int in, int out, QString desc)
 
 bool DocClipBase::hasCutZone(QPoint p) const
 {
-    for (int i = 0; i < m_cutZones.count(); i++)
+    for (int i = 0; i < m_cutZones.count(); ++i)
         if (m_cutZones.at(i).zone == p) return true;
     return false;
 }
@@ -1202,10 +1275,10 @@ bool DocClipBase::hasCutZone(QPoint p) const
 void DocClipBase::removeCutZone(int in, int out)
 {
     QPoint p(in, out);
-    for (int i = 0; i < m_cutZones.count(); i++) {
+    for (int i = 0; i < m_cutZones.count(); ++i) {
         if (m_cutZones.at(i).zone == p) {
             m_cutZones.removeAt(i);
-            i--;
+            --i;
         }
     }
 }
@@ -1233,7 +1306,7 @@ bool DocClipBase::hasVideoCodec(const QString &codec) const
 {
     Mlt::Producer *prod = NULL;
     if (m_baseTrackProducers.count() == 0) return false;
-    for (int i = 0; i < m_baseTrackProducers.count(); i++) {
+    for (int i = 0; i < m_baseTrackProducers.count(); ++i) {
         if (m_baseTrackProducers.at(i) != NULL) {
             prod = m_baseTrackProducers.at(i);
             break;
@@ -1251,7 +1324,7 @@ bool DocClipBase::hasAudioCodec(const QString &codec) const
 {
     Mlt::Producer *prod = NULL;
     if (m_baseTrackProducers.count() == 0) return false;
-    for (int i = 0; i < m_baseTrackProducers.count(); i++) {
+    for (int i = 0; i < m_baseTrackProducers.count(); ++i) {
         if (m_baseTrackProducers.at(i) != NULL) {
             prod = m_baseTrackProducers.at(i);
             break;
@@ -1303,7 +1376,7 @@ void DocClipBase::setAnalysisData(const QString &name, const QString &data, int
                int i = 1;
                QString newname = name + " " + QString::number(i);
                while (m_analysisdata.contains(newname)) {
-                   i++;
+                   ++i;
                    newname = name + " " + QString::number(i);
                }
                m_analysisdata.insert(newname, geometryWithOffset(data, offset));
@@ -1318,7 +1391,7 @@ const QString DocClipBase::geometryWithOffset(QString data, int offset)
     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)) {
@@ -1335,3 +1408,5 @@ QMap <QString, QString> DocClipBase::analysisData() const
     return m_analysisdata;
 }
 
+
+#include "docclipbase.moc"