From 62f7974e0759e81f0855a15055bd066e4d6c5e2f Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Mon, 8 Dec 2008 23:47:11 +0000 Subject: [PATCH] Fix tracks issues (load & save of tracks with hidden audio or video), also fix http://www.kdenlive.org:80/mantis/view.php?id=272 svn path=/branches/KDE4/; revision=2766 --- src/customtrackview.cpp | 19 +++++++--- src/kdenlivedoc.cpp | 79 +++++++++++++++++++++++++++++++---------- src/kdenlivedoc.h | 2 ++ src/renderer.cpp | 13 ++++--- src/trackview.cpp | 31 +++++++--------- src/trackview.h | 2 +- 6 files changed, 98 insertions(+), 48 deletions(-) diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index db82ecf5..a79d9282 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -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() { diff --git a/src/kdenlivedoc.cpp b/src/kdenlivedoc.cpp index fca6f5ce..e239cf7d 100644 --- a/src/kdenlivedoc.cpp +++ b/src/kdenlivedoc.cpp @@ -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); diff --git a/src/kdenlivedoc.h b/src/kdenlivedoc.h index 156555e0..b034578a 100644 --- a/src/kdenlivedoc.h +++ b/src/kdenlivedoc.h @@ -112,6 +112,8 @@ Q_OBJECT public: const QList tracksList() const; QPoint getTracksCount() const; QString getTracksInfo() const; + void switchTrackVideo(int ix, bool hide); + void switchTrackAudio(int ix, bool hide); private: KUrl m_url; diff --git a/src/renderer.cpp b/src/renderer.cpp index e621b396..dc8a2ed8 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -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 Render::producersList() { - QList prods; + QList prods = QList (); 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(); diff --git a/src/trackview.cpp b/src/trackview.cpp index e6df1cf4..a2036add 100644 --- a/src/trackview.cpp +++ b/src/trackview.cpp @@ -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; diff --git a/src/trackview.h b/src/trackview.h index 23be1684..1e537714 100644 --- a/src/trackview.h +++ b/src/trackview.h @@ -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); -- 2.39.2