From: Jean-Baptiste Mardelle Date: Tue, 10 Feb 2009 11:53:31 +0000 (+0000) Subject: Update file format to version 0.82. It now saves locked track. X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=13a9ea0bddfc28b81492b3b00008c37b802796f8;p=kdenlive Update file format to version 0.82. It now saves locked track. svn path=/branches/KDE4/; revision=3041 --- diff --git a/src/kdenlivedoc.cpp b/src/kdenlivedoc.cpp index 35c81324..4f098d2e 100644 --- a/src/kdenlivedoc.cpp +++ b/src/kdenlivedoc.cpp @@ -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 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"); } diff --git a/src/kdenlivedoc.h b/src/kdenlivedoc.h index 46d8b638..c4adb645 100644 --- a/src/kdenlivedoc.h +++ b/src/kdenlivedoc.h @@ -105,7 +105,6 @@ Q_OBJECT public: void setTrackType(int ix, TrackInfo type); const QList 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; diff --git a/src/trackview.cpp b/src/trackview.cpp index 0e88dd3c..67cf01cd 100644 --- a/src/trackview.cpp +++ b/src/trackview.cpp @@ -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); diff --git a/src/trackview.h b/src/trackview.h index 2c9467b0..03a4584f 100644 --- a/src/trackview.h +++ b/src/trackview.h @@ -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: diff --git a/src/transition.cpp b/src/transition.cpp index c54ce3bd..fce62db6 100644 --- a/src/transition.cpp +++ b/src/transition.cpp @@ -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;