]> git.sesse.net Git - kdenlive/commitdiff
Fix tracks issues (load & save of tracks with hidden audio or video), also fix
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 8 Dec 2008 23:47:11 +0000 (23:47 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 8 Dec 2008 23:47:11 +0000 (23:47 +0000)
http://www.kdenlive.org:80/mantis/view.php?id=272

svn path=/branches/KDE4/; revision=2766

src/customtrackview.cpp
src/kdenlivedoc.cpp
src/kdenlivedoc.h
src/renderer.cpp
src/trackview.cpp
src/trackview.h

index db82ecf5a5352fd411fd434a0615fb0934debf4c..a79d9282bd00d9c5fe1d8dbd9db82d438ce0491f 100644 (file)
@@ -89,10 +89,11 @@ CustomTrackView::CustomTrackView(KdenliveDoc *doc, CustomTrackScene* projectscen
     m_tipPen.setColor(border);
     m_tipPen.setWidth(3);
     setContentsMargins(0, 0, 0, 0);
-    if (projectscene) {
-        m_cursorLine = projectscene->addLine(0, 0, 0, m_tracksHeight);
-        m_cursorLine->setZValue(1000);
-    }
+    const int maxWidth = m_tracksHeight * m_document->tracksCount();
+    setSceneRect(0, 0, sceneRect().width(), maxWidth);
+    verticalScrollBar()->setMaximum(maxWidth);
+    m_cursorLine = projectscene->addLine(0, 0, 0, maxWidth);
+    m_cursorLine->setZValue(1000);
 
     KIcon razorIcon("edit-cut");
     m_razorCursor = QCursor(razorIcon.pixmap(22, 22));
@@ -1427,14 +1428,22 @@ void CustomTrackView::removeTrack(int ix) {
 
 
 void CustomTrackView::slotSwitchTrackAudio(int ix) {
+    for (int i = 0; i < m_document->tracksCount(); i++)
+        kDebug() << "TRK " << i << " STATE: " << m_document->trackInfoAt(i).isMute << m_document->trackInfoAt(i).isBlind;
+
     int tracknumber = m_document->tracksCount() - ix;
-    kDebug() << "/////  MUTING TRK: " << ix << "; PL NUM: " << tracknumber;
+
+    m_document->switchTrackAudio(tracknumber - 1, !m_document->trackInfoAt(tracknumber - 1).isMute);
+    kDebug() << "NEXT TRK STATE: " << m_document->trackInfoAt(tracknumber - 1).isMute << m_document->trackInfoAt(tracknumber - 1).isBlind;
     m_document->renderer()->mltChangeTrackState(tracknumber, m_document->trackInfoAt(tracknumber - 1).isMute, m_document->trackInfoAt(tracknumber - 1).isBlind);
+    m_document->setModified(true);
 }
 
 void CustomTrackView::slotSwitchTrackVideo(int ix) {
     int tracknumber = m_document->tracksCount() - ix;
+    m_document->switchTrackVideo(tracknumber - 1, !m_document->trackInfoAt(tracknumber - 1).isBlind);
     m_document->renderer()->mltChangeTrackState(tracknumber, m_document->trackInfoAt(tracknumber - 1).isMute, m_document->trackInfoAt(tracknumber - 1).isBlind);
+    m_document->setModified(true);
 }
 
 void CustomTrackView::slotRemoveSpace() {
index fca6f5ce0e0ad14b6f93c7e9f450675d4b256077..e239cf7d40f0b4122f65bdc7c3418febb8c6be5f 100644 (file)
@@ -62,26 +62,27 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup
                 m_zoom = infoXml.attribute("zoom", "7").toInt();
                 setProfilePath(profilePath);
                 double version = infoXml.attribute("version").toDouble();
-                if (version < 0.8) convertDocument(version);
-                else {
-                    //delete all mlt producers and instead, use Kdenlive saved producers
-                    /*QDomNodeList prods = m_document.elementsByTagName("producer");
-                    int maxprod = prods.count();
-                    int pos = 0;
-                    for (int i = 0; i < maxprod; i++) {
-                        QDomNode m = prods.at(pos);
-                        QString prodId = m.toElement().attribute("id");
-                        if (prodId == "black" || prodId.startsWith("slowmotion"))
-                            pos++;
-                        else westley.removeChild(m);
-                    }*/
-                    /*prods = m_document.elementsByTagName("kdenlive_producer");
-                    maxprod = prods.count();
-                    for (int i = 0; i < maxprod; i++) {
-                        prods.at(0).toElement().setTagName("producer");
-                        westley.insertBefore(prods.at(0), QDomNode());
-                    }*/
+
+                // Upgrade old Kdenlive documents to current version
+                convertDocument(version);
+
+                // Build tracks
+                QString tracks = infoXml.attribute("tracks");
+                TrackInfo videoTrack;
+                videoTrack.type = VIDEOTRACK;
+                videoTrack.isMute = false;
+                videoTrack.isBlind = false;
+
+                TrackInfo audioTrack;
+                audioTrack.type = AUDIOTRACK;
+                audioTrack.isMute = false;
+                audioTrack.isBlind = true;
+                for (int i = 0; i < tracks.size(); i++) {
+                    if (tracks.data()[i] == 'v') m_tracksList.append(videoTrack);
+                    else m_tracksList.append(audioTrack);
                 }
+
+
                 QDomElement e;
                 QDomNodeList producers = m_document.elementsByTagName("producer");
                 QDomNodeList infoproducers = m_document.elementsByTagName("kdenlive_producer");
@@ -179,6 +180,17 @@ QDomDocument KdenliveDoc::createEmptyDocument(const int videotracks, const int a
     QDomElement westley = doc.createElement("westley");
     doc.appendChild(westley);
 
+
+    TrackInfo videoTrack;
+    videoTrack.type = VIDEOTRACK;
+    videoTrack.isMute = false;
+    videoTrack.isBlind = false;
+
+    TrackInfo audioTrack;
+    audioTrack.type = AUDIOTRACK;
+    audioTrack.isMute = false;
+    audioTrack.isBlind = true;
+
     QDomElement tractor = doc.createElement("tractor");
     tractor.setAttribute("id", "maintractor");
     QDomElement multitrack = doc.createElement("multitrack");
@@ -206,6 +218,7 @@ QDomDocument KdenliveDoc::createEmptyDocument(const int videotracks, const int a
         track.setAttribute("producer", "playlist" + QString::number(i));
         track.setAttribute("hide", "video");
         tractor.appendChild(track);
+        m_tracksList.append(audioTrack);
     }
 
     // create video tracks
@@ -213,6 +226,7 @@ QDomDocument KdenliveDoc::createEmptyDocument(const int videotracks, const int a
         QDomElement track = doc.createElement("track");
         track.setAttribute("producer", "playlist" + QString::number(i));
         tractor.appendChild(track);
+        m_tracksList.append(videoTrack);
     }
 
     for (uint i = 2; i < total ; i++) {
@@ -297,6 +311,24 @@ int KdenliveDoc::zoom() const {
 
 void KdenliveDoc::convertDocument(double version) {
     kDebug() << "Opening a document with version " << 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 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);
+
+        return;
+    }
+
     // Opening a old Kdenlive document
     if (version == 0.7) {
         kDebug() << "Unable to open document with version " << version;
@@ -861,6 +893,7 @@ void KdenliveDoc::setRenderer(Render *render) {
     //qApp->processEvents();
     if (m_render) {
         m_render->setSceneList(m_document.toString(), m_startPos);
+        kDebug() << "// SETTING SCENE LIST:\n\n" << m_document.toString();
         checkProjectClips();
     }
     emit progressInfo(QString(), -1);
@@ -1252,6 +1285,14 @@ TrackInfo KdenliveDoc::trackInfoAt(int ix) const {
     return m_tracksList.at(ix);
 }
 
+void KdenliveDoc::switchTrackAudio(int ix, bool hide) {
+    m_tracksList[ix].isMute = hide; // !m_tracksList.at(ix).isMute;
+}
+
+void KdenliveDoc::switchTrackVideo(int ix, bool hide) {
+    m_tracksList[ix].isBlind = hide; // !m_tracksList.at(ix).isBlind;
+}
+
 void KdenliveDoc::insertTrack(int ix, TrackInfo type) {
     if (ix == -1) m_tracksList << type;
     else m_tracksList.insert(ix, type);
index 156555e077c37b49d228dba6cf55f785abd9a5d3..b034578a91258099ab2ba0ba3d84cbddb9c78ae1 100644 (file)
@@ -112,6 +112,8 @@ Q_OBJECT public:
     const QList <TrackInfo> tracksList() const;
     QPoint getTracksCount() const;
     QString getTracksInfo() const;
+    void switchTrackVideo(int ix, bool hide);
+    void switchTrackAudio(int ix, bool hide);
 
 private:
     KUrl m_url;
index e621b396ebf35e82617ef30ba0c96c8b52327d03..dc8a2ed81031b7038943b0ad4bc7446afe94519a 100644 (file)
@@ -2031,6 +2031,7 @@ void Render::mltChangeTrackState(int track, bool mute, bool blind) {
     Mlt::Service service(m_mltProducer->parent().get_service());
     Mlt::Tractor tractor(service);
     Mlt::Producer trackProducer(tractor.track(track));
+
     if (mute) {
         if (blind) trackProducer.set("hide", 3);
         else trackProducer.set("hide", 2);
@@ -2604,11 +2605,10 @@ void Render::mltSavePlaylist() {
 }
 
 QList <Mlt::Producer *> Render::producersList() {
-    QList <Mlt::Producer *> prods;
+    QList <Mlt::Producer *> prods = QList <Mlt::Producer *> ();
     QStringList ids;
     Mlt::Service service(m_mltProducer->parent().get_service());
     Mlt::Tractor tractor(service);
-    Mlt::Field *field = tractor.field();
 
     int trackNb = tractor.count();
     for (int t = 1; t < trackNb; t++) {
@@ -2639,9 +2639,10 @@ void Render::mltInsertTrack(int ix, bool videoTrack) {
     if (service.type() != tractor_type) kWarning() << "// TRACTOR PROBLEM";
 
     Mlt::Tractor tractor(service);
+
     Mlt::Playlist *playlist = new Mlt::Playlist();
     int ct = tractor.count();
-    kDebug() << "// TRACK INSERT: " << ix << ", MAX: " << ct;
+    // kDebug() << "// TRACK INSERT: " << ix << ", MAX: " << ct;
     int pos = ix;
     if (pos < ct) {
         Mlt::Producer *prodToMove = new Mlt::Producer(tractor.track(pos));
@@ -2654,7 +2655,11 @@ void Render::mltInsertTrack(int ix, bool videoTrack) {
             tractor.set_track(*prodToMove, pos);
             prodToMove = prodToMove2;
         }
-    } else tractor.set_track(*playlist, ix);
+    } else {
+        tractor.set_track(*playlist, ix);
+        Mlt::Producer newProd(tractor.track(ix));
+        if (!videoTrack) newProd.set("hide", 1);
+    }
 
     // Move transitions
     mlt_service serv = m_mltProducer->parent().get_service();
index e6df1cf4cbd02e2af46a7b71e7750f0f8ba5769b..a2036add0b865a9f645d629aaae57879d2c8a0e2 100644 (file)
@@ -120,10 +120,10 @@ void TrackView::parseDocument(QDomDocument doc) {
     int cursorPos = 0;
     m_documentErrors = QString();
     // kDebug() << "//// DOCUMENT: " << doc.toString();
-    QDomNode props = doc.elementsByTagName("properties").item(0);
+    /*QDomNode props = doc.elementsByTagName("properties").item(0);
     if (!props.isNull()) {
         cursorPos = props.toElement().attribute("timeline_position").toInt();
-    }
+    }*/
 
     // parse project tracks
     QDomNodeList tracks = doc.elementsByTagName("track");
@@ -133,7 +133,6 @@ void TrackView::parseDocument(QDomDocument doc) {
     int trackduration = 0;
     QDomElement e;
     QDomElement p;
-    bool videotrack;
 
     int pos = m_projectTracks - 1;
 
@@ -148,8 +147,15 @@ void TrackView::parseDocument(QDomDocument doc) {
                 p = playlists.item(j).toElement();
                 if (p.attribute("id") == playlist_name) break;
             }
-            videotrack = (e.attribute("hide") != "video");
-            trackduration = slotAddProjectTrack(pos, p, videotrack);
+            if (e.attribute("hide") == "video") {
+                m_doc->switchTrackVideo(i - 1, true);
+            } else if (e.attribute("hide") == "audio") {
+                m_doc->switchTrackAudio(i - 1, true);
+            } else if (e.attribute("hide") == "both") {
+                m_doc->switchTrackVideo(i - 1, true);
+                m_doc->switchTrackAudio(i - 1, true);
+            }
+            trackduration = slotAddProjectTrack(pos, p);
             pos--;
             //kDebug() << " PRO DUR: " << trackduration << ", TRACK DUR: " << duration;
             if (trackduration > duration) duration = trackduration;
@@ -347,21 +353,8 @@ void TrackView::slotRebuildTrackHeaders() {
     view->headers_container->adjustSize();
 }
 
-int TrackView::slotAddProjectTrack(int ix, QDomElement xml, bool videotrack) {
-    TrackInfo info;
-
-    if (videotrack) {
-        info.type = VIDEOTRACK;
-        info.isMute = false;
-        info.isBlind = false;
-    } else {
-        info.type = AUDIOTRACK;
-        info.isMute = false;
-        info.isBlind = false;
-    }
-
-    m_trackview->addTrack(info);
 
+int TrackView::slotAddProjectTrack(int ix, QDomElement xml) {
     int trackTop = KdenliveSettings::trackheight() * ix;
     // parse track
     int position = 0;
index 23be1684b9aa54e7ecea5e59a5eb47c642720c52..1e537714e9ba93cc7da4ec39d8876b25c9d15c71 100644 (file)
@@ -83,7 +83,7 @@ private:
     QVBoxLayout *m_tracksAreaLayout;
     QString m_documentErrors;
     void parseDocument(QDomDocument doc);
-    int slotAddProjectTrack(int ix, QDomElement xml, bool videotrack);
+    int slotAddProjectTrack(int ix, QDomElement xml);
 
 private slots:
     void setCursorPos(int pos);