]> git.sesse.net Git - kdenlive/commitdiff
Update file format to version 0.82. It now saves locked track.
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Tue, 10 Feb 2009 11:53:31 +0000 (11:53 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Tue, 10 Feb 2009 11:53:31 +0000 (11:53 +0000)
svn path=/branches/KDE4/; revision=3041

src/kdenlivedoc.cpp
src/kdenlivedoc.h
src/trackview.cpp
src/trackview.h
src/transition.cpp

index 35c81324b04c857e2b3ce95e51adad9f21557553..4f098d2e61e232f62cd7dddfbb61325cdc9b4fd1 100644 (file)
@@ -92,26 +92,26 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup
                     setProfilePath(profilePath);
 
                     // Build tracks
-                    QString xmltracks = infoXml.attribute("tracks");
-                    TrackInfo videoTrack;
-                    videoTrack.type = VIDEOTRACK;
-                    videoTrack.isMute = false;
-                    videoTrack.isBlind = false;
-                    videoTrack.isLocked = false;
-
-                    TrackInfo audioTrack;
-                    audioTrack.type = AUDIOTRACK;
-                    audioTrack.isMute = false;
-                    audioTrack.isBlind = true;
-                    audioTrack.isLocked = false;
-
-                    for (int i = 0; i < xmltracks.size(); i++) {
-                        if (xmltracks.data()[i] == 'v') m_tracksList.append(videoTrack);
-                        else m_tracksList.append(audioTrack);
+                    QDomElement e;
+                    QDomNode tracksinfo = m_document.elementsByTagName("tracksinfo").at(0);
+                    TrackInfo projectTrack;
+                    if (!tracksinfo.isNull()) {
+                        QDomNodeList trackslist = tracksinfo.childNodes();
+                        int maxchild = trackslist.count();
+                        for (int k = 0; k < maxchild; k++) {
+                            e = trackslist.at(k).toElement();
+                            if (e.tagName() == "trackinfo") {
+                                if (e.attribute("type") == "audio") projectTrack.type = AUDIOTRACK;
+                                else projectTrack.type = VIDEOTRACK;
+                                projectTrack.isMute = e.attribute("mute").toInt();
+                                projectTrack.isBlind = e.attribute("blind").toInt();
+                                projectTrack.isLocked = e.attribute("locked").toInt();
+                                m_tracksList.append(projectTrack);
+                            }
+                        }
+                        westley.removeChild(tracksinfo);
                     }
 
-
-                    QDomElement e;
                     QDomElement orig;
                     QDomNodeList producers = m_document.elementsByTagName("producer");
                     QDomNodeList infoproducers = m_document.elementsByTagName("kdenlive_producer");
@@ -377,7 +377,27 @@ int KdenliveDoc::zoom() const {
 bool KdenliveDoc::convertDocument(double version) {
     kDebug() << "Opening a document with version " << version;
 
-    if (version == 0.81) return true;
+    if (version == 0.82) return true;
+
+    if (version == 0.81) {
+        // Add correct tracks info
+        QDomNode kdenlivedoc = m_document.elementsByTagName("kdenlivedoc").at(0);
+        QDomElement infoXml = kdenlivedoc.toElement();
+        QString currentTrackOrder = infoXml.attribute("tracks");
+        QDomElement tracksinfo = m_document.createElement("tracksinfo");
+        for (int i = 0; i < currentTrackOrder.size(); i++) {
+            QDomElement trackinfo = m_document.createElement("trackinfo");
+            if (currentTrackOrder.data()[i] == 'a') {
+                trackinfo.setAttribute("type", "audio");
+                trackinfo.setAttribute("blind", true);
+            } else trackinfo.setAttribute("blind", false);
+            trackinfo.setAttribute("mute", false);
+            trackinfo.setAttribute("locked", false);
+            tracksinfo.appendChild(trackinfo);
+        }
+        infoXml.appendChild(tracksinfo);
+        return true;
+    }
 
     // Opening a old Kdenlive document
     if (version == 0.5 || version == 0.7 || version > 0.81) {
@@ -388,21 +408,25 @@ bool KdenliveDoc::convertDocument(double version) {
 
     if (version == 0.8) {
         // Add the tracks information
-        QString tracksOrder;
         QDomNodeList tracks = m_document.elementsByTagName("track");
         int max = tracks.count();
-        for (int i = 0; i < max; i++) {
-            QDomElement t = tracks.at(i).toElement();
-            if (t.attribute("hide") == "video")
-                tracksOrder.append('a');
-            else if (t.attribute("producer") != "black_track")
-                tracksOrder.append('v');
-        }
+
         QDomNode kdenlivedoc = m_document.elementsByTagName("kdenlivedoc").at(0);
         QDomElement infoXml = kdenlivedoc.toElement();
-        QString currentTrackOrder = infoXml.attribute("tracks");
-        if (currentTrackOrder.isEmpty()) infoXml.setAttribute("tracks", tracksOrder);
+        QDomElement tracksinfo = m_document.createElement("tracksinfo");
 
+        for (int i = 0; i < max; i++) {
+            QDomElement trackinfo = m_document.createElement("trackinfo");
+            QDomElement t = tracks.at(i).toElement();
+            if (t.attribute("hide") == "video") {
+                trackinfo.setAttribute("type", "audio");
+                trackinfo.setAttribute("blind", true);
+            } else trackinfo.setAttribute("blind", false);
+            trackinfo.setAttribute("mute", false);
+            trackinfo.setAttribute("locked", false);
+            if (t.attribute("producer") != "black_track") tracksinfo.appendChild(trackinfo);
+        }
+        infoXml.appendChild(tracksinfo);
         return TRUE;
     }
 
@@ -478,17 +502,6 @@ bool KdenliveDoc::convertDocument(double version) {
     }
     tractor.removeChild(multitrack);
 
-    // write tracks order now that they've been sorted
-    QString tracksOrder;
-    QDomNodeList tracks = m_document.elementsByTagName("track");
-    for (int i = 0; i < tracks.count(); ++i) {
-        QDomElement track = tracks.at(i).toElement();
-        if (track.attribute("hide") == "video")
-            tracksOrder.append('a');
-        else if (track.attribute("producer") != "black_track")
-            tracksOrder.append('v');
-    }
-
     // audio track mixing transitions should not be added to track view, so add required attribute
     QDomNodeList transitions = m_document.elementsByTagName("transition");
     max = transitions.count();
@@ -723,7 +736,24 @@ bool KdenliveDoc::convertDocument(double version) {
     westley0.removeChild(kdenlivedoc);
     QDomElement kdenlivedoc_new = m_document.createElement("kdenlivedoc");
     kdenlivedoc_new.setAttribute("profile", profile);
-    kdenlivedoc_new.setAttribute("tracks", tracksOrder);
+
+    // Add tracks info
+    QDomNodeList tracks = m_document.elementsByTagName("track");
+    max = tracks.count();
+    QDomElement tracksinfo = m_document.createElement("tracksinfo");
+    for (int i = 0; i < max; i++) {
+        QDomElement trackinfo = m_document.createElement("trackinfo");
+        QDomElement t = tracks.at(i).toElement();
+        if (t.attribute("hide") == "video") {
+            trackinfo.setAttribute("type", "audio");
+            trackinfo.setAttribute("blind", true);
+        } else trackinfo.setAttribute("blind", false);
+        trackinfo.setAttribute("mute", false);
+        trackinfo.setAttribute("locked", false);
+        if (t.attribute("producer") != "black_track") tracksinfo.appendChild(trackinfo);
+    }
+    kdenlivedoc_new.appendChild(tracksinfo);
+
     // Add all the producers that has a ressource in westley
     QDomElement westley_element = westley0.toElement();
     if (westley_element.isNull()) {
@@ -892,15 +922,26 @@ bool KdenliveDoc::saveSceneList(const QString &path, QDomDocument sceneList) {
 
     QDomElement addedXml = sceneList.createElement("kdenlivedoc");
     QDomElement markers = sceneList.createElement("markers");
-    addedXml.setAttribute("version", "0.81");
+    addedXml.setAttribute("version", "0.82");
     addedXml.setAttribute("profile", profilePath());
     addedXml.setAttribute("position", m_render->seekPosition().frames(m_fps));
     addedXml.setAttribute("zonein", m_zoneStart);
     addedXml.setAttribute("zoneout", m_zoneEnd);
     addedXml.setAttribute("projectfolder", m_projectFolder.path());
-    addedXml.setAttribute("tracks", getTracksInfo());
     addedXml.setAttribute("zoom", m_zoom);
 
+    // tracks info
+    QDomElement tracksinfo = sceneList.createElement("tracksinfo");
+    foreach(const TrackInfo &info, m_tracksList) {
+        QDomElement trackinfo = sceneList.createElement("trackinfo");
+        if (info.type == AUDIOTRACK) trackinfo.setAttribute("type", "audio");
+        trackinfo.setAttribute("mute", info.isMute);
+        trackinfo.setAttribute("blind", info.isBlind);
+        trackinfo.setAttribute("locked", info.isLocked);
+        tracksinfo.appendChild(trackinfo);
+    }
+    addedXml.appendChild(tracksinfo);
+
     // save project folders
     QMap <QString, QString> folderlist = m_clipManager->documentFolderList();
 
@@ -1469,6 +1510,10 @@ void KdenliveDoc::switchTrackLock(int ix, bool lock) {
     m_tracksList[ix].isLocked = lock;
 }
 
+bool KdenliveDoc::isTrackLocked(int ix) const {
+    return m_tracksList[ix].isLocked;
+}
+
 void KdenliveDoc::switchTrackVideo(int ix, bool hide) {
     m_tracksList[ix].isBlind = hide; // !m_tracksList.at(ix).isBlind;
 }
@@ -1503,15 +1548,6 @@ QPoint KdenliveDoc::getTracksCount() const {
     return QPoint(video, audio);
 }
 
-QString KdenliveDoc::getTracksInfo() const {
-    QString result;
-    foreach(const TrackInfo &info, m_tracksList) {
-        if (info.type == VIDEOTRACK) result.append('v');
-        else result.append('a');
-    }
-    return result;
-}
-
 void KdenliveDoc::cachePixmap(const QString &fileId, const QPixmap &pix) const {
     pix.save(m_projectFolder.path() + "/thumbs/" + fileId + ".png");
 }
index 46d8b6382c21c7fc07b783f24cd71626bdbbcd51..c4adb645e03b07a3e35573aa6c48fad725837b52 100644 (file)
@@ -105,7 +105,6 @@ Q_OBJECT public:
     void setTrackType(int ix, TrackInfo type);
     const QList <TrackInfo> tracksList() const;
     QPoint getTracksCount() const;
-    QString getTracksInfo() const;
     void switchTrackVideo(int ix, bool hide);
     void switchTrackAudio(int ix, bool hide);
     void switchTrackLock(int ix, bool lock);
@@ -116,6 +115,7 @@ Q_OBJECT public:
     QPoint zone() const;
     void setSceneList();
     void updatePreviewSettings();
+    bool isTrackLocked(int ix) const;
 
 private:
     KUrl m_url;
index 0e88dd3c81a636dc94ce44f4bfd1dbc0dd1f74b9..67cf01cd92c2581440b67401367a0787e62b0250 100644 (file)
@@ -162,7 +162,7 @@ void TrackView::parseDocument(QDomDocument doc) {
                 m_doc->switchTrackVideo(i - 1, true);
                 m_doc->switchTrackAudio(i - 1, true);
             }
-            trackduration = slotAddProjectTrack(pos, p);
+            trackduration = slotAddProjectTrack(pos, p, m_doc->isTrackLocked(i - 1));
             pos--;
             //kDebug() << " PRO DUR: " << trackduration << ", TRACK DUR: " << duration;
             if (trackduration > duration) duration = trackduration;
@@ -285,6 +285,9 @@ void TrackView::parseDocument(QDomDocument doc) {
                 Transition *tr = new Transition(transitionInfo, a_track, m_doc->fps(), base, isAutomatic);
                 if (forceTrack) tr->setForcedTrack(true, a_track);
                 m_scene->addItem(tr);
+                if (m_doc->isTrackLocked(b_track - 1)) {
+                    tr->setItemLocked(true);
+                }
             }
         }
     }
@@ -370,7 +373,7 @@ void TrackView::slotRebuildTrackHeaders() {
 }
 
 
-int TrackView::slotAddProjectTrack(int ix, QDomElement xml) {
+int TrackView::slotAddProjectTrack(int ix, QDomElement xml, bool locked) {
     int trackTop = KdenliveSettings::trackheight() * ix;
     // parse track
     int position = 0;
@@ -405,6 +408,7 @@ int TrackView::slotAddProjectTrack(int ix, QDomElement xml) {
                 //kDebug() << "// INSERTING CLIP: " << in << "x" << out << ", track: " << ix << ", ID: " << id << ", SCALE: " << m_scale << ", FPS: " << m_doc->fps();
                 ClipItem *item = new ClipItem(clip, clipinfo, m_doc->fps(), speed, false);
                 m_scene->addItem(item);
+                if (locked) item->setItemLocked(true);
                 clip->addReference();
                 position += (out - in + 1);
 
index 2c9467b00bc3d035432e1ba295ab0505ecf532d4..03a4584fa7717b3e40beb71a42cf356c5e55e8eb 100644 (file)
@@ -84,7 +84,7 @@ private:
     QVBoxLayout *m_tracksAreaLayout;
     QString m_documentErrors;
     void parseDocument(QDomDocument doc);
-    int slotAddProjectTrack(int ix, QDomElement xml);
+    int slotAddProjectTrack(int ix, QDomElement xml, bool locked);
     DocClipBase *getMissingProducer(const QString id) const;
 
 private slots:
index c54ce3bd9f136c8b1f0e70d96f51f887b67c0b15..fce62db6cb54af2470649f1f3e8eba747e98ff34 100644 (file)
@@ -247,6 +247,8 @@ QVariant Transition::itemChange(GraphicsItemChange change, const QVariant &value
 
 
 OPERATIONTYPE Transition::operationMode(QPointF pos) {
+    if (isItemLocked()) return NONE;
+
     const double scale = projectScene()->scale();
     double maximumOffset = 6 / scale;